Skip to main content
Appenda
Sign inDownload

Handle errors and retry safely.

A refused request answers a 4xx or 5xx status with a body that names the problem. A refused request runs nothing and costs no credits.

The error body

Every refused request answers application/json with one error object:

curl -i https://api.appenda.app/v1/tables/tbl_missing \
  -H "Authorization: Bearer $APPENDA_API_KEY"
{
  "error": {
    "status": 404,
    "code": "not_found",
    "message": "The object doesn't exist in this workspace, or you can't see it. Check the id and the workspace.",
    "param": null,
    "docs_url": "https://appenda.app/docs/api/errors#not_found",
    "request_id": "req_1888ee34e3fa99e71430e3072c54c339"
  }
}
FieldMeaning
statusThe HTTP status, repeated.
codeA stable code. Branch on this, never on message.
messageA sentence for people that says what to do. It can change.
paramThe request field at fault, or null.
docs_urlThis page, at the code's row.
request_idThe request's id. Every response also sends it as X-Request-Id; quote it to support.

A 401 also carries WWW-Authenticate, a 405 carries Allow, and a 429, 503 or 504 carries Retry-After.

Error codes

Every code the API can answer, with its status. 400 means the body cannot be read; 422 means it can be read but a value is wrong. A 5xx means something failed on our side: retry later.

