NoClickError

The error family.

The server renders every refusal as {"error": {"type", "message", "next_step", ...details}}; type picks the class here (the same names and HTTP statuses the API uses). Extra keys land in details and read as attributes: err.connect_url, err.existing_id.

class NoClickError extends Error

Base class for every NoClick platform error.

Attributes
typestring
httpStatusnumber | null
nextStepstring | null
detailsJsonObject
statusnumber | null
requestIdstring | null

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

Error types

ClasstypeHTTPWhen
Offer

One way past a refusal for money: a link a person opens to pay, no sign-in needed.

InvalidRequestinvalid_request400

The request is malformed or a value is out of range; field names the argument when there is one.

Unauthenticatedunauthenticated401

No key was sent, or the key or session token isn't valid (revoked, expired, or not a platform key).

PaymentRequiredpayment_required402

Your account can't pay for this: balance_usd is what's left and required_usd what the call needs, in US dollars.

PlanRequiredplan_required402

The account's plan doesn't allow this: plans cap some resources.

PriceExceededprice_exceeded402

It would cost more than the ceiling you set (max_monthly_usd on PhoneNumber.buy).

ApprovalRequiredapproval_required402

Policy wants a person to approve this call first.

SpendCapExceededspend_cap_exceeded402

A monthly spend cap (scope: key, user, agent, ...) is used up.

SpendingPausedspending_paused402

You paused this user's spending (user.pause_spending()), so nothing that costs money runs for them until user.resume_spending().

PermissionDeniedpermission_denied403

The key or session lacks the scope, or the user it acts for can't do this (another user's object, a suspended user).

PolicyDeniedpolicy_denied403

Your policy (noclick.Policy) forbids this tool.

NotFoundnot_found404

Nothing by that id or name in this account, or owned by the user the call acts for.

Conflictconflict409

It already exists (existing_id names it), or another call holds it, like a conversation mid-turn.

NotAvailablenot_available409

Not available here: a feature the account doesn't have yet (phone numbers), or a sandbox that has stopped.

ActionRequiredaction_required409

Something has to be set up first, such as an agent answering a number before it can place calls.

NeedsConnectionneeds_connection424

The connection has no account connected yet; send the person connect_url.

CredentialDisconnectedcredential_disconnected424

The connection's account was revoked or stopped working; send the person connect_url to reconnect it (same name).

QuotaExceededquota_exceeded429

An account limit is reached (live sandboxes, background commands, inboxes); retrying later won't help.

RateLimitedrate_limited429

Too many requests, or a send cap reached (emails, inbox replies); retry_after says when to try again.

UpstreamErrorupstream_error502

A service NoClick relays to refused the call or failed.

RequestTimeoutrequest_timeout504

The work outlasted what one request may wait (about 90 seconds).

ServerErrorserver_error

A 5xx the server could not describe as a platform error.

APIConnectionErrorconnection_error

The API could not be reached, even after retries.

OperationFailedoperation_failed

An operation finished failed without a more specific error type.

OperationCanceledoperation_canceled

The operation was canceled before it finished.

Expiredexpired410

A request or operation expired before anyone acted on it.

OperationTimeoutoperation_timeout

Operation.wait(timeout=...) ran out before the operation finished.

WebhookSignatureErrorwebhook_signature_invalid

A webhook delivery's NoClick-Signature doesn't match its body, or its timestamp is too old.

OperationExpired

Another name for Expired.

Offer

interface Offer

One way past a refusal for money: a link a person opens to pay, no sign-in needed. Hand them url.

Attributes
kindstring

plan (a plan that includes what was refused), funds (an amount added to the balance) or topup (a monthly add-on, on the older plans).

labelstring

What it buys, in words: the Plus plan, billed monthly.

priceUsdnumber
urlstring
expiresAtDate | null

When the link stops working; refused again before then, the same link comes back.

operationOperation<JsonObject>

The payment operation the link settles: wait() resolves once it's paid, and rejects with OperationExpired if it never is.

InvalidRequest

class InvalidRequest extends NoClickError

The request is malformed or a value is out of range; field names the argument when there is one.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

Unauthenticated

class Unauthenticated extends NoClickError

No key was sent, or the key or session token isn't valid (revoked, expired, or not a platform key).

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

PaymentRequired

class PaymentRequired extends NoClickError

Your account can't pay for this: balanceUsd is what's left and requiredUsd what the call needs, in US dollars. offers are links a person opens to add funds or change plan; retry once one is paid. A model provider's account out of funds (your own key) throws it too, with details.reason "provider_out_of_funds". A deployed app's paid call names the app in details.project and details.project_id (invite-only beta).

if (err instanceof PaymentRequired) for (const offer of err.offers) console.log(offer.label, offer.url);
Attributes
balanceUsdnumber | undefined
requiredUsdnumber | undefined

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

PlanRequired

class PlanRequired extends NoClickError

