Skip to content

GuidesConventions

Errors

Every error is an RFC 9457 problem details object (application/problem+json). Branch on code; show people detail.

The error object

FieldTypeDescription
typestring (URI)A link to this page for the code: https://api.skanything.io/v1/docs/errors#<code>.
titlestringThe HTTP status in words, like Forbidden.
statusintegerThe HTTP status code, repeated for convenience.
codestringStable and machine-readable. Branch on this.
detailstringWhat went wrong, in plain English. It can change — don’t parse it.
request_idstringThe id of this request, like req_7c1e5a9d3f2b4e8a6c0d9f1b. Same as the SignAnything-Request-Id header.
required_scopestringOnly on 403 insufficient_scope: the scope the key needs.
Other membersvariesSome codes add what they’re about: feature (402s), pages, label, max_bytes, used_bytes and limit_bytes, received, max_days. Each is listed with its code below.
errorsnullReserved for field-by-field problems; not filled today. Errors from the API’s front door (keys, scopes, rate limits) send it as null; the others leave it out.
POST /v1/envelopes

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/problem+json
SignAnything-Request-Id: req_7c1e5a9d3f2b4e8a6c0d9f1b

{
  "type": "https://api.skanything.io/v1/docs/errors#recipient_limit",
  "title": "Unprocessable Entity",
  "status": 422,
  "code": "recipient_limit",
  "detail": "An envelope on your plan can have up to 5 recipients.",
  "request_id": "req_7c1e5a9d3f2b4e8a6c0d9f1b"
}

Which error you get first

Checks run in a fixed order and stop at the first failure: key → IP allowlist → route → test mode → scope → rate limit. So a test key calling /v1/files without files:read gets test_mode_not_supported, not insufficient_scope. Calls stopped before the rate limit don’t count toward it.

Request ids

Every response — success or error — has a SignAnything-Request-Id header. Log it with your own request. If you contact support about a call, quote the id and we can find exactly what happened.

Error codes

Each code has its own anchor on this page, which is where type points.