StatusCodeWhat it means and what to do
400credentials_in_querySend credentials in the Authorization header, never in the URL. Rotate a credential sent in a URL.
400https_requiredUse HTTPS for this request. Plain HTTP is refused instead of redirected.
400idempotency_key_invalidThe Idempotency-Key header must be 1 to 200 visible ASCII characters. Fix the header and retry.
400workspace_requiredThis key works across workspaces. Send the Appenda-Workspace header naming the workspace and retry.
401unauthorizedThe credential is missing, unknown, expired or revoked. Send a valid API key, or sign in again.
402insufficient_creditsThe workspace doesn't have enough credits for this run. Buy credits or lower the run's size, then retry.
402subscription_inactiveThe workspace's plan isn't active: its subscription is unpaid, paused or cancelled. Pay in Billing. The same key works again once the workspace reopens.
403approval_requiredYour role needs an Admin's approval for this action. Ask an Admin to approve the request.
403forbiddenYour role or key can't call this operation in this workspace. Ask a workspace Admin for access.
403instance_unavailableThis Appenda account isn't available. Contact support with the request id.
403key_pausedThis API key was paused because it spent far more than usual. A workspace admin can un-pause it.
403plan_not_activeThis workspace's plan isn't active. Renew or reactivate the plan in Billing, then retry.
403plan_requiredThis workspace's plan doesn't include this feature. Upgrade the plan to use it.
403plan_upgrade_requiredThis integration needs a higher plan. Upgrade the workspace's plan to use it.
403region_not_offeredThat data region isn't offered on this plan. Pick an offered region or upgrade the plan.
403role_change_deniedYour role can't change Settings → Permissions. Ask a workspace Owner or Admin to make the change.
403trial_card_requiredPeople and Company Search on a trial need a card on file. Add a card in Billing, or choose a plan.
403trial_search_limit_reachedThis trial has used all its People and Company Search records. Choose a plan to keep searching.
403workspace_limit_reachedYour plan's workspace limit is reached. Delete a workspace or upgrade the plan to create another.
403workspace_mismatchThis key belongs to a different workspace. Use a key from this workspace, or drop the Appenda-Workspace header.
404not_foundThe object doesn't exist in this workspace, or you can't see it. Check the id and the workspace.
404version_not_foundNo version with this id exists for the table. List the table's versions to find the id.
405method_not_allowedThis path doesn't serve that HTTP method. Use one of the methods in the Allow header.
408request_timeoutThe request body arrived too slowly. Send it again in one go.
409admin_lockedThe Admin role's permissions can't be changed.
409approval_staleThe approved request no longer matches what would run. Send the request again for a new approval.
409conflictThe request conflicts with the object's current state. Read the object again, then retry.
409dedupe_too_many_matchesMore than one record matches the dedupe key. Make the key unique or update the records by id.
409dedupe_unchangedThe table already uses these dedupe settings, so nothing changed.
409enrichment_already_runningA run is already in progress on this field. Wait for it to finish or stop it first.
409enrichment_config_changedThe field this run uses was deleted or changed after you set up the run. Nothing ran. Set up the run again.
409enrichment_pausedEnrichment is paused for this workspace. Resume it in the app, then retry.
409field_key_conflictA field with this key already exists with a different type. Choose another key or delete the old field.
409idempotency_key_reusedThis Idempotency-Key was already used for a different request. Use a new key for a new request.
409import_fields_changedThe table's fields changed during the import. Start the import again.
409import_finishedThe import already finished. Start a new import to add more rows.
409integration_connectedAn integration with this name is already connected. Use the existing connection or remove it first.
409job_finishedThe run already finished, so there is nothing to stop.
409monthly_spend_cap_exceededThe workspace reached its monthly spend cap. Raise the cap in Billing or wait for the next month.
409not_endedThe import is still running. Wait for it to end, then retry.
409preview_staleThe table changed since the preview. Preview again, then confirm.
409quote_mismatchThe import quote no longer matches the request. Ask for a new quote and confirm it.
409role_limit_reachedThe workspace has the most custom roles allowed. Delete a role before adding another.
409role_name_takenA role with this name already exists. Choose another name.
409role_protectedBuilt-in roles can't be renamed or deleted.
409route_model_unsupportedThis workspace can't serve the request yet. Update the app and retry.
409route_staleThe workspace moved to another region. Retry the request.
409run_group_preview_staleThe run group changed since its preview. Preview the run group again, then start it.
409schema_version_mismatchThe table's schema changed. Read the table again, then retry.
409schema_version_staleThe action's parameters changed incompatibly since that schema_version. Read them again and rebuild the inputs.
409selection_changedThe records you confirmed changed before the run started. Preview again and confirm the new count.
409sole_ownerYou're the only Owner of a shared workspace. Make someone else an Owner first.
409spend_cap_exceededThis run would spend more than its cap allows. Raise the cap or run fewer records.
409table_changedThe table changed after the history entry named in if_unchanged_since. Read its history and try again.
409transcript_head_mismatchThe transcript has moved on since these events were sent. Send them again from the head this error names.
409upstream_not_runA field this field reads has rows it has not run yet. Run that field first, or run both in one run group.
409view_name_conflictA view with this name already exists on the table. Choose another name.
409workspace_create_conflictA workspace is already being created with this request. Wait a moment, then list your workspaces.
409workspace_delete_blockedThe workspace can't be deleted while it has an active subscription or other members. Resolve those first.
409workspace_unprovisionedThe workspace has no cloud copy yet. Sync it from the desktop app first.
410token_type_retiredPersonal access tokens are retired. Create an API user token instead.
413batch_too_largeToo much to write at once. Split the request into smaller batches.
413fork_too_largeThe version has more records than one copy allows. Copy a smaller table or version.
413import_too_largeThe file is larger than one import allows. Split it into smaller files.
413payload_too_largeThe request body is larger than the API accepts. Send a smaller body.
413response_too_largeThe answer would be larger than this operation can send. Ask for fewer records or fields.
413restore_too_largeThe restore would change more records than one restore allows. Restore a narrower version.
413run_group_too_largeThe run group has more fields than one run allows. Split it into smaller groups.
415unsupported_media_typeThe request body must be JSON. Send it with Content-Type: application/json.
421residency_mismatchThe request reached the wrong data region. Send it to the workspace's own region.
422agent_bot_limit_reachedYour plan holds at most this many bots in a workspace. Delete a bot or upgrade to add another.
422agent_memory_limit_reachedMemory is full for this scope: delete some or keep fewer.
422aggregate_formula_overrideA chart can't override a formula field's calculation. Remove the override.
422cell_invalidA cell value doesn't fit its field; param names the field. Send a value the field accepts.
422condition_must_be_booleanA run condition must be a true/false formula. Change it to a formula that returns true or false.
422constant_not_allowedThe input doesn't take that kind of value; param names it. Bind it the way its accepts list allows.
422credential_not_applicableThis method runs inside Appenda and takes no credential. Leave the credential out.
422credential_not_foundThe credential doesn't exist for this provider in this workspace. List credentials and pick one, or leave it out.
422credential_shape_unsupportedThis provider doesn't take one pasted API key. Connect it in the desktop app instead.
422credits_unavailableThis step's action can't run on Appenda credits; param names it. Use the workspace's own key.
422custom_http_configuration_unsupportedHTTP request fields can't be created with an API key yet. Create them in the app.
422custom_http_key_reentry_requiredA Cloud HTTP request column's key must be saved again for this endpoint before it can run. Re-save the key in the app.
422digest_mismatchThe uploaded content doesn't match its digest. Upload it again.
422endpoint_not_allowedThe URL isn't allowed: use a public https address with no credentials in it.
422enrichment_field_limitThe table already has as many enrichment fields as it allows. Delete one before adding another.
422field_config_invalidThe field's config doesn't fit its type. Fix the config and retry.
422field_conversion_requiredThis change rewrites the field's values. Send it again with convert set to true; a dry run shows what changes first.
422field_conversion_too_largeThe field holds too many values to convert in one request. Create a new field of the type you want instead.
422field_limit_reachedThe table has the most fields allowed. Delete a field before adding another.
422field_not_foundA field the request names doesn't exist in this table. Check the field ids.
422field_read_onlyFormula and lookup fields are calculated, so their cells can't be written. Remove them from the request.
422field_type_change_unsupportedA field can't change to that type. Create a new field of the type you want instead.
422field_type_mismatchA value doesn't fit its field's type. Send a value of the field's type.
422field_type_unsupportedThe API can't create or edit fields of this type. Use the desktop app for this field type.
422force_confirmation_requiredRe-running records that already have values needs confirmation. Send confirm_force: true with force: true.
422formula_invalidThe formula doesn't parse or names a field that doesn't exist. Fix the formula and retry.
422formula_read_onlyA run condition written as a formula can only be read. Send it as rules.
422interface_invalidThe interface definition isn't valid; param names the part at fault. Fix it and save again.
422interface_limit_reachedThe workspace has the most interfaces allowed. Delete an interface before adding another.
422invalid_enrichment_configThe enrichment field's configuration isn't valid. Edit the field's settings and save again.
422invalid_requestA value in the request breaks a rule; param names the field. Fix that value and retry.
422invalid_shared_interfaceThis interface can't be shared as it is. Fix its blocks, then share it again.
422invalid_waterfallThe waterfall isn't valid; param names the part at fault and reason says why. Fix it and save again.
422matching_import_requires_atomic_batchAn import that matches existing records must run as one batch. Send it without chunking.
422matching_import_requires_existing_fieldsAn import that matches existing records can only use fields the table already has. Map columns to existing fields.
422max_credits_per_row_requiredA step spends Appenda credits, so the waterfall needs max_credits_per_row. Add a cap.
422missing_one_ofNone of an input group's alternatives is given. Add one set of inputs from requires.one_of.
422missing_requiredA required input is missing; param names it. Add it and retry.
422no_eligible_rowsNo records match what the request selects. Change the filter or selection.
422numeric_overflowA number is outside the range its field can hold. Send a smaller number.
422operator_not_supportedA run_when rule uses an operator it can't use; param names the rule. Use a view filter operator.
422output_path_emptyName the output's path: a dotted path into the field's result, such as company.size.
422own_key_requiredThis integration needs your own API key. Add the key in Settings → Integrations.
422provider_key_refusedThe integration refused your API key. Check the key in Settings → Integrations.
422provider_not_available_in_cloudThis integration runs only in the desktop app. Run it from the desktop instead.
422quote_invalidThe import quote is invalid or expired. Ask for a new quote.
422region_requiredChoose a data region for the new workspace.
422role_invalidThe role's name or permissions aren't valid. Fix them and save again.
422run_dependency_cycleThe run group's fields depend on each other in a loop. Remove one of the dependencies.
422schema_version_requiredName the schema_version of the action parameters the inputs were built from.
422selection_too_largeThe run selects more records than one run allows. Select fewer records.
422step_over_row_capRunning every step up to this one could spend more than max_credits_per_row; param names the step. Raise the cap or drop the step.
422stored_data_limit_reachedYour account is at its plan's stored data limit. Nothing was written or charged. Delete data or upgrade before adding more.
422table_enrichment_cycleThis field would send rows back into a table that feeds it. Pick a target table outside the loop.
422table_row_limit_reachedThe table is at your plan's limit of rows per table. Nothing was written or charged. Delete rows or upgrade before adding more.
422too_many_recordsThe selection exceeds max_records. Narrow the filter or increase max_records up to 1,000.
422unknown_inputThe action has no input with that key; param names it. Read the action's parameters and fix the key.
422unsupported_interface_pageThis interface page type can't be shared. Share a different page.
422unsupported_methodThis integration doesn't offer that action. Pick an action the integration lists.
422usage_range_too_wideThe usage range is too wide. Ask for a shorter date range.
422view_default_read_onlyA table's default view can't be changed or deleted. Create a new view instead.
422view_limit_reachedThe table has the most views allowed. Delete a view before adding another.
422wrong_typeA value doesn't fit its input's type or allowed values; param names the input. Send a value of that type.
423write_fencedWrites to this workspace are paused for maintenance. Retry after the Retry-After seconds.
429admission_saturatedToo many runs are starting at once. Wait the Retry-After seconds, then retry.
429invite_quota_exceededThis workspace sent too many invitations recently. Wait a while, then send more.
429key_credit_limit_exceededThis API key reached its daily credit limit. Wait for older spend to age out, or raise the key's limit.
429provider_rate_limitedThe integration's service is rate-limiting your key. Wait the Retry-After seconds, then retry.
429rate_limitedToo many requests. Wait the Retry-After seconds, then retry.
429search_limit_reachedThis plan's People and Company Search records are used up for now. They come back when the limit resets, or choose a larger plan.
429too_many_jobsToo many list imports or CSV imports are open in this workspace. Wait for one to finish or stop one, then retry.
500internalSomething failed on our side. Retry; if it keeps failing, contact support with the request id.
503commit_outcome_unknownThe write may or may not have been saved. Retry with the same Idempotency-Key to find out.
503lock_not_availableAnother write is changing this object right now. Retry in a moment.
503provider_unavailableThe integration's service is unavailable. Retry later.
503public_api_disabledThe public API is turned off for maintenance. Retry later.
503region_unavailableThat data region can't take new workspaces right now. Retry later or pick another region.
503service_unavailableSign-up verification is briefly unavailable. Retry in a minute.
503shared_writes_disabledCloud writes are briefly turned off. Retry in a few minutes.
503stop_unavailableThe run couldn't be stopped right now. Retry in a few seconds.
503unavailableThe service is briefly unavailable. Retry after the Retry-After seconds.
503workspace_create_unavailableWorkspaces can't be created right now. Retry in a few minutes.
504query_timeoutThe query took too long. Narrow the filter or ask for fewer records, then retry.