The account's plan doesn't allow this: plans cap some resources. offers are links to the plans that do.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

PriceExceeded

class PriceExceeded extends NoClickError

It would cost more than the ceiling you set (max_monthly_usd on PhoneNumber.buy).

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

ApprovalRequired

class ApprovalRequired extends NoClickError

A policy wants a person to approve this call first. The approval request is already out; wait on it, then retry with approvalId:

if (err instanceof ApprovalRequired && (await err.operation?.wait()))
  await gmail.run("send_email_message", args, { approvalId: err.approvalId });
Attributes
approvalIdstring | undefined
approveUrlstring | undefined

The page where the approver answers; set only when the approver is the one the call is made for.

operationHumanRequest<boolean> | null

The approval as an operation: wait() resolves to true once approved. null when the call's credential can't read it: a user's session, or a key pinned to them, for a call someone else approves.

operationIdTypeScript only

operationId: string | undefined

The approval's operation id (Operation.fromId(id).wait() resolves to a boolean).

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

SpendCapExceeded

class SpendCapExceeded extends NoClickError

A monthly spend cap (scope: key, user, agent, ...) is used up. A deployed app's paid call names the app in project and project_id, with scope project when it's the app's own budget_usd_per_month (invite-only beta).

Attributes
capnumber | undefined
spentnumber | undefined
scopestring | undefined

Which cap tripped: key, user, agent, project (a deployed app's own budget), ... An app's paid call names the app in details.project and details.project_id (invite-only beta).

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

SpendingPaused

class SpendingPaused extends NoClickError

You paused this user's spending (user.pauseSpending()), so nothing that costs money runs for them until user.resumeSpending(). message and nextStep are for you; userMessage and action are what you asked NoClick to tell the user, to show them as they are; since is when you paused them.

Attributes
userMessagestring | undefined
action{ label: string; url: string } | undefined
sinceDate | undefined

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

PermissionDenied

class PermissionDenied extends NoClickError

The key or session lacks the scope, or the user it acts for can't do this (another user's object, a suspended user).

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

PolicyDenied

class PolicyDenied extends NoClickError

Your policy (noclick.Policy) forbids this tool.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

NotFound

class NotFound extends NoClickError

Nothing by that id or name in this account, or owned by the user the call acts for.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

Conflict

class Conflict extends NoClickError

It already exists (existing_id names it), or another call holds it, like a conversation mid-turn.

Attributes
existingIdstring | undefined

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

NotAvailable

class NotAvailable extends NoClickError

Not available here: a feature the account doesn't have yet (phone numbers), or a sandbox that has stopped.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

ActionRequired

class ActionRequired extends NoClickError

Something has to be set up first, such as an agent answering a number before it can place calls.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

NeedsConnection

class NeedsConnection extends NoClickError

The connection has no account connected yet; send the person connectUrl.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

CredentialDisconnected

class CredentialDisconnected extends NoClickError

The connection's account was revoked or stopped working; send the person connectUrl to reconnect it.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

QuotaExceeded

class QuotaExceeded extends NoClickError

A spent quota: never retried automatically.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

RateLimited

class RateLimited extends NoClickError

Too many requests, or a send cap reached (emails, inbox replies); retry_after says when to try again.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

UpstreamError

class UpstreamError extends NoClickError

A service NoClick relays to refused the call or failed. A refusal, such as an integration's service answering a run with an error, comes in its own words, its HTTP status in details.upstream_status, and answers 424: it isn't retried, since sending the same call again won't help. A failure (a model's provider down, a service that didn't answer) answers 502 and is retried; once retries run out, retrying in a moment usually works.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

RequestTimeout

class RequestTimeout extends NoClickError

The work outlasted what one request may wait (about 90 seconds). Never retried automatically, since the work may still be going on: an agent's turn goes on and lands in its conversation (details.operation_id and details.conversation say where).

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

ServerError

class ServerError extends NoClickError

A 5xx the server could not describe as a platform error.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

APIConnectionError

class APIConnectionError extends NoClickError

The API could not be reached, even after retries.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

OperationFailed

class OperationFailed extends NoClickError

An operation finished failed without a more specific error type.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

OperationCanceled

class OperationCanceled extends NoClickError

The operation was canceled before it finished.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

Expired

class Expired extends NoClickError

A request, link or operation expired before anyone acted on it.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

OperationTimeout

class OperationTimeout extends NoClickError

operation.wait({ timeoutS }) ran out before the operation finished.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string

WebhookSignatureError

class WebhookSignatureError extends NoClickError

A webhook delivery's NoClick-Signature doesn't match its body, or its timestamp is too old. Thrown by Webhook.verify in your receiver; answer it with a 400 and drop the delivery.

retryAfterTypeScript only

retryAfter: number | undefined

Seconds the server asked us to wait (from Retry-After), when it did.

errorTypestaticTypeScript only

static errorType: string