StatusCodeWhat it means · what to do
Keys and access
400api_key_in_queryThe key was sent in the URL. Send it in the Authorization header, and revoke that key — URLs end up in logs.
401missing_api_keyNo Authorization: Bearer … header. Send your key in it.
401invalid_api_keyThe key isn’t one we know: mistyped, cut short, or not a SignAnything key. Copy it again from your secret store.
401api_key_revokedThe key was revoked (it stops working within 30 seconds). Create a new key.
401api_key_expiredThe key passed its expiry date. Create a new key.
401account_suspendedThe account is suspended, so its keys don’t work. Contact SignAnything support.
403ip_not_allowedThe key has an IP allowlist and this address isn’t on it. Call from an allowed address, or create a key that allows it.
403test_mode_not_supportedA test key called a KeepAnything route (files, folders, uploads, the change feed, search, grants, links, file requests). They have no test mode. Use a live key.
403insufficient_scopeThe key doesn’t have the scope this call needs; required_scope names it. Create a key with that scope.
403forbiddenThe key’s user isn’t allowed to do this to this item (for example, files need Contribute or Manage access, or your company turned links off). detail says why.
Requests
404not_foundNothing with this id — or it belongs to the other mode, or there’s no such endpoint. Check the id, the path and the key’s prefix.
400 · 422invalid_request400: the body isn’t JSON, is empty, or wasn’t sent as application/json. 422 on POST /v1/envelopes: send: true without a template_id.
400invalid_cursorThe cursor isn’t one we gave you. Start the list again without it.
400invalid_idempotency_keyIdempotency-Key is longer than 64 characters.
409idempotency_key_reusedThis Idempotency-Key was already used with a different body, or by the other mode. Use a new key for a new envelope. Also when two calls with the same key race: try again.
429rate_limitedToo many requests this minute. Wait for Retry-After seconds, then try again.
Envelopes, recipients and documents
409not_draftOnly drafts can be changed: subject, message, expiry, documents, recipients and fields.
422invalid_expiryexpires_at isn’t in the future (on create, update or send), or a link’s or file request’s expiry has passed.
422too_many_labelsAn envelope can have up to 10 labels.
422label_too_longA label is over 40 characters; label names it.
422invalid_recipientA recipient isn’t valid: no name, a bad email or mobile number, an unknown type, delivery, language or identity check, a PIN that isn’t 4–8 digits, or a text code and a PIN together. detail says which.
422recipient_limitToo many recipients for the plan: 99 on Business and Enterprise, 5 on Personal.
422sms_recipient_limitMore recipients get their link by text than the plan allows (10 on Business and Enterprise).
422empty_fileThe uploaded document is empty.
422unsupported_typeUpload a PDF, Word (.docx, .doc) or Excel (.xlsx, .xls) file.
422 · 413file_too_large422: a document is over 50 MB. 413 on POST /v1/uploads: the file is over the plan’s per-file limit (max_bytes). A request over 60 MB is refused with a bare 413 before it reaches us.
422too_many_documentsAn envelope can hold up to 100 documents.
422envelope_too_largeThe envelope’s documents would add up to more than 200 MB.
422too_many_pagesA document has more than 2,000 pages; pages says how many it has.
422password_protectedThe file is password-protected. Remove the password and upload it again.
422not_a_pdfThe file couldn’t be read as a PDF.
422conversion_failedA Word or Excel file couldn’t be converted to PDF. Save it as a PDF and upload that.
422invalid_fieldA field doesn’t fit: an unknown type, a recipient or document not on the envelope, a page that isn’t in the document, a bad size or position, or more than 2,000 fields.
409scan_pendingThe virus check hasn’t finished. Try again in a moment.
451 · 409document_blockedA document was blocked by the virus check, or isn’t what its name says. 451 when you download it; 409 when you send, or use a template that has it. Replace or remove it.
409in_trashThe envelope or folder is already in Trash. Restore it first.
409not_deletableOnly drafts and declined envelopes can be deleted.
409correctingSigning is paused while the envelope is being corrected in the app.
Sending, signing and voiding
409already_sentThe envelope isn’t a draft any more.
422no_documentsAdd a document before sending.
422no_signersAdd at least one signer before sending.
422fields_not_readyA field isn’t ready to send; detail says which.
409not_signableA signing URL can only be made for a recipient whose turn it is on a sent envelope.
422reason_requiredVoiding needs a reason.
409not_voidableOnly sent, in-progress and declined envelopes can be voided.
409not_remindableThere’s no one to remind: the envelope isn’t out for signing, or no one is waiting.
409reminded_recentlyEveryone waiting was reminded within the last hour.
409not_completedThe signed PDF and certificate are ready once everyone has signed.
409not_combinedAn envelope with several documents completed before 4 November 2026 has no single signed PDF. Download each document with document_id, and the certificate.
Plans and billing
402plan_requiredSending with a live key needs a paid plan.
402billing_suspendedSending is paused until the account’s payment problem is fixed.
402envelope_allowance_exhaustedThis period’s envelopes are used up. Buy a pack in the app to keep sending.
402plan_feature_requiredThe plan doesn’t include this recipient option; feature names it (sms, access_code).
402sms_allowance_exhaustedThis period’s texts are used up; feature is sms.
402feature_not_includedThe plan doesn’t include this: templates, file endpoints on the API, or a sharing option.
503billing_unavailableWe couldn’t check the plan just now. Try again shortly.
503settings_unavailableThe company’s settings couldn’t be read just now. Try again shortly.
Templates
404not_publishedNo published template with that id. Publish it in the app first.
422missing_dataRequired data keys are missing; detail names them.
422invalid_dataA Yes / No tag got something other than true or false.
422unknown_roleA recipient names a role the template doesn’t have.
422duplicate_roleThe same role is given twice.
422missing_recipientA role the template needs has no recipient.
422invalid_signing_ordersigning_order is parallel, serial or groups.
422invalid_documentThe preview’s document number is out of range.
403template_lockedThe template locks its fields, so they can’t be added to, changed or removed on its envelopes.
503templates_unavailableTemplates aren’t available just now.
Webhooks
422invalid_urlThe endpoint URL must be https://, up to 2,048 characters, with no user name or password, and reach a public address.
422invalid_event_filterevent_filter names an event we don’t send.
422too_many_webhooksAn account can have up to 20 endpoints.
422invalid_event_typeSend test: type isn’t an event we send.
422event_not_subscribedSend test: the endpoint doesn’t receive that event. Send ping or one of its events.
Files · KeepAnything
422name_not_allowedThe name is empty, too long (255), has characters files can’t have, or is reserved.
409name_takenSomething with that name is already in the folder.
409root_folderThe Company files root can’t be renamed, moved, deleted, copied, shared or linked. Use the folders inside it.
409other_treeKeepAnything and SignAnything folders are separate. Copy it instead.
409parent_trashedThe folder is in Trash.
409folder_same_spaceFolders move only within the same space.
409folder_no_cycleA folder can’t go inside itself.
422folder_requiredChoose a folder.
409too_deepThe folder is nested too deeply to copy.
451file_blockedThe file was blocked by the virus check, or isn’t what its name says.
409restore_folderThe item went to Trash with its folder. Restore the folder instead.
423lockedSomeone has locked the file.
409version_unavailableThat version can’t be restored.
422invalid_sha256Send the file’s SHA-256 as 64 hex characters.
422invalid_sizeSend the file’s size.
507storage_fullThe upload would go over the account’s storage; used_bytes and limit_bytes say where you are.
422single_partThis upload is a single PUT, so it has no part URLs.
409upload_incompleteSome parts haven’t arrived; received lists those that have.
422size_mismatchThe uploaded file isn’t the size you announced.
410invalid_uploadThe upload token has expired (after 7 days) or isn’t valid. Start the upload again.
409already_sharedThey already have access. Change their level instead.
409share_folderFiles in SignAnything folders are shared through their folder.
422invalid_levelChoose view, contribute or manage.
422invalid_grantChoose who to share with: a person, a group or the whole company.
422invalid_emailEnter a valid email address.
422invalid_audienceChoose who the link is for.
422expiry_too_longThe link lasts longer than the company allows; max_days says how long.
422invalid_passwordA link or request password is 6 to 200 characters.
422password_requiredYour company requires a password on links.
422title_requiredGive the file request a title.
422invalid_titleThe title is over 200 characters.
422invalid_instructionsThe instructions are over 4,000 characters.
422invalid_limitA file request allows at least one file and 1 MB, and no more than the plan allows.
422invalid_querySearch for 1 to 200 characters.
503unavailableFiles are unavailable for a moment. Try again shortly.

Handling errors

  • 4xx means the request needs to change. Don’t retry it as it is — except 429, and the 409s that say to wait (scan_pending).
  • 429: wait for Retry-After seconds. The RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset headers on every response tell you how close you are.
  • 5xx or a timeout: retry with backoff. For POST /v1/envelopes, send the same Idempotency-Key so a retry can’t create a second envelope.
  • A few errors come from the network edge before the API sees the request, so they have no problem body: 413 for a request over 60 MB, and 500, 502 or 503 when something is down. Treat them by their status.