Job and key limits

A too_many_jobs error means your workspace already has 50 list imports, or 50 CSV imports, waiting or running. Wait for one to finish or stop one, then retry after the Retry-After seconds.

A key_credit_limit_exceeded error means this key reached its daily credit limit. Wait for older spend to age out, or ask a workspace admin to raise the key's limit. Repeated retries do not make more credits available.

A key_paused error means unusual spending paused this key. Ask a workspace admin to review its activity and un-pause it before retrying.

Retry safely

Retrying the same request is safe. The identical request (same key, path and body) within 10 minutes gets the first answer back instead of running again.

Without an Idempotency-Key, creating a table, field or view that already exists with the same definition returns the existing one. Starting a run on a field whose identical run is still going returns that run.

To decide yourself, send an Idempotency-Key header with any 1 to 200 visible characters. It is optional and recommended for retries. The same key always returns the first answer, and a new key always acts, even under a name that is already in use.

curl https://api.appenda.app/v1/tables \
  -H "Authorization: Bearer $APPENDA_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: create-q4-accounts" \
  -d '{"name": "Q4 target accounts"}'

If a request times out, list or get before you retry. The first attempt may have worked.

Get help

If many requests fail at once, check status.appenda.app first. Otherwise email [email protected] and include the request id from X-Request-Id.

FAQs

Does a refused request cost credits?
No. A refused request runs nothing and spends nothing.
Should I retry a 4xx?
Only these: 408 by sending the whole body again at once, 409 after reading the object again, and 423 and 429 after waiting (the Retry-After seconds when it is sent). Other 4xx answers fail the same way until you change the request. A 5xx is temporary: retry after Retry-After when it is sent, otherwise with a growing wait.