{"openapi":"3.1.0","info":{"title":"SignAnything API","version":"1.0.0-draft","summary":"Send documents for e-signature, track them, and retrieve signed PDFs and audit trails.","description":"Authentication: \u0060Authorization: Bearer sa_live_\u2026\u0060 or \u0060sa_test_\u2026\u0060 API keys, never in the query string\n(\u0060400 api_key_in_query\u0060). Key errors: \u0060401 missing_api_key\u0060, \u0060invalid_api_key\u0060, \u0060api_key_revoked\u0060, \u0060api_key_expired\u0060,\n\u0060account_suspended\u0060. Every route needs a scope (\u0060x-required-scopes\u0060; \u0060403 insufficient_scope\u0060); a key with an IP\nallowlist answers \u0060403 ip_not_allowed\u0060 elsewhere; an unknown route is \u0060404 not_found\u0060.\n\nTest and live never meet. A test key sees and changes only test envelopes and test webhook endpoints, a live key only\nlive ones: lists leave the other mode out, and any id of the other mode answers \u0060404 not_found\u0060 (its deliveries, signing\nlinks, documents and audit trail included). Test envelopes are never billed and never emailed or texted; sign them\nthrough \u0060signing_url\u0060. Templates and the account have no mode.\nAn API key acts as itself: there is no send-as (sending on someone else\u0027s behalf) on the API. Envelopes a key creates\nbelong to the user who created the key and come from the key; Send as is a web-app feature only.\nKeepAnything (Folders, Files, Uploads, Sharing) has no test mode: every files route refuses a test key with\n\u0060403 test_mode_not_supported\u0060 (\u0022Test keys can\u0027t read or change files \u2026 Use a live key for KeepAnything.\u0022), and\nneeds an API plan that includes files (\u0060402 feature_not_included\u0060).\n\nScopes: each operation\u0027s \u0060x-required-scopes\u0060 names the one scope it needs (see the \u0060apiKey\u0060 security scheme for the list).\nA key has Full access (\u0060*\u0060: every scope, including ones added later) or the scopes chosen when it was created; scopes can\u0027t\nbe changed afterwards. \u0060GET /account\u0060 takes any key. A key without the scope gets \u0060403 insufficient_scope\u0060, with the scope\nit needs in \u0060required_scope\u0060. Order of checks: key, IP allowlist, endpoint (\u0060404 not_found\u0060), test mode on KeepAnything\nroutes (\u0060403 test_mode_not_supported\u0060, before the scope, because no scope lets a test key in), scope, rate limit.\nScopes renamed on 2026-11-03 are still read as their new names: \u0060documents:read\u0060 = \u0060documents:download\u0060,\n\u0060files:share\u0060 = \u0060sharing:write\u0060, \u0060webhooks:read\u0060 / \u0060webhooks:write\u0060 = \u0060webhooks:manage\u0060, \u0060audit:read\u0060 = \u0060envelopes:read\u0060.\n\nErrors: RFC 9457 \u0060application/problem\u002Bjson\u0060 with a stable \u0060code\u0060 and the \u0060request_id\u0060; each operation lists its codes.\nIdempotency: \u0060POST /envelopes\u0060 (with or without \u0060template_id\u0060) takes an \u0060Idempotency-Key\u0060 (\u2264 64 characters, \u0060400\ninvalid_idempotency_key\u0060). Repeating the key with the same body returns the first envelope (\u0060200\u0060,\n\u0060Idempotent-Replayed: true\u0060); a different body, or the key used before by the other mode, is \u0060409 idempotency_key_reused\u0060.\nPagination: cursor-based (\u0060limit\u0060, \u0060cursor\u0060, answers carry \u0060has_more\u0060 and \u0060next_cursor\u0060) on the envelope, template and\nfolder lists; the other lists return everything in one answer (\u0060has_more: false\u0060).\nRate limits per account (all keys combined): live 300 requests/min overall, of which\n60/min for envelope create, document upload and send; test mode 30/min.\nSee the \u0060RateLimit-*\u0060 response headers; \u0060429 rate_limited\u0060 responses include \u0060Retry-After\u0060.\n","license":{"name":"Proprietary"}},"servers":[{"url":"https://api.skanything.io/v1"}],"security":[{"apiKey":[]}],"tags":[{"name":"Envelopes"},{"name":"Documents"},{"name":"Recipients"},{"name":"Fields"},{"name":"Templates"},{"name":"Audit"},{"name":"Webhooks"},{"name":"Account"},{"name":"Folders","description":"Company files folders (KeepAnything). Needs an API plan that includes files. Live keys only (a test key gets 403 test_mode_not_supported)."},{"name":"Files","description":"Company files (KeepAnything), their versions, the change feed and search. Needs an API plan that includes files. Live keys only (a test key gets 403 test_mode_not_supported)."},{"name":"Uploads","description":"Resumable uploads of new files and new versions. Live keys only (a test key gets 403 test_mode_not_supported)."},{"name":"Sharing","description":"Grants, shared links and file requests on Company files. Live keys only (a test key gets 403 test_mode_not_supported)."}],"paths":{"/envelopes":{"get":{"tags":["Envelopes"],"operationId":"listEnvelopes","summary":"List envelopes","x-required-scopes":["envelopes:read"],"description":"Newest first. Only envelopes of the key\u0027s mode (test or live). \u0060400 invalid_cursor\u0060 for a cursor that isn\u0027t one of ours.","parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Expand"},{"name":"status","in":"query","schema":{"$ref":"#/components/schemas/EnvelopeStatus"}},{"name":"external_ref","in":"query","description":"Only envelopes created with this \u0060external_ref\u0060.","schema":{"type":"string"}},{"name":"label","in":"query","description":"Only envelopes carrying this label, ignoring case. Repeat it (\u0060?label=Leases\u0026label=Q3\u0060) for envelopes that carry every one of them (as the web app\u0027s Labels filter; up to 10 are used).","style":"form","explode":true,"schema":{"type":"array","maxItems":10,"items":{"type":"string","maxLength":40}}}],"responses":{"200":{"description":"A page of envelopes.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Page"},{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Envelope"}}}}]}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Envelopes"],"operationId":"createEnvelope","summary":"Create an envelope (optionally send it)","description":"Create a draft from documents uploaded afterwards, or from a template with role\nassignments and data values. Set \u0060send: true\u0060 to create and send in one call (template-based\nenvelopes only; otherwise \u0060422 invalid_request\u0060). The answer includes \u0060recipients\u0060 and \u0060documents\u0060.\n\nWithout \u0060template_id\u0060: \u0060Idempotency-Key\u0060 applies (see the API description; an \u0060access_pin\u0060 counts only as \u0022a PIN was\ngiven\u0022); recipients are checked as on \u0060POST /envelopes/{envelope_id}/recipients\u0060 (\u0060422 invalid_recipient\u0060,\n\u0060recipient_limit\u0060, \u0060sms_recipient_limit\u0060, \u0060402 plan_feature_required\u0060, \u0060503 billing_unavailable\u0060).\n\u0060labels\u0060 are checked as on \u0060PATCH /envelopes/{envelope_id}\u0060 (\u0060422 too_many_labels\u0060, \u0060label_too_long\u0060). A call that fails\nleaves no envelope behind.\n\nWith \u0060template_id\u0060, each \u0060recipients\u0060 entry may also carry the recipient options (\u0060phone\u0060, \u0060delivery\u0060,\n\u0060require_text_code\u0060, \u0060access_pin\u0060, \u0060language\u0060, \u0060signing_capacity\u0060, \u0060allow_reassign\u0060), checked and plan-gated the same way.\n\nWith \u0060template_id\u0060 (the template\u0027s published version; \u0060Idempotency-Key\u0060 applies as without one: the same key and body\nreturn the envelope made the first time, another body is \u0060409 idempotency_key_reused\u0060): \u0060404 not_published\u0060\n(no published template with that id), \u0060402 feature_not_included\u0060 (the plan has no templates),\n\u0060422 missing_data\u0060 (required data keys, named in \u0060detail\u0060), \u0060invalid_data\u0060 (a Yes / No value that isn\u0027t true / false),\n\u0060unknown_role\u0060, \u0060duplicate_role\u0060,\n\u0060missing_recipient\u0060, \u0060invalid_recipient\u0060, \u0060invalid_signing_order\u0060, \u0060409 scan_pending\u0060 / \u0060409 document_blocked\u0060\n(a template document\u0027s virus scan), \u0060503 templates_unavailable\u0060. With \u0060send: true\u0060, also every error of\n\u0060POST /envelopes/{envelope_id}/send\u0060. \u0060400 invalid_request\u0060 for a body that isn\u0027t JSON.\n","x-required-scopes":["envelopes:write"],"parameters":[{"$ref":"#/components/parameters/IdempotencyKey"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvelopeCreate"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"200":{"description":"Idempotent replay of an earlier identical request.","headers":{"Idempotent-Replayed":{"schema":{"type":"boolean"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Envelopes"],"operationId":"getEnvelope","summary":"Retrieve an envelope","x-required-scopes":["envelopes:read"],"parameters":[{"$ref":"#/components/parameters/Expand"}],"responses":{"200":{"description":"The envelope.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"delete":{"tags":["Envelopes"],"operationId":"deleteEnvelope","summary":"Move a draft or declined envelope to Trash","description":"Same as Delete in the web app: a draft or declined envelope moves to Trash for 30 days, where it can be restored in the web app, then it is deleted for good (its files included). Fails with \u0060409 legal_hold\u0060 when the envelope (or its folder) is on legal hold, \u0060409 in_trash\u0060 when it is already in Trash, \u0060409 correcting\u0060 while it is being corrected, \u0060409 not_deletable\u0060 for any other status (sent, in progress, completed, voided or expired envelopes can\u0027t be deleted), \u0060403 not_owner\u0060 and \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"responses":{"204":{"description":"Moved to Trash."},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Envelopes"],"operationId":"updateEnvelope","summary":"Update a draft envelope, or any envelope\u0027s labels","description":"Fields left out keep their value. \u0060labels\u0060 replaces the whole list and can change at any status (as in the web app); blanks and repeats (ignoring case) are dropped, and a label already used in the account keeps its first spelling. Errors: \u0060409 not_draft\u0060 (only drafts change \u0060subject\u0060, \u0060message\u0060, \u0060expires_at\u0060), \u0060422 invalid_expiry\u0060 (\u0060expires_at\u0060 not in the future), \u0060422 too_many_labels\u0060 (more than 10), \u0060422 label_too_long\u0060 (over 40 characters), \u0060403 send_as_revoked\u0060 (the draft was made as someone who no longer lets the key\u0027s creator send for them), \u0060403 forbidden\u0060, \u0060404 not_found\u0060, \u0060400 invalid_request\u0060.","x-required-scopes":["envelopes:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnvelopeUpdate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/documents":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Documents"],"operationId":"listDocuments","summary":"List an envelope\u0027s documents","x-required-scopes":["envelopes:read"],"responses":{"200":{"description":"Documents, in order.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentList"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Documents"],"operationId":"uploadDocument","summary":"Add a document to a draft envelope","description":"PDF, Word (\u0060.docx\u0060, \u0060.doc\u0060) or Excel (\u0060.xlsx\u0060, \u0060.xls\u0060), by file extension; Word and Excel are converted to PDF. The document\u0027s name is the file name without its extension. Up to 50 MB and 2,000 pages per document, 100 documents and 200 MB per envelope. Every document is virus-scanned (\u0060scan_status\u0060); a file whose bytes aren\u0027t its type is kept as blocked (\u0060scan_status: mismatch\u0060) and must be removed before sending. Errors: \u0060422 empty_file\u0060, \u0060unsupported_type\u0060, \u0060file_too_large\u0060, \u0060too_many_pages\u0060, \u0060too_many_documents\u0060, \u0060envelope_too_large\u0060, \u0060password_protected\u0060, \u0060not_a_pdf\u0060, \u0060conversion_failed\u0060; \u0060409 not_draft\u0060; \u0060403 forbidden\u0060 / \u0060send_as_revoked\u0060; \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["file"],"properties":{"file":{"type":"string","contentMediaType":"application/octet-stream","description":"The file (pdf, docx, doc, xlsx, xls)."}}}}}},"responses":{"201":{"description":"Uploaded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Document"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/documents/{document_id}/content":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"},{"name":"document_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/DocumentId"}}],"get":{"tags":["Documents"],"operationId":"downloadDocument","summary":"Download the original PDF","description":"The original as uploaded, unsigned (Word and Excel uploads as converted), for the sending account only: recipients never get originals (they get the signed PDF). Recorded in the envelope\u0027s trail. Errors: \u0060409 scan_pending\u0060 while the virus scan runs, \u0060451 document_blocked\u0060 for a document the scan blocked, \u0060404 not_found\u0060.","x-required-scopes":["documents:download"],"responses":{"200":{"$ref":"#/components/responses/Pdf"},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/signed_pdf":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Envelopes"],"operationId":"downloadSignedPdf","summary":"Download the signed PDF (completed envelopes only)","description":"THE signed result: one PDF with every document in order, then the certificate of completion, under one platform PAdES-LT seal (the certificate\u0027s pages were added before sealing, so the seal covers them). With several documents a page before the certificate lists each sealed document with its SHA-256 and says \u0022The certificate of completion follows this page; it is also available separately.\u0022 The certificate on its own: \u0060GET /envelopes/{envelope_id}/certificate\u0060. With \u0060document_id\u0060: that document\u0027s own sealed copy (a secondary download; with several documents it does not include the certificate). There is no .zip of signed documents. Errors: \u0060409 not_completed\u0060 until everyone has signed; \u0060409 not_combined\u0060 for an envelope with several documents completed before 2026-11-04 (not backfilled: download each document with \u0060document_id\u0060, and the certificate); \u0060404 not_found\u0060.","x-required-scopes":["documents:download"],"parameters":[{"name":"document_id","in":"query","description":"One document\u0027s own sealed copy instead of the signed PDF.","schema":{"$ref":"#/components/schemas/DocumentId"}}],"responses":{"200":{"$ref":"#/components/responses/Pdf"},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/certificate":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Envelopes"],"operationId":"downloadCertificate","summary":"Download the certificate of completion (completed envelopes only)","description":"The certificate on its own, sealed with the platform\u0027s PAdES-LT seal. The same pages are also appended to the end of the signed PDF (see \u0060downloadSignedPdf\u0060). It lists each document\u0027s original SHA-256 (the file as uploaded), so it can be drawn before the seal. \u0060409 not_completed\u0060 until everyone has signed; \u0060404 not_found\u0060.","x-required-scopes":["documents:download"],"responses":{"200":{"$ref":"#/components/responses/Pdf"},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/recipients":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Recipients"],"operationId":"listRecipients","summary":"List recipients","x-required-scopes":["envelopes:read"],"responses":{"200":{"description":"Recipients.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientList"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Recipients"],"operationId":"addRecipient","summary":"Add a recipient to a draft envelope","description":"The same rules, plan checks and audit trail as the web app\u0027s Recipients step. Delivery by text (\u0060sms\u0060, \u0060both\u0060) and \u0060require_text_code\u0060 need the plan\u0027s \u0060sms\u0060 feature, \u0060access_pin\u0060 its \u0060access_code\u0060 feature: otherwise \u0060402 plan_feature_required\u0060 with the \u0060feature\u0060 named in the problem. The access PIN is write-only (stored as a salted hash, never returned: \u0060access_pin_set\u0060 says whether one is set). The audit trail records that a phone number or PIN was set or changed, never the number or the PIN. Errors: \u0060422 invalid_recipient\u0060 (unknown type, delivery or language; no name; missing or invalid email; a phone number that isn\u0027t E.164; no mobile number for delivery by text or a text-message code; a PIN that isn\u0027t 4\u20138 digits; both \u0060require_text_code\u0060 and \u0060access_pin\u0060; order below 1; \u0060signing_capacity\u0060 over 120 characters), \u0060422 recipient_limit\u0060 (the plan\u0027s recipients per envelope), \u0060422 sms_recipient_limit\u0060 (the plan\u0027s recipients by text per envelope), \u0060402 plan_feature_required\u0060, \u0060503 billing_unavailable\u0060 (the plan couldn\u0027t be checked), \u0060409 not_draft\u0060, \u0060403 forbidden\u0060 / \u0060send_as_revoked\u0060, \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientInput"}}}},"responses":{"201":{"description":"Added.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipient"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/recipients/{recipient_id}":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"},{"$ref":"#/components/parameters/RecipientIdPath"}],"delete":{"tags":["Recipients"],"operationId":"removeRecipient","summary":"Remove a recipient from a draft envelope","description":"Errors: \u0060409 not_draft\u0060, \u0060403 forbidden\u0060 / \u0060send_as_revoked\u0060, \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"responses":{"204":{"description":"Removed."},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Recipients"],"operationId":"updateRecipient","summary":"Update a recipient on a draft envelope","description":"Fields left out keep their value. \u0060signing_capacity\u0060 \u0022\u0022 and \u0060phone\u0060 \u0022\u0022 clear them; \u0060access_pin\u0060 \u0022\u0022 removes the PIN (back to the email link); \u0060require_text_code: false\u0060 turns the text-message code off. Errors as for adding one.","x-required-scopes":["envelopes:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecipientInput"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Recipient"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/recipients/{recipient_id}/signing_url":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"},{"$ref":"#/components/parameters/RecipientIdPath"}],"post":{"tags":["Recipients"],"operationId":"createSigningUrl","summary":"Create an embedded-signing URL","description":"A signing link for one recipient, valid for 5 minutes, to open in your own app. It opens the same\nenvelope-scoped recipient session as an emailed link (recipients aren\u0027t user accounts), with any\nstep-up the envelope requires; the audit trail records the embedded session and the calling key.\nThis is also how test envelopes are signed (they are never emailed). No request body.\nErrors: \u0060409 not_signable\u0060 (the envelope isn\u0027t sent / in progress, or it isn\u0027t this recipient\u0027s turn,\nor they are done), \u0060404 not_found\u0060.\n","x-required-scopes":["envelopes:write"],"responses":{"201":{"description":"URL created.","content":{"application/json":{"schema":{"type":"object","required":["url","expires_at"],"properties":{"url":{"type":"string","format":"uri"},"expires_at":{"type":"string","format":"date-time"}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/fields":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Fields"],"operationId":"listFields","summary":"List fields","x-required-scopes":["envelopes:read"],"responses":{"200":{"description":"Fields.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldList"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Fields"],"operationId":"addField","summary":"Place a field on a draft envelope","description":"Other fields keep their name and options. Errors: \u0060422 invalid_field\u0060 (unknown type, a recipient or document not on the envelope, a recipient who doesn\u0027t sign or approve, a page outside the document, size / position not positive, a label over 200 characters, a \u0060name\u0060 or \u0060options\u0060 that break the field rules, more than 2,000 fields), \u0060403 template_locked\u0060 (the envelope\u0027s template doesn\u0027t let senders add or change fields), \u0060409 not_draft\u0060, \u0060403 forbidden\u0060 / \u0060send_as_revoked\u0060, \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FieldInput"}}}},"responses":{"201":{"description":"Placed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Field"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/fields/{field_id}":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"},{"name":"field_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/FieldId"}}],"delete":{"tags":["Fields"],"operationId":"removeField","summary":"Remove a field from a draft envelope","description":"To change a field, remove it and place it again. Errors: \u0060403 template_locked\u0060 (a template field senders may not remove, or the last signature field of a role), \u0060409 not_draft\u0060, \u0060403 forbidden\u0060 / \u0060send_as_revoked\u0060, \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"responses":{"204":{"description":"Removed."},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/send":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"post":{"tags":["Envelopes"],"operationId":"sendEnvelope","summary":"Send a draft envelope","description":"Runs the Ready check first and fails with \u0060422 fields_not_ready\u0060 (the first problem as \u0060detail\u0060) when someone who signs or approves has no \u0060signature\u0060 or \u0060approve\u0060 field, has more than one \u0060approve\u0060 field, two fields share a \u0060name\u0060, a choice field has no options, a checkbox group\u0027s rule can\u0027t be met, a custom pattern is invalid, a condition names a missing field or loops, a formula doesn\u0027t evaluate or uses itself, read-only text is empty, or an attachment field allows no file types. Other errors: \u0060409 already_sent\u0060 (not a draft); \u0060422 no_documents\u0060, \u0060no_signers\u0060, \u0060invalid_expiry\u0060 (the expiry has passed), \u0060expiry_out_of_range\u0060 (outside the company\u0027s expiry range, Settings \u203A Signing defaults), \u0060reminders_not_allowed\u0060 (the account\u0027s reminder setting isn\u0027t one it allows); \u0060409 scan_pending\u0060 (a document is still being virus-scanned) and \u0060409 document_blocked\u0060 (remove the blocked document); live keys only: \u0060402 plan_required\u0060, \u0060billing_suspended\u0060, \u0060envelope_allowance_exhausted\u0060 (buy a pack), and \u0060503 billing_unavailable\u0060; the plan re-checked against the recipients: \u0060422 recipient_limit\u0060, \u0060sms_recipient_limit\u0060, \u0060402 plan_feature_required\u0060, \u0060402 sms_allowance_exhausted\u0060; \u0060403 send_as_revoked\u0060, \u0060403 forbidden\u0060, \u0060404 not_found\u0060. Without an expiry the account\u0027s default applies, and the account\u0027s reminder setting is used.","x-required-scopes":["envelopes:write"],"responses":{"200":{"description":"Sent.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/void":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"post":{"tags":["Envelopes"],"operationId":"voidEnvelope","summary":"Void a sent envelope","description":"Sent, in-progress or declined envelopes; their signing links stop working. Errors: \u0060422 reason_required\u0060, \u0060409 not_voidable\u0060 (any other status), \u0060403 forbidden\u0060, \u0060404 not_found\u0060.","x-required-scopes":["envelopes:void"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["reason"],"properties":{"reason":{"type":"string","minLength":1}}}}}},"responses":{"200":{"description":"Voided.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Envelope"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/remind":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"post":{"tags":["Envelopes"],"operationId":"remindEnvelope","summary":"Remind recipients whose turn it is","description":"Reminds everyone whose turn it is and who wasn\u0027t reminded in the last hour. Errors: \u0060409 reminded_recently\u0060 (everyone waiting was reminded within the hour), \u0060409 not_remindable\u0060 (not sent / in progress, or no one is waiting), \u0060409 correcting\u0060 (signing is paused for a correction), \u0060403 forbidden\u0060, \u0060404 not_found\u0060.","x-required-scopes":["envelopes:write"],"responses":{"200":{"description":"Reminders sent.","content":{"application/json":{"schema":{"type":"object","required":["reminded","envelope"],"properties":{"reminded":{"type":"integer","description":"How many recipients were reminded."},"envelope":{"$ref":"#/components/schemas/Envelope"}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/events":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Audit"],"operationId":"listEnvelopeEvents","summary":"The envelope\u0027s audit trail","description":"Every event in one answer, oldest first, with its chain hash.","x-required-scopes":["envelopes:read"],"responses":{"200":{"description":"Audit events, oldest first.","content":{"application/json":{"schema":{"type":"object","required":["object","data","has_more"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AuditEvent"}},"has_more":{"const":false}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/envelopes/{envelope_id}/events/verify":{"parameters":[{"$ref":"#/components/parameters/EnvelopeIdPath"}],"get":{"tags":["Audit"],"operationId":"verifyEnvelopeEvents","summary":"Recompute and verify the audit hash chain","x-required-scopes":["envelopes:read"],"responses":{"200":{"description":"Verification result.","content":{"application/json":{"schema":{"type":"object","required":["valid","events"],"properties":{"valid":{"type":"boolean","description":"False when any event\u0027s hash or link to the one before doesn\u0027t match."},"events":{"type":"integer"},"head_hash":{"type":["string","null"],"description":"Hex SHA-256 of the last event checked (the latest when valid)."}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/templates":{"get":{"tags":["Templates"],"operationId":"listTemplates","summary":"List templates","description":"Templates are made in the web app; the API reads them. Every template route needs a plan with templates (\u0060402 feature_not_included\u0060). \u0060400 invalid_cursor\u0060 for a cursor that isn\u0027t one of ours.","x-required-scopes":["templates:read"],"parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"A page of templates.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Page"},{"type":"object","properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TemplateSummary"}}}}]}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/templates/{template_id}":{"parameters":[{"$ref":"#/components/parameters/TemplateIdPath"}],"get":{"tags":["Templates"],"operationId":"getTemplate","summary":"Retrieve a template with its roles and fields","description":"The latest published version. A template id is the template family; the version-specific id an envelope\u0027s \u0060template_id\u0060 carries resolves to the same template. Drafts aren\u0027t visible: \u0060404 not_found\u0060 until published.","x-required-scopes":["templates:read"],"responses":{"200":{"description":"The template.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Template"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/templates/{template_id}/data_schema":{"parameters":[{"$ref":"#/components/parameters/TemplateIdPath"}],"get":{"tags":["Templates"],"operationId":"getTemplateDataSchema","summary":"The template\u0027s data as JSON Schema","description":"JSON Schema 2020-12 for the \u0060data\u0060 of \u0060POST /envelopes\u0060 with this template, for code generators. Plain data fields are strings, with the field type in \u0060x-skanything-type\u0060 and a \u0060format: date\u0060 or a number pattern where one fits; Yes / No fields are booleans (the text \u0022yes\u0022 / \u0022no\u0022 / \u0022true\u0022 / \u0022false\u0022 is still accepted); tables and API-filled checkbox / radio groups are objects. \u0060required\u0060 lists the required keys. \u0060404 not_found\u0060.","x-required-scopes":["templates:read"],"responses":{"200":{"description":"The schema.","content":{"application/schema\u002Bjson":{"schema":{"type":"object","additionalProperties":true}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/templates/{template_id}/preview":{"parameters":[{"$ref":"#/components/parameters/TemplateIdPath"}],"post":{"tags":["Templates"],"operationId":"previewTemplate","summary":"Preview a template document with data","description":"A PDF of one document watermarked as a preview, filled with the given data and sample values for the rest. Not stored. Errors: \u0060422 invalid_document\u0060 (no document at that position), \u0060451 document_blocked\u0060 (the virus scan blocked it), \u0060404 not_found\u0060, \u0060400 invalid_request\u0060.","x-required-scopes":["templates:write"],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"object","additionalProperties":{"type":["string","boolean","null"]},"description":"Values keyed by data field key; text, or true / false for a Yes / No field."},"version":{"type":"integer","minimum":1,"description":"A published version; the latest when omitted."},"document":{"type":"integer","minimum":1,"default":1,"description":"Which document, by position."}}}}}},"responses":{"200":{"$ref":"#/components/responses/Pdf"},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhooks":{"get":{"tags":["Webhooks"],"operationId":"listWebhooks","summary":"List webhook endpoints","description":"The endpoints of the key\u0027s mode (test or live), newest first, all in one answer.","x-required-scopes":["webhooks:manage"],"responses":{"200":{"description":"Endpoints.","content":{"application/json":{"schema":{"type":"object","required":["object","data","has_more"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Webhook"}},"has_more":{"const":false}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Webhooks"],"operationId":"createWebhook","summary":"Register a webhook endpoint","description":"The endpoint gets the key\u0027s mode (\u0060livemode\u0060) and receives only events of that mode. The response is the only time \u0060secret\u0060 is returned. Errors: \u0060422 invalid_url\u0060 (not HTTPS, or not a public address), \u0060422 invalid_event_filter\u0060, \u0060422 too_many_webhooks\u0060 (20 per account, test and live together), \u0060400 invalid_request\u0060.","x-required-scopes":["webhooks:manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookCreate"}}}},"responses":{"201":{"description":"Registered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWithSecret"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhooks/{webhook_id}":{"parameters":[{"$ref":"#/components/parameters/WebhookIdPath"}],"get":{"tags":["Webhooks"],"operationId":"getWebhook","summary":"Retrieve a webhook endpoint","x-required-scopes":["webhooks:manage"],"responses":{"200":{"description":"The endpoint.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"delete":{"tags":["Webhooks"],"operationId":"deleteWebhook","summary":"Delete a webhook endpoint","x-required-scopes":["webhooks:manage"],"responses":{"204":{"description":"Deleted."},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Webhooks"],"operationId":"updateWebhook","summary":"Update a webhook endpoint","description":"Fields left out keep their value. \u0060enabled: true\u0060 turns a disabled endpoint back on and resets its failure count. Errors: \u0060422 invalid_url\u0060, \u0060422 invalid_event_filter\u0060, \u0060404 not_found\u0060, \u0060400 invalid_request\u0060.","x-required-scopes":["webhooks:manage"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookUpdate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Webhook"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhooks/{webhook_id}/rotate_secret":{"parameters":[{"$ref":"#/components/parameters/WebhookIdPath"}],"post":{"tags":["Webhooks"],"operationId":"rotateWebhookSecret","summary":"Rotate the signing secret","description":"The previous secret keeps signing alongside the new one for 24 hours (\u0060previous_secret_expires_at\u0060). The response is the only time the new \u0060secret\u0060 is returned. \u0060404 not_found\u0060.","x-required-scopes":["webhooks:manage"],"responses":{"200":{"description":"Rotated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookWithSecret"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhooks/{webhook_id}/test":{"parameters":[{"$ref":"#/components/parameters/WebhookIdPath"}],"post":{"tags":["Webhooks"],"operationId":"testWebhook","summary":"Send a test event","description":"Queues a test event for this endpoint and tries it once straight away (up to 5 seconds), returning what the endpoint\nanswered. If that try fails or gets no answer, it is retried on the normal schedule, signed like any delivery.\n\u0060type\u0060 picks the event: \u0060ping\u0060 (the default, also with no body) or one of the events the endpoint receives. The endpoint\ngets a realistic sample of that event with sample ids, marked \u0060\u0022test\u0022: true\u0060 (and the endpoint\u0027s \u0060livemode\u0060).\n\u0060422 invalid_event_type\u0060 for an unknown event, \u0060422 event_not_subscribed\u0060 for one the endpoint doesn\u0027t receive.\n","x-required-scopes":["webhooks:manage"],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"type":{"$ref":"#/components/schemas/WebhookEventType"}}}}}},"responses":{"202":{"description":"Test event sent (or queued for a retry).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAttempt"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhooks/{webhook_id}/deliveries":{"parameters":[{"$ref":"#/components/parameters/WebhookIdPath"}],"get":{"tags":["Webhooks"],"operationId":"listWebhookDeliveries","summary":"Delivery attempt history","description":"The latest 100 deliveries, newest first. \u0060404 not_found\u0060.","x-required-scopes":["webhooks:manage"],"responses":{"200":{"description":"Deliveries, newest first.","content":{"application/json":{"schema":{"type":"object","required":["object","data","has_more"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookDelivery"}},"has_more":{"const":false}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/webhooks/{webhook_id}/deliveries/{delivery_id}/redeliver":{"parameters":[{"$ref":"#/components/parameters/WebhookIdPath"},{"name":"delivery_id","in":"path","required":true,"schema":{"type":"string","pattern":"^dlv_[A-Za-z0-9]\u002B$"}}],"post":{"tags":["Webhooks"],"operationId":"redeliverWebhook","summary":"Redeliver a past event","description":"Sends the event again straight away (up to 5 seconds) and returns what the endpoint answered; a failure is retried on the normal schedule. \u0060404 not_found\u0060.","x-required-scopes":["webhooks:manage"],"responses":{"202":{"description":"Redelivered (or queued for a retry).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookAttempt"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/account":{"get":{"tags":["Account"],"operationId":"getAccount","summary":"The account this key belongs to, with plan usage","description":"The plan, its period and the envelopes used and left (the same for test and live keys).","x-required-scopes":[],"responses":{"200":{"description":"The account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/folders/{folder_id}":{"parameters":[{"$ref":"#/components/parameters/FolderIdPath"}],"get":{"tags":["Folders"],"operationId":"getFolder","summary":"Retrieve a folder","description":"\u0060company\u0060 retrieves the Company files root.","x-required-scopes":["files:read"],"responses":{"200":{"description":"The folder.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"delete":{"tags":["Folders"],"operationId":"trashFolder","summary":"Move a folder to Trash","description":"The folder and everything in it can be restored until the plan\u0027s Trash window ends.","x-required-scopes":["files:write"],"responses":{"200":{"description":"The items moved to Trash.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileItem"}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Folders"],"operationId":"updateFolder","summary":"Rename or move a folder","x-required-scopes":["files:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItemUpdate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/folders/{folder_id}/children":{"parameters":[{"$ref":"#/components/parameters/FolderIdPath"}],"get":{"tags":["Folders"],"operationId":"listFolderChildren","summary":"List a folder\u0027s folders and files","description":"\u0060company\u0060 lists the top of Company files.","x-required-scopes":["files:read"],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"A page of items, folders first, then by name.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Page"},{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/FileItem"}}}}]}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/folders":{"post":{"tags":["Folders"],"operationId":"createFolder","summary":"Create a folder","x-required-scopes":["files:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"parent_id":{"type":"string","default":"company","description":"The parent folder\u0027s id, or \u0060company\u0060 (the Company files root)."},"name":{"type":"string","minLength":1}}}}}},"responses":{"201":{"description":"Created. A name already taken in the folder gets a number, e.g. \u0060Plans (1)\u0060.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/files/{file_id}":{"parameters":[{"$ref":"#/components/parameters/FileIdPath"}],"get":{"tags":["Files"],"operationId":"getFile","summary":"Retrieve a file\u0027s metadata","x-required-scopes":["files:read"],"responses":{"200":{"description":"The file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}},"delete":{"tags":["Files"],"operationId":"trashFile","summary":"Move a file to Trash","description":"It can be restored until the plan\u0027s Trash window ends.","x-required-scopes":["files:write"],"responses":{"200":{"description":"The items moved to Trash.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileItem"}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Files"],"operationId":"updateFile","summary":"Rename or move a file","x-required-scopes":["files:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItemUpdate"}}}},"responses":{"200":{"description":"Updated.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/files/{file_id}/restore":{"parameters":[{"$ref":"#/components/parameters/FileIdPath"}],"post":{"tags":["Files"],"operationId":"restoreFile","summary":"Restore a file or folder from Trash","x-required-scopes":["files:write"],"responses":{"200":{"description":"The restored items.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FileItem"}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/files/{file_id}/copy":{"parameters":[{"$ref":"#/components/parameters/FileIdPath"}],"post":{"tags":["Files"],"operationId":"copyFile","summary":"Copy a file","description":"The copy counts toward storage. Without \u0060parent_id\u0060 it goes in the same folder.","x-required-scopes":["files:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItemUpdate"}}}},"responses":{"201":{"description":"The copy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/files/{file_id}/content":{"parameters":[{"$ref":"#/components/parameters/FileIdPath"}],"get":{"tags":["Files"],"operationId":"downloadFile","summary":"Download a file","description":"Redirects to a 5-minute storage URL (\u0060Range\u0060 works there). Errors: \u0060409 scan_pending\u0060 while the\nvirus scan runs, \u0060451 file_blocked\u0060 when a virus was found.\n","x-required-scopes":["files:read"],"parameters":[{"name":"version","in":"query","description":"A version id; the current version when omitted.","schema":{"type":"string","format":"uuid"}}],"responses":{"302":{"$ref":"#/components/responses/SignedRedirect"},"default":{"$ref":"#/components/responses/Problem"}}}},"/files/{file_id}/versions":{"parameters":[{"$ref":"#/components/parameters/FileIdPath"}],"get":{"tags":["Files"],"operationId":"listFileVersions","summary":"List a file\u0027s versions","description":"Versions are kept for the plan\u0027s version history window.","x-required-scopes":["files:read"],"responses":{"200":{"description":"The versions, newest first.","content":{"application/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/FileVersion"}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/files/{file_id}/versions/{version_id}/restore":{"parameters":[{"$ref":"#/components/parameters/FileIdPath"},{"name":"version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"post":{"tags":["Files"],"operationId":"restoreFileVersion","summary":"Make an earlier version current","description":"Adds a new version with that version\u0027s content; nothing is overwritten.","x-required-scopes":["files:write"],"responses":{"200":{"description":"The file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileItem"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/uploads":{"post":{"tags":["Uploads"],"operationId":"startUpload","summary":"Start an upload (a new file or a new version)","description":"Resumable upload. Small files get one storage \u0060url\u0060 to \u0060PUT\u0060 the bytes to; larger ones get\n\u0060parts\u0060 (\u0060PUT\u0060 each part; more part URLs from \u0060/uploads/{upload_token}/parts\u0060), then\n\u0060/uploads/{upload_token}/complete\u0060. Bytes go straight to storage. When the account already\nstores the same content (\u0060sha256\u0060), the answer is \u0060status: done\u0060 with the file and no upload.\nErrors: \u0060507 storage_full\u0060 over the plan\u0027s storage, \u0060413 file_too_large\u0060 over the plan\u0027s\nlargest file.\n","x-required-scopes":["files:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStart"}}}},"responses":{"201":{"description":"Started (or done, for content already stored).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadStarted"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/uploads/{upload_token}":{"parameters":[{"$ref":"#/components/parameters/UploadTokenPath"}],"get":{"tags":["Uploads"],"operationId":"getUpload","summary":"Upload status (parts received)","description":"Resume an interrupted upload by sending only the parts not yet received.","x-required-scopes":["files:read"],"responses":{"200":{"description":"The upload\u0027s progress.","content":{"application/json":{"schema":{"type":"object","required":["size","part_size","part_count","received","received_bytes"],"properties":{"size":{"type":"integer","format":"int64"},"part_size":{"type":"integer","format":"int64"},"part_count":{"type":"integer"},"received":{"type":"array","items":{"type":"integer"},"description":"Part numbers storage has."},"received_bytes":{"type":"integer","format":"int64"}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/uploads/{upload_token}/parts":{"parameters":[{"$ref":"#/components/parameters/UploadTokenPath"}],"post":{"tags":["Uploads"],"operationId":"getUploadPartUrls","summary":"Storage URLs for more parts","x-required-scopes":["files:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"numbers":{"type":"array","items":{"type":"integer","minimum":1},"description":"Part numbers (1-based)."}}}}}},"responses":{"200":{"description":"One pre-signed \u0060PUT\u0060 URL per part.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/UploadPartUrl"}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/uploads/{upload_token}/complete":{"parameters":[{"$ref":"#/components/parameters/UploadTokenPath"}],"post":{"tags":["Uploads"],"operationId":"completeUpload","summary":"Finish an upload","description":"Checks the size and SHA-256, then adds the file (or its new version). The file opens once\nthe virus scan passes. A version based on an older one, or onto a file someone else has\nlocked, is kept as a conflicted copy (\u0060conflict\u0060).\n","x-required-scopes":["files:write"],"responses":{"200":{"description":"The file.","content":{"application/json":{"schema":{"type":"object","required":["file","version_id"],"properties":{"file":{"$ref":"#/components/schemas/FileItem"},"version_id":{"type":"string","format":"uuid"},"conflict":{"type":"string","description":"Why the upload became a conflicted copy, when it did."}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/grants":{"get":{"tags":["Sharing"],"operationId":"listGrants","summary":"List who a folder or file is shared with","x-required-scopes":["files:read"],"parameters":[{"name":"item","in":"query","required":true,"description":"A folder or file id.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Grants, including those inherited from parent folders.","content":{"application/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Grant"}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Sharing"],"operationId":"createGrant","summary":"Share a folder or file with people","description":"Sharing outside the company needs the plan feature \u0060file_sharing_external\u0060 and the company\u0027s setting.","x-required-scopes":["sharing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GrantInput"}}}},"responses":{"201":{"description":"Shared.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Grant"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/grants/{grant_id}":{"parameters":[{"$ref":"#/components/parameters/GrantIdPath"}],"delete":{"tags":["Sharing"],"operationId":"deleteGrant","summary":"Stop sharing with someone","x-required-scopes":["sharing:write"],"responses":{"204":{"description":"Removed."},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Sharing"],"operationId":"updateGrant","summary":"Change a grant\u0027s permission","x-required-scopes":["sharing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["permission"],"properties":{"permission":{"$ref":"#/components/schemas/FilePermission"}}}}}},"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Grant"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/links":{"get":{"tags":["Sharing"],"operationId":"listLinks","summary":"List shared links","x-required-scopes":["files:read"],"parameters":[{"name":"item","in":"query","description":"Only the links to this folder or file.","schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Links to Company files.","content":{"application/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Link"}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Sharing"],"operationId":"createLink","summary":"Create a shared link","description":"Needs the plan feature \u0060file_links\u0060 (passwords and download control: \u0060file_link_passwords\u0060).\nThe response is the only time \u0060url\u0060 is returned.\n","x-required-scopes":["sharing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/LinkInput"},{"type":"object","required":["item_id"],"properties":{"item_id":{"type":"string","format":"uuid","description":"The folder or file to share."}}}]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/links/{link_id}":{"parameters":[{"$ref":"#/components/parameters/LinkIdPath"}],"delete":{"tags":["Sharing"],"operationId":"disableLink","summary":"Disable a shared link","x-required-scopes":["sharing:write"],"responses":{"204":{"description":"Disabled."},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Sharing"],"operationId":"updateLink","summary":"Change a shared link","x-required-scopes":["sharing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/LinkInput"},{"type":"object","properties":{"remove_password":{"type":"boolean"}}}]}}}},"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Link"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/file_requests":{"get":{"tags":["Sharing"],"operationId":"listFileRequests","summary":"List file requests","x-required-scopes":["files:read"],"responses":{"200":{"description":"File requests into Company files.","content":{"application/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/FileRequest"}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}},"post":{"tags":["Sharing"],"operationId":"createFileRequest","summary":"Ask people to upload files into a folder","description":"Needs the plan feature \u0060file_requests\u0060. The response is the only time \u0060url\u0060 is returned.","x-required-scopes":["sharing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/FileRequestInput"},{"type":"object","required":["folder_id","title"]}]}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileRequest"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/file_requests/{file_request_id}":{"parameters":[{"$ref":"#/components/parameters/FileRequestIdPath"}],"delete":{"tags":["Sharing"],"operationId":"closeFileRequest","summary":"Close a file request","description":"Uploads already received stay in the folder.","x-required-scopes":["sharing:write"],"responses":{"204":{"description":"Closed."},"default":{"$ref":"#/components/responses/Problem"}}},"patch":{"tags":["Sharing"],"operationId":"updateFileRequest","summary":"Change a file request","x-required-scopes":["sharing:write"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileRequestInput"}}}},"responses":{"200":{"description":"Changed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileRequest"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/changes":{"get":{"tags":["Files"],"operationId":"listChanges","summary":"The change feed for Company files","description":"Without \u0060cursor\u0060: every folder and file in Company files, parents before children, 500 at a\ntime (while \u0060has_more\u0060, call again with \u0060page\u0060 = \u0060next_page\u0060); the last page carries a \u0060cursor\u0060.\nWith \u0060cursor\u0060: what changed since, and the next \u0060cursor\u0060; call again while \u0060has_more\u0060.\n\u0060reset: true\u0060 means the key\u0027s access changed: list again without a cursor.\n","x-required-scopes":["files:read"],"parameters":[{"name":"cursor","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","description":"\u0060next_page\u0060 from the previous page of the listing (without \u0060cursor\u0060).","schema":{"type":"string"}}],"responses":{"200":{"description":"Changes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangePage"}}}},"default":{"$ref":"#/components/responses/Problem"}}}},"/search":{"get":{"tags":["Files"],"operationId":"searchFiles","summary":"Search Company files by name and contents","description":"Contents are searched when the plan has \u0060file_content_search\u0060 and the company turned it on.","x-required-scopes":["files:read"],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":30}}],"responses":{"200":{"description":"Matches, best first.","content":{"application/json":{"schema":{"type":"object","required":["object","data"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"type":"object","required":["item"],"properties":{"item":{"$ref":"#/components/schemas/FileItem"},"snippet":{"type":"string","description":"Matching text from the contents, when the contents matched."}}}}}}}}},"default":{"$ref":"#/components/responses/Problem"}}}}},"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"sa_{live|test}_\u003Ckeyid\u003E_\u003Csecret\u003E\u003Ccrc\u003E","description":"API key created by an account owner or admin in the console. Never send keys in query strings.\nScopes (\u0060x-scopes\u0060): Full access (\u0060*\u0060) or a chosen set, fixed when the key is created.\n","x-scopes":{"*":"Full access \u2014 every scope below and any added later.","envelopes:read":"Read envelopes, their recipients, fields and documents list, and the audit trail (events, events/verify).","envelopes:write":"Create envelopes, add documents and recipients, place fields, send, correct and remind.","envelopes:void":"Void a sent envelope.","documents:download":"Download envelope documents, the signed PDF and the certificate of completion.","templates:read":"List and read templates.","templates:write":"Create and change templates.","files:read":"Read Company files and folders, versions, the change feed, search, links, grants and file requests (live keys only).","files:write":"Upload, rename, move, copy, trash and restore files and folders (live keys only).","sharing:write":"Create, change and remove grants, shared links and file requests (live keys only).","webhooks:manage":"Read and manage webhook endpoints, rotate secrets, send tests, read and redeliver deliveries."}}},"parameters":{"Limit":{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},"Cursor":{"name":"cursor","in":"query","schema":{"type":"string"}},"Expand":{"name":"expand","in":"query","description":"\u0060recipients\u0060, \u0060documents\u0060 or both: either one includes both lists in each envelope.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"string","enum":["recipients","documents"]}}},"IdempotencyKey":{"name":"Idempotency-Key","in":"header","schema":{"type":"string","maxLength":64}},"EnvelopeIdPath":{"name":"envelope_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/EnvelopeId"}},"RecipientIdPath":{"name":"recipient_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/RecipientId"}},"WebhookIdPath":{"name":"webhook_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/WebhookId"}},"TemplateIdPath":{"name":"template_id","in":"path","required":true,"schema":{"$ref":"#/components/schemas/TemplateId"}},"FolderIdPath":{"name":"folder_id","in":"path","required":true,"description":"A folder id; for reads and as a parent, \u0060company\u0060 is the Company files root.","schema":{"type":"string"}},"FileIdPath":{"name":"file_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"UploadTokenPath":{"name":"upload_token","in":"path","required":true,"description":"The \u0060upload_token\u0060 from starting the upload (signed; it expires).","schema":{"type":"string"}},"GrantIdPath":{"name":"grant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"LinkIdPath":{"name":"link_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},"FileRequestIdPath":{"name":"file_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}},"headers":{"RequestId":{"schema":{"type":"string"},"description":"Unique id for this request; quote it in support tickets."}},"responses":{"Problem":{"description":"Error (RFC 9457).","headers":{"SignAnything-Request-Id":{"$ref":"#/components/headers/RequestId"}},"content":{"application/problem\u002Bjson":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"Pdf":{"description":"The PDF.","content":{"application/pdf":{"schema":{"type":"string","contentMediaType":"application/pdf"}}}},"SignedRedirect":{"description":"Redirect to a short-lived (\u2264 5 min) signed storage URL.","headers":{"Location":{"schema":{"type":"string","format":"uri"}}}}},"schemas":{"EnvelopeId":{"type":"string","pattern":"^env_[A-Za-z0-9]\u002B$"},"DocumentId":{"type":"string","pattern":"^doc_[A-Za-z0-9]\u002B$"},"RecipientId":{"type":"string","pattern":"^rcp_[A-Za-z0-9]\u002B$"},"FieldId":{"type":"string","pattern":"^fld_[A-Za-z0-9]\u002B$"},"TemplateId":{"type":"string","pattern":"^tpl_[A-Za-z0-9]\u002B$"},"WebhookId":{"type":"string","pattern":"^whk_[A-Za-z0-9]\u002B$"},"EnvelopeStatus":{"type":"string","enum":["draft","sent","in_progress","completed","declined","voided","expired"]},"RecipientStatus":{"type":"string","description":"\u0060pending\u0060 = not their turn yet; \u0060reassigned\u0060 = they passed their turn to someone else.","enum":["pending","sent","viewed","signed","declined","auto_responded","reassigned","removed"]},"RecipientType":{"type":"string","enum":["signer","cc","in_person_signer","certified_delivery","approver"]},"DocumentScanStatus":{"type":"string","description":"The virus scan. \u0060pending\u0060 / \u0060failed\u0060 block downloads and sending until it finishes (\u0060409 scan_pending\u0060); \u0060infected\u0060 and \u0060mismatch\u0060 (the bytes aren\u0027t the file\u0027s type) are blocked (\u0060451 document_blocked\u0060; remove them before sending); \u0060unscannable\u0060 and \u0060too_large\u0060 are not scanned, not blocked.","enum":["pending","clean","infected","unscannable","too_large","failed","mismatch"]},"FieldType":{"type":"string","description":"\u0060checkbox\u0060 with \u0060options.options\u0060 is a group of boxes in one field; without it, a single box. \u0060calculated\u0060 is computed by SignAnything from other fields. \u0060approve\u0060 / \u0060decline\u0060 are buttons for the signer. \u0060attachment\u0060 takes files from the signer.","enum":["signature","initials","date_signed","name","email","phone","address","company","title","text","checkbox","dropdown","radio","calculated","approve","decline","attachment"]},"FieldRule":{"type":"object","required":["src","op"],"properties":{"src":{"type":"string","description":"The \u0060name\u0060 of another field of the same recipient."},"op":{"type":"string","enum":["checked","unchecked","is","isnot","contains","filled","empty","gt","gte","lt","lte","eq"]},"val":{"type":"string","description":"Text to compare; for radio / dropdown \u0060is\u0060/\u0060isnot\u0060 the option index, for \u0060gt\u0060\u2026\u0060eq\u0060 the option text; for checkbox \u0060any\u0060 or an option index."}}},"FieldOptions":{"type":"object","description":"The field\u0027s settings (camelCase keys; send only the ones that apply, absent keys take their defaults). Unknown keys are kept.","properties":{"tooltip":{"type":"string"},"options":{"type":"array","maxItems":50,"items":{"type":"string","maxLength":200},"description":"Choices of a checkbox group, dropdown or radio."},"rule":{"type":"string","enum":["any","atleast","atmost","exactly"],"default":"any","description":"Checkbox group."},"ruleN":{"type":"integer","minimum":1,"default":1},"defs":{"type":"array","items":{"type":"integer"},"description":"Checkbox group boxes ticked to start."},"def":{"type":"integer","default":-1,"description":"Radio / dropdown option selected to start (-1 none)."},"layout":{"type":"string","enum":["vertical","horizontal"],"default":"vertical"},"format":{"type":"string","enum":["MMM D, YYYY","MM/DD/YYYY","DD/MM/YYYY","YYYY-MM-DD"],"default":"MMM D, YYYY","description":"date_signed."},"placeholder":{"type":"string","description":"Text fields; with \u0060readonly\u0060 it is the text printed for everyone."},"readonly":{"type":"boolean","default":false},"multiline":{"type":"boolean","default":false},"validation":{"type":"string","enum":["none","number","email","phone","zip","zip4","ssn","custom"],"default":"none"},"regex":{"type":"string","maxLength":500},"regexMsg":{"type":"string"},"maxLen":{"type":"integer","minimum":0,"maximum":4000,"default":0},"fontFamily":{"type":"string","enum":["helvetica","times","courier"],"default":"helvetica"},"fontSize":{"type":"integer","minimum":4,"maximum":72,"default":11},"fontColor":{"type":"string","pattern":"^#[0-9A-Fa-f]{6}$","default":"#0E1726"},"bold":{"type":"boolean"},"italic":{"type":"boolean"},"underline":{"type":"boolean"},"comb":{"type":"boolean","description":"One character per cell (Courier); limits the length to combN."},"combN":{"type":"integer","minimum":1,"maximum":40,"default":9},"mask":{"type":"boolean","description":"Printed as asterisks on the signed copy."},"prefill":{"type":"boolean","default":true,"description":"Contact fields start with the recipient\u0027s own details."},"editable":{"type":"boolean","default":true,"description":"false = the recipient\u0027s name / email / phone are used as they are."},"reason":{"type":"boolean","default":true,"description":"Decline asks for a reason."},"types":{"type":"object","properties":{"pdf":{"type":"boolean","default":true},"img":{"type":"boolean","default":true},"doc":{"type":"boolean","default":false}}},"maxFiles":{"type":"integer","enum":[1,2,3,5,10],"default":3},"instructions":{"type":"string"},"tokens":{"type":"array","items":{"type":"object","required":["t"],"properties":{"t":{"type":"string","enum":["field","num","op","paren","fn"]},"key":{"type":"string"},"v":{"type":"string"}}}},"cfmt":{"type":"object","properties":{"kind":{"type":"string","enum":["currency","number","percent"]},"dec":{"type":"integer","minimum":0,"maximum":3}}},"showRules":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/FieldRule"},"description":"Only show this field when\u2026"},"showMode":{"type":"string","enum":["all","any"],"default":"all"},"reqRules":{"type":"array","maxItems":20,"items":{"$ref":"#/components/schemas/FieldRule"},"description":"Required only when\u2026"},"reqMode":{"type":"string","enum":["all","any"],"default":"all"}}},"SigningOrderMode":{"type":"string","enum":["parallel","serial","mixed"]},"Page":{"type":"object","required":["has_more"],"properties":{"has_more":{"type":"boolean"},"next_cursor":{"type":["string","null"]}}},"Problem":{"type":"object","required":["type","title","status","code"],"properties":{"type":{"type":"string","format":"uri"},"title":{"type":"string"},"status":{"type":"integer"},"code":{"type":"string","description":"Stable machine-readable error code."},"detail":{"type":"string"},"request_id":{"type":"string"},"feature":{"type":"string","description":"With \u0060402 plan_feature_required\u0060 (and \u0060sms_allowance_exhausted\u0060): the plan feature needed, e.g. \u0060sms\u0060, \u0060access_code\u0060."},"errors":{"type":["array","null"],"description":"Reserved for field-level problems; not filled today (the API front door\u0027s own errors send null, the services leave it out).","items":{"type":"object","required":["field","code"],"properties":{"field":{"type":"string"},"code":{"type":"string"}}}}}},"Envelope":{"type":"object","required":["id","object","livemode","status","subject","signing_order_mode","created_at"],"properties":{"id":{"$ref":"#/components/schemas/EnvelopeId"},"object":{"const":"envelope"},"livemode":{"type":"boolean"},"status":{"$ref":"#/components/schemas/EnvelopeStatus"},"subject":{"type":"string"},"message":{"type":["string","null"]},"signing_order_mode":{"$ref":"#/components/schemas/SigningOrderMode"},"template_id":{"$ref":"#/components/schemas/TemplateId","description":"The template version it was made from (left out otherwise)."},"external_ref":{"type":"string","description":"Your own reference, as given at create."},"expires_at":{"type":["string","null"],"format":"date-time"},"sent_at":{"type":["string","null"],"format":"date-time"},"completed_at":{"type":["string","null"],"format":"date-time"},"voided_at":{"type":["string","null"],"format":"date-time"},"voided_reason":{"type":["string","null"]},"created_at":{"type":"string","format":"date-time"},"updated_at":{"type":"string","format":"date-time"},"labels":{"description":"The sender\u0027s labels, in the order added.","type":"array","items":{"type":"string"}},"recipients":{"description":"Present when expanded.","type":"array","items":{"$ref":"#/components/schemas/Recipient"}},"documents":{"description":"Present when expanded.","type":"array","items":{"$ref":"#/components/schemas/Document"}}}},"EnvelopeCreate":{"type":"object","properties":{"subject":{"type":"string","description":"Defaults to \u0022Please sign\u0022 (with a template, \u0022Please sign: {template name}\u0022)."},"message":{"type":"string"},"expires_at":{"type":"string","format":"date-time","description":"When signing closes. Without it, the account\u0027s default expiry applies at send."},"external_ref":{"type":"string","description":"Your own reference; filter the list with \u0060external_ref\u0060. Template-based envelopes don\u0027t keep it."},"template_id":{"$ref":"#/components/schemas/TemplateId"},"roles":{"description":"With \u0060template_id\u0060, assigns people to the template\u0027s roles (older form of \u0060recipients\u0060 with \u0060role\u0060).","type":"array","items":{"type":"object","required":["role_name","name","email"],"properties":{"role_name":{"type":"string"},"name":{"type":"string"},"email":{"type":"string","format":"email"}}}},"prefill":{"description":"With \u0060template_id\u0060, text values keyed by data field key (older name of \u0060data\u0060).","type":"object","additionalProperties":{"type":"string"}},"data":{"description":"With \u0060template_id\u0060, the template\u0027s data keyed by data field key (see the template\u0027s \u0060data_schema\u0060). Send values exactly as they should print (e.g. \u0022$1,250.00\u0022); Yes/No fields take true / false. A table takes \u0060{ \u0022rows\u0022: [[cell, \u2026, roles]], \u0022columns\u0022?, \u0022title\u0022?, \u0022footer\u0022? }\u0060 (with an Initials column, the cell after the last column names who initials the row: a role, a list of roles \u2014 one initials box each \u2014 or null); each column prints its values in the template\u0027s format (number, currency, date; see the data_schema\u0027s \u0060x-skanything-columns\u0060). A checkbox / radio group whose options come from the API takes \u0060{ \u0022options\u0022: [{ \u0022label\u0022, \u0022value\u0022, \u0022selected\u0022 }] }\u0060. Calculated values (which can sum table columns) are computed from this data and never sent. A missing required value \u2014 including one required only when a condition holds \u2014 rejects the call with the list of missing keys; optional (?) tags and fields hidden by their condition print nothing.","type":"object","additionalProperties":true},"signing_order":{"description":"With \u0060template_id\u0060, overrides the template\u0027s signing order.","type":"string","enum":["parallel","serial","groups"]},"recipients":{"description":"Without \u0060template_id\u0060, the envelope\u0027s recipients. With \u0060template_id\u0060, one entry per role (\u0060{ \u0022role\u0022, \u0022name\u0022, \u0022email\u0022 }\u0060, as the template editor\u0027s API tab shows); a role whose condition is false needs no one.","type":"array","items":{"$ref":"#/components/schemas/RecipientInput"}},"send":{"type":"boolean","default":false,"description":"Send immediately after creation (template-based envelopes only)."},"labels":{"$ref":"#/components/schemas/Labels"}}},"EnvelopeUpdate":{"type":"object","description":"Fields left out keep their value.","properties":{"subject":{"type":"string"},"message":{"type":"string"},"expires_at":{"type":"string","format":"date-time","description":"Must be in the future (\u0060422 invalid_expiry\u0060)."},"labels":{"$ref":"#/components/schemas/Labels"}}},"Labels":{"description":"The envelope\u0027s labels (the whole list): up to 10, each up to 40 characters; spaces trimmed, blanks and repeats (ignoring case) dropped. A label the account already uses keeps its first spelling.","type":"array","maxItems":10,"items":{"type":"string","maxLength":40}},"Language":{"description":"The language the recipient\u0027s emails, texts and signing page are in.","type":"string","enum":["en-US","en-GB","es-419","es-ES","fr-FR","it-IT","nl-NL","de-DE"]},"Delivery":{"description":"How the signing link reaches them. \u0060sms\u0060 and \u0060both\u0060 need the plan\u0027s \u0060sms\u0060 feature and a \u0060phone\u0060.","type":"string","enum":["email","sms","both"]},"Document":{"type":"object","required":["id","object","name","sort_order","page_count","byte_size"],"properties":{"id":{"$ref":"#/components/schemas/DocumentId"},"object":{"const":"document"},"name":{"type":"string"},"sort_order":{"type":"integer"},"page_count":{"type":"integer"},"byte_size":{"type":"integer","format":"int64"},"scan_status":{"$ref":"#/components/schemas/DocumentScanStatus"}}},"DocumentList":{"type":"object","required":["object","data","has_more"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Document"}},"has_more":{"const":false}}},"RecipientInput":{"type":"object","required":["name"],"properties":{"recipient_type":{"$ref":"#/components/schemas/RecipientType","default":"signer"},"name":{"type":"string","maxLength":200},"email":{"type":"string","format":"email","description":"Required, except for an in-person signer or \u0060delivery: sms\u0060."},"order_group":{"type":"integer","minimum":1,"default":1,"description":"Signing order; the same number signs at the same time."},"role":{"type":"string","description":"With \u0060template_id\u0060 on create: the template role this person fills."},"signing_capacity":{"type":["string","null"],"maxLength":120,"description":"Signers and approvers: what they sign as, e.g. \u0022Director, Northline Ltd\u0022. They see it read-only; the certificate says \u0022Signing as {capacity}\u0022. On PATCH, \u0022\u0022 clears it."},"phone":{"type":"string","pattern":"^\\\u002B[1-9]\\d{6,14}$","description":"Mobile number in E.164 (\u002B15125550199). Needed for \u0060delivery\u0060 sms / both and for \u0060require_text_code\u0060. On PATCH, \u0022\u0022 clears it."},"delivery":{"$ref":"#/components/schemas/Delivery","default":"email"},"require_text_code":{"type":"boolean","default":false,"description":"Identity check: a code texted to \u0060phone\u0060 before they can open the envelope (needs the plan\u0027s \u0060sms\u0060 feature). Not with \u0060access_pin\u0060. Copies (cc) need no check."},"access_pin":{"type":"string","writeOnly":true,"pattern":"^\\d{4,8}$","description":"Identity check: a PIN of 4\u20138 digits you give them separately (needs the plan\u0027s \u0060access_code\u0060 feature). Stored as a salted hash and NEVER returned (see \u0060access_pin_set\u0060). Not with \u0060require_text_code\u0060. On PATCH, \u0022\u0022 removes it."},"language":{"$ref":"#/components/schemas/Language","default":"en-US"},"allow_reassign":{"type":"boolean","default":false,"description":"They may hand their part to someone else."}}},"Recipient":{"type":"object","required":["id","object","recipient_type","name","order_group","status"],"properties":{"id":{"$ref":"#/components/schemas/RecipientId"},"object":{"const":"recipient"},"recipient_type":{"$ref":"#/components/schemas/RecipientType"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"order_group":{"type":"integer"},"status":{"$ref":"#/components/schemas/RecipientStatus"},"signing_capacity":{"type":"string","description":"What they sign as (signers and approvers; left out when none)."},"phone":{"type":"string","description":"Their mobile number (E.164; left out when none)."},"delivery":{"$ref":"#/components/schemas/Delivery"},"require_text_code":{"type":"boolean"},"access_pin_set":{"type":"boolean","description":"An access PIN is set (the PIN itself is never returned)."},"language":{"$ref":"#/components/schemas/Language"},"allow_reassign":{"type":"boolean"},"sent_at":{"type":"string","format":"date-time"},"viewed_at":{"type":"string","format":"date-time"},"signed_at":{"type":"string","format":"date-time"},"declined_at":{"type":"string","format":"date-time"},"declined_reason":{"type":"string"}}},"RecipientList":{"type":"object","required":["object","data","has_more"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Recipient"}},"has_more":{"const":false}}},"FieldInput":{"type":"object","required":["recipient_id","document_id","field_type","page","x","y","width","height"],"properties":{"recipient_id":{"$ref":"#/components/schemas/RecipientId"},"document_id":{"$ref":"#/components/schemas/DocumentId"},"field_type":{"$ref":"#/components/schemas/FieldType"},"label":{"type":"string","maxLength":200},"page":{"type":"integer","minimum":1},"x":{"type":"number","description":"PDF points from the page\u0027s top-left."},"y":{"type":"number","description":"PDF points from the page\u0027s top-left."},"width":{"type":"number","exclusiveMinimum":0},"height":{"type":"number","exclusiveMinimum":0},"required":{"type":"boolean","default":true},"name":{"type":["string","null"],"pattern":"^[a-z0-9_.]{1,64}$","description":"The field\u0027s key (unique per envelope; used by conditions and formulas)."},"options":{"$ref":"#/components/schemas/FieldOptions"}}},"Field":{"allOf":[{"$ref":"#/components/schemas/FieldInput"},{"type":"object","required":["id","object"],"properties":{"id":{"$ref":"#/components/schemas/FieldId"},"object":{"const":"field"}}}]},"FieldList":{"type":"object","required":["object","data","has_more"],"properties":{"object":{"const":"list"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Field"}},"has_more":{"const":false}}},"TemplateSummary":{"type":"object","required":["id","object","name","has_draft","roles","updated_at","kind","document_count"],"properties":{"id":{"$ref":"#/components/schemas/TemplateId"},"object":{"const":"template"},"name":{"type":"string"},"latest_version":{"type":"integer","description":"The latest published version (left out until the template is published)."},"published_at":{"type":"string","format":"date-time"},"has_draft":{"type":"boolean","description":"Unpublished changes exist (the API reads only published versions)."},"roles":{"type":"array","items":{"type":"string"},"description":"Role names."},"updated_at":{"type":"string","format":"date-time"},"kind":{"type":"string","enum":["docx","pdf","mixed"]},"document_count":{"type":"integer"}}},"Template":{"type":"object","required":["id","object","name","kind","version","documents","roles","data_fields"],"properties":{"id":{"$ref":"#/components/schemas/TemplateId"},"object":{"const":"template"},"name":{"type":"string"},"description":{"type":"string"},"kind":{"type":"string","enum":["docx","pdf","mixed"],"description":"docx or pdf when every document is that kind; mixed otherwise."},"version":{"type":"integer","description":"The published version described."},"published_at":{"type":"string","format":"date-time"},"signing_order":{"type":"string","enum":["parallel","serial","groups"],"description":"Templates with Word documents; override it with \u0060signing_order\u0060 on create."},"documents":{"type":"array","description":"The template\u0027s documents in order (a template can hold several, Word and / or PDF). An envelope made from it has these documents in this order.","items":{"type":"object","required":["position","name","kind"],"properties":{"position":{"type":"integer","minimum":1},"name":{"type":"string"},"kind":{"type":"string","enum":["docx","pdf"]},"page_count":{"type":"integer","description":"PDF documents only (a Word document\u0027s pages depend on the data)."}}}},"roles":{"type":"array","items":{"type":"object","required":["name","order_group","required"],"properties":{"name":{"type":"string","description":"The role; name it in \u0060recipients[].role\u0060 on create."},"order_group":{"type":"integer"},"required":{"type":"boolean"},"include_when":{"description":"The condition on the data that includes this role; a role whose condition is false needs no one."}}}},"data_fields":{"type":"array","description":"The data the template takes (\u0060data\u0060 on create); tables and API-filled groups are in \u0060data_schema\u0060.","items":{"type":"object","required":["key","type","required"],"properties":{"key":{"type":"string"},"label":{"type":"string"},"type":{"type":"string"},"required":{"type":"boolean"},"sample":{"type":"string"}}}},"fields":{"type":"array","description":"Fields placed on the PDF documents (left out when there are none).","items":{"type":"object","properties":{"document":{"type":"integer","minimum":1,"description":"Position of the PDF document the field is placed on."},"role":{"type":"string"},"field_type":{"$ref":"#/components/schemas/FieldType"},"label":{"type":"string"},"page":{"type":"integer"},"x":{"type":"number","description":"PDF points from the page\u0027s top-left."},"y":{"type":"number","description":"PDF points from the page\u0027s top-left."},"width":{"type":"number"},"height":{"type":"number"},"required":{"type":"boolean"},"name":{"type":"string"},"options":{"$ref":"#/components/schemas/FieldOptions"}}}}}},"AuditEvent":{"type":"object","required":["id","object","type","actor_type","occurred_at","hash"],"properties":{"id":{"type":"string","pattern":"^evt_[0-9]\u002B$"},"object":{"const":"event"},"type":{"type":"string","description":"The event, e.g. \u0060envelope_created\u0060, \u0060envelope_sent\u0060, \u0060recipient_sent\u0060, \u0060recipient_viewed\u0060, \u0060recipient_signed\u0060, \u0060recipient_declined\u0060, \u0060reminder_sent\u0060, \u0060envelope_voided\u0060, \u0060envelope_completed\u0060. New types are added over time; tolerate ones you don\u0027t know."},"actor_type":{"type":"string","description":"Who acted, e.g. \u0060user\u0060, \u0060api\u0060, \u0060recipient\u0060, \u0060system\u0060."},"actor_email":{"type":"string"},"recipient_id":{"$ref":"#/components/schemas/RecipientId"},"ip":{"type":"string"},"occurred_at":{"type":"string","format":"date-time"},"data":{"type":"object","description":"The event\u0027s details."},"hash":{"type":"string","description":"Hex SHA-256 of this event in the envelope\u0027s hash chain."}}},"WebhookEventType":{"type":"string","enum":["envelope.sent","envelope.completed","envelope.declined","envelope.voided","envelope.expired","recipient.sent","recipient.viewed","recipient.signed","recipient.declined","recipient.auth_failed","recipient.reassigned","ping","file.created","file.version_added","file.renamed","file.moved","file.trashed","file.restored","file.deleted","file.infected","folder.created","folder.renamed","folder.moved","folder.trashed","folder.restored","folder.deleted","share.added","share.changed","share.removed","link.created","link.changed","link.disabled","file_request.uploaded"]},"WebhookEventFilter":{"type":"array","description":"The events to send, or [\u0022*\u0022] for every event, including any added later. Empty or left out on create: every event.","items":{"oneOf":[{"$ref":"#/components/schemas/WebhookEventType"},{"const":"*"}]}},"WebhookCreate":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","pattern":"^https://","description":"HTTPS to a public address."},"event_filter":{"$ref":"#/components/schemas/WebhookEventFilter"},"description":{"type":"string"}}},"WebhookUpdate":{"type":"object","properties":{"url":{"type":"string","format":"uri","pattern":"^https://"},"event_filter":{"$ref":"#/components/schemas/WebhookEventFilter"},"description":{"type":"string"},"enabled":{"type":"boolean"}}},"Webhook":{"type":"object","required":["id","object","url","event_filter","enabled","livemode","consecutive_failures","created_at"],"properties":{"id":{"$ref":"#/components/schemas/WebhookId"},"object":{"const":"webhook"},"url":{"type":"string","format":"uri"},"event_filter":{"$ref":"#/components/schemas/WebhookEventFilter"},"enabled":{"type":"boolean"},"livemode":{"type":"boolean","description":"The key mode it was made with; it receives only events of that mode."},"description":{"type":"string"},"last_delivery_at":{"type":"string","format":"date-time"},"consecutive_failures":{"type":"integer"},"disabled_reason":{"type":"string","description":"Why it was turned off (on the 21st failed attempt in a row)."},"created_at":{"type":"string","format":"date-time"},"secret_last4":{"type":"string","description":"The signing secret\u0027s last four characters, for telling secrets apart (whsec_\u2022\u2022\u2022\u20227Gk2)."},"secret_rotated_at":{"type":"string","format":"date-time","description":"When the secret was last rotated. Left out if it never was."},"previous_secret_expires_at":{"type":"string","format":"date-time","description":"After a rotation, the old secret keeps signing (alongside the new one) until this time, 24 hours after rotating."}}},"WebhookWithSecret":{"allOf":[{"$ref":"#/components/schemas/Webhook"},{"type":"object","required":["secret"],"properties":{"secret":{"type":"string","description":"Signing secret, shown only in this answer."}}}]},"WebhookAttempt":{"type":"object","required":["queued","delivered"],"properties":{"queued":{"type":"boolean","description":"True while the event still waits for a retry."},"delivered":{"type":"boolean","description":"The endpoint answered 2xx just now."},"response_status":{"type":"integer","description":"The HTTP status the endpoint answered; left out when it didn\u0027t answer within 5 seconds."},"event_id":{"type":"string","description":"Send test only: the test event."},"delivery_id":{"type":"string"}}},"WebhookDelivery":{"type":"object","required":["id","object","event_id","event_type","attempt_count","created_at"],"properties":{"id":{"type":"string","pattern":"^dlv_[A-Za-z0-9]\u002B$"},"object":{"const":"webhook_delivery"},"event_id":{"type":"string"},"event_type":{"$ref":"#/components/schemas/WebhookEventType"},"response_status":{"type":"integer"},"response_body":{"type":"string","description":"Truncated to 4 KB."},"response_ms":{"type":"integer","description":"How long the latest attempt took, in milliseconds (until the answer, or until it gave up)."},"response_size":{"type":"integer","description":"The size in bytes of the endpoint\u0027s whole answer body (response_body keeps the first 4 KB). Absent when it didn\u0027t answer."},"attempt_count":{"type":"integer"},"delivered_at":{"type":"string","format":"date-time"},"next_attempt_at":{"type":"string","format":"date-time"},"gave_up_at":{"type":"string","format":"date-time"},"created_at":{"type":"string","format":"date-time"}}},"WebhookEvent":{"type":"object","required":["id","type","created","livemode","api_version","data"],"properties":{"id":{"type":"string","pattern":"^evt_[A-Za-z0-9]\u002B$"},"object":{"const":"event"},"type":{"$ref":"#/components/schemas/WebhookEventType"},"created":{"type":"string","format":"date-time"},"livemode":{"type":"boolean"},"api_version":{"const":"v1"},"test":{"const":true,"description":"Only on events sent with Send test (sample data, sample ids); left out of real events."},"data":{"type":"object","required":["object"],"properties":{"object":{"description":"The envelope (or, for file events, the item) as the API shows it. No file bytes.","type":"object"}}}}},"Account":{"type":"object","required":["object","plan","billing_status","seats"],"description":"Null values are kept (not left out) in this answer.","properties":{"object":{"const":"account"},"plan":{"type":"string","description":"The plan key, e.g. \u0060individual\u0060, \u0060business\u0060; \u0060none\u0060 without a subscription."},"billing_status":{"type":"string","enum":["none","trialing","active","past_due","suspended","canceled"]},"seats":{"type":"integer"},"current_period_start":{"type":["string","null"],"format":"date-time"},"current_period_end":{"type":["string","null"],"format":"date-time"},"cancel_at_period_end":{"type":"boolean"},"included_envelopes":{"type":["integer","null"],"description":"Envelopes included this period; null = unlimited."},"included_used_this_period":{"type":"integer"},"included_remaining_this_period":{"type":["integer","null"],"description":"null = unlimited."},"pack_envelopes_remaining":{"type":"integer","description":"Envelopes left in bought packs."}}},"ScanStatus":{"type":"string","enum":["pending","clean","infected","unscannable","too_large","failed"],"description":"Only \u0060clean\u0060, \u0060unscannable\u0060 and \u0060too_large\u0060 files can be opened; the last two are labelled\nnot scanned, not blocked. \u0060infected\u0060 files are quarantined.\n"},"FileItem":{"type":"object","required":["id","type","name","tree","space","created_at","modified_at"],"properties":{"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["file","folder"]},"name":{"type":"string"},"tree":{"type":"string","enum":["keep","sign"],"description":"\u0060keep\u0060 = KeepAnything files; \u0060sign\u0060 = a file kept in a SignAnything folder."},"folder_id":{"type":"string","format":"uuid","description":"The parent folder (none for a root)."},"sign_folder_id":{"type":"string","format":"uuid"},"space":{"type":"string","enum":["personal","company"]},"size":{"type":"integer","format":"int64","description":"Bytes (files)."},"content_type":{"type":"string"},"version_id":{"type":"string","format":"uuid","description":"The current version (files)."},"sha256":{"type":"string","pattern":"^[0-9a-f]{64}$"},"scan_status":{"$ref":"#/components/schemas/ScanStatus"},"scan_label":{"type":"string","description":"Shown to people, e.g. \u0022Not scanned (too large)\u0022."},"created_at":{"type":"string","format":"date-time"},"modified_at":{"type":"string","format":"date-time"},"trashed_at":{"type":"string","format":"date-time"},"sharing_limit":{"$ref":"#/components/schemas/FolderSharingLimit"}}},"FolderSharingLimit":{"type":"object","readOnly":true,"description":"A folder\u0027s sharing limit (folders from the Folders endpoints only). Read only: a person with Manage access sets it in the\nconsole. A folder can only narrow what the company allows, for itself and everything under it. While a limit is on, new\nshares it forbids are refused (\u0060403 folder_limit\u0060), and outside-person shares, links and file requests already made are\npaused (not deleted) until it is lifted.\n","required":["limit_external","limit_links","effective_limit_external","effective_limit_links"],"properties":{"limit_external":{"type":"boolean","description":"This folder\u0027s own limit: no sharing with people outside the company."},"limit_links":{"type":["string","null"],"enum":["off","company",null],"description":"This folder\u0027s own link limit: \u0060off\u0060 (no links), \u0060company\u0060 (people in the company only), or null (as the company allows)."},"effective_limit_external":{"type":"boolean","description":"The strictest outside-people limit on this folder or any folder above it."},"effective_limit_links":{"type":["string","null"],"enum":["off","company",null],"description":"The strictest link limit on this folder or any folder above it."}}},"FileItemUpdate":{"type":"object","properties":{"name":{"type":"string","minLength":1,"description":"A name already taken in the folder gets a number."},"parent_id":{"type":"string","format":"uuid","description":"The folder to move it into (or copy it into)."}}},"FileVersion":{"type":"object","required":["id","version_no","size","sha256","uploaded_via","uploaded_at","scan_status","current"],"properties":{"id":{"type":"string","format":"uuid"},"version_no":{"type":"integer"},"size":{"type":"integer","format":"int64"},"sha256":{"type":"string"},"content_type":{"type":"string"},"uploaded_by_name":{"type":"string"},"uploaded_by_email":{"type":"string","format":"email"},"uploaded_via":{"type":"string","enum":["web","device","api","request","copy","restore"]},"device_id":{"type":"string"},"uploaded_at":{"type":"string","format":"date-time"},"client_modified_at":{"type":"string","format":"date-time"},"scan_status":{"$ref":"#/components/schemas/ScanStatus"},"scan_result":{"type":"string"},"scanned_at":{"type":"string","format":"date-time"},"restored_from_version_id":{"type":"string","format":"uuid"},"current":{"type":"boolean"}}},"UploadStart":{"type":"object","required":["size","sha256"],"description":"A new file (\u0060folder_id\u0060 and \u0060name\u0060) or a new version of a file (\u0060file_id\u0060).","properties":{"folder_id":{"type":"string","default":"company","description":"The folder\u0027s id, or \u0060company\u0060 (the Company files root)."},"file_id":{"type":"string","format":"uuid","description":"Upload a new version of this file."},"name":{"type":"string"},"size":{"type":"integer","format":"int64","minimum":0},"sha256":{"type":"string","pattern":"^[0-9a-fA-F]{64}$"},"base_version_id":{"type":"string","format":"uuid","description":"The version this one is based on (conflict detection)."},"client_modified_at":{"type":"string","format":"date-time"},"content_type":{"type":"string"}}},"UploadPartUrl":{"type":"object","required":["number","url"],"properties":{"number":{"type":"integer"},"url":{"type":"string","format":"uri"}}},"UploadStarted":{"type":"object","required":["status"],"properties":{"status":{"type":"string","enum":["upload","done"]},"file":{"$ref":"#/components/schemas/FileItem"},"upload_token":{"type":"string"},"part_size":{"type":"integer","format":"int64"},"part_count":{"type":"integer"},"url":{"type":"string","format":"uri","description":"One \u0060PUT\u0060 for the whole file (small files)."},"parts":{"type":"array","items":{"$ref":"#/components/schemas/UploadPartUrl"}},"conflict":{"type":"string"}}},"FilePermission":{"type":"string","enum":["view","contribute","manage"]},"GrantInput":{"type":"object","required":["item_id","principal_type","permission"],"properties":{"item_id":{"type":"string","format":"uuid","description":"The folder or file to share."},"principal_type":{"type":"string","enum":["user","group","team","everyone","email"]},"principal_id":{"type":"string","format":"uuid","description":"For \u0060user\u0060, \u0060group\u0060 and \u0060team\u0060."},"principal_email":{"type":"string","format":"email","description":"For \u0060email\u0060."},"permission":{"$ref":"#/components/schemas/FilePermission"}}},"Grant":{"type":"object","required":["id","principal_type","permission","granted_at","inherited"],"properties":{"id":{"type":"string","format":"uuid"},"folder_id":{"type":"string","format":"uuid"},"file_id":{"type":"string","format":"uuid"},"from_name":{"type":"string","description":"The folder it is inherited from, when \u0060inherited\u0060."},"principal_type":{"type":"string","enum":["user","group","team","everyone","email"]},"principal_id":{"type":"string","format":"uuid"},"principal_email":{"type":"string","format":"email"},"permission":{"$ref":"#/components/schemas/FilePermission"},"granted_by_user_id":{"type":"string","format":"uuid"},"granted_by_name":{"type":"string"},"granted_at":{"type":"string","format":"date-time"},"inherited":{"type":"boolean"}}},"LinkInput":{"type":"object","properties":{"expires_at":{"type":"string","format":"date-time","description":"Within the company\u0027s maximum link lifetime."},"password":{"type":"string"},"allow_download":{"type":"boolean"},"audience":{"type":"string","enum":["anyone","company"],"default":"anyone"}}},"Link":{"type":"object","required":["id","item_name","token_hint","audience","has_password","allow_download","created_at","views","downloads"],"properties":{"id":{"type":"string","format":"uuid"},"folder_id":{"type":"string","format":"uuid"},"file_id":{"type":"string","format":"uuid"},"item_name":{"type":"string"},"url":{"type":"string","format":"uri","description":"Only in the answer that created the link."},"token_hint":{"type":"string"},"audience":{"type":"string","enum":["anyone","company"]},"expires_at":{"type":"string","format":"date-time"},"has_password":{"type":"boolean"},"allow_download":{"type":"boolean"},"created_by_name":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"disabled_at":{"type":"string","format":"date-time"},"disabled_reason":{"type":"string","enum":["owner","takedown","policy"]},"views":{"type":"integer","format":"int64"},"downloads":{"type":"integer","format":"int64"}}},"FileRequestInput":{"type":"object","properties":{"folder_id":{"type":"string","format":"uuid","description":"The folder uploads go into."},"title":{"type":"string"},"instructions":{"type":"string"},"expires_at":{"type":"string","format":"date-time"},"max_files":{"type":"integer","minimum":1},"max_file_size_mb":{"type":"integer","minimum":1},"require_email_code":{"type":"boolean","description":"Uploaders confirm their email address with a code."},"password":{"type":"string"},"remove_password":{"type":"boolean"}}},"FileRequest":{"type":"object","required":["id","folder_id","folder_name","title","require_email_code","has_password","token_hint","created_at","uploads"],"properties":{"id":{"type":"string","format":"uuid"},"folder_id":{"type":"string","format":"uuid"},"folder_name":{"type":"string"},"title":{"type":"string"},"instructions":{"type":"string"},"url":{"type":"string","format":"uri","description":"Only in the answer that created the request."},"expires_at":{"type":"string","format":"date-time"},"max_files":{"type":"integer"},"max_file_size_mb":{"type":"integer"},"require_email_code":{"type":"boolean"},"has_password":{"type":"boolean"},"token_hint":{"type":"string"},"created_at":{"type":"string","format":"date-time"},"closed_at":{"type":"string","format":"date-time"},"uploads":{"type":"integer","format":"int64"}}},"ChangePage":{"type":"object","required":["items","has_more","reset"],"properties":{"items":{"type":"array","items":{"type":"object","required":["op","id","type"],"properties":{"op":{"type":"string","enum":["upsert","remove"]},"id":{"type":"string","format":"uuid"},"type":{"type":"string","enum":["file","folder"]},"item":{"$ref":"#/components/schemas/FileItem"},"reason":{"type":"string","enum":["trashed","out_of_scope"],"description":"Why it was removed (\u0060remove\u0060)."}}}},"cursor":{"type":"string","description":"For the next call (\u0060cursor\u0060): the listing\u0027s last page and every changes page."},"next_page":{"type":"string","description":"For the next page of the listing (\u0060page\u0060)."},"has_more":{"type":"boolean"},"reset":{"type":"boolean","description":"The key\u0027s access changed: list again without a cursor."}}}}}}