API v1.0.0 · https://api.readyink.ai/v1
Reference

API reference

Every endpoint in v1.0.0, generated from the OpenAPI spec. Prefer to try requests in the browser? Use the interactive reference.

All requests need Authorization: Bearer <key>. Every endpoint can also return 401 (missing_key, invalid_key) and 429 (rate_limited); these are left out below to keep things short. See errors.

Account

Get the account and token balance

GET/account

Responses

200The account the key belongs to

Example

cURLRequest
curl https://api.readyink.ai/v1/account \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "object": "account",
  "name": "Acme Property Co.",
  "plan": "pay_as_you_go",
  "mode": "live",
  "key_name": "Production server",
  "balance": {
    "available": 57,
    "reserved": 0,
    "monthly": 0
  },
  "tokens_per_recipient": 1
}

Documents

List documents (newest first)

GET/documents

Parameters

NameTypeDescription
limitin queryintegerDefault 20 · 1–100
starting_afterin querystringThe next_cursor from the previous page
statusin querystringOne of draft, sending, out, completed, declined, cancelled, send_failed
created_afterin querystringOnly documents created after this time date-time

Responses

200A page of documents
422Invalid input (invalid_limit, invalid_date, invalid)

Example

cURLRequest
curl https://api.readyink.ai/v1/documents \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "object": "list",
  "data": [
    {
      "id": "doc_c9x1q8",
      "object": "document",
      "title": "Mutual NDA",
      "status": "draft",
      "test_mode": false,
      "signing_mode": "parallel",
      "reminder_days": 1,
      "file_status": "awaiting_upload",
      "file_error": null,
      "page_count": 2,
      "readyink_id": "RI-7Q4K-2M9D",
      "send_error": null,
      "cost": {
        "signers": 1,
        "tokens": 1
      },
      "version_hash": "9f2c\u2026e41a",
      "final_hash": "b71d\u202609cc",
      "created_at": "2026-11-09T15:04:05Z",
      "sent_at": null,
      "completed_at": null,
      "delete_after": null,
      "recipients": [
        null
      ],
      "fields": [
        null
      ]
    }
  ],
  "has_more": false,
  "next_cursor": "doc_b81kz2"
}

Create a draft

POST/documents

Create a draft, optionally with the PDF (multipart file) and recipients. All or nothing: if any part fails, nothing is created. With a PDF, file_status starts as processing and becomes ready within seconds; add fields once it's ready.

Request body

Content type: application/json, multipart/form-data

NameTypeDescription
titlestringmax length 200 · min length 1
signing_modestringOne of "parallel", "sequential" · Default "parallel"
reminder_daysinteger or nullOne of 1, 3, 7, null · Default 7
recipientsarray of RecipientInputmax items 50

Or multipart/form-data

NameTypeDescription
filestringThe PDF (up to 25 MB) binary
datarequiredstringThe JSON body (DocumentCreate) as a string

Responses

201The new draft
400Unreadable body (invalid_json, invalid_multipart)
409Conflict (duplicate_email)
413The PDF is too big (file_too_large)
422Invalid input (validation_failed, invalid_recipient, empty_file, not_a_pdf)

Example

cURLRequest
curl https://api.readyink.ai/v1/documents \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title": "NDA", "recipients": [{"name": "Ana Diaz", "email": "ana@example.com"}]}'
JSONResponse · 201
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Get a document

GET/documents/{id}

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Responses

200The document
404No such document, recipient or field in this mode

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8 \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Change title, signing mode or reminders

PATCH/documents/{id}

title and signing_mode change on drafts; reminder_days also while the document is out.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Request body

Content type: application/json

NameTypeDescription
titlestringmax length 200 · min length 1
signing_modestringOne of "parallel", "sequential" · Default "parallel"
reminder_daysinteger or nullOne of 1, 3, 7, null · Default 7

Responses

200The document
404No such document, recipient or field in this mode
409Conflict (not_editable, bad_state)
422Invalid input (validation_failed, invalid)

Example

cURLRequest
curl -X PATCH https://api.readyink.ai/v1/documents/doc_c9x1q8 \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"reminder_days": 3}'
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Delete a draft

DELETE/documents/{id}

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Responses

200Deleted
404No such document, recipient or field in this mode
409Conflict (not_editable: sent documents can be cancelled instead)

Example

cURLRequest
curl -X DELETE https://api.readyink.ai/v1/documents/doc_c9x1q8 \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "deleted": true
}

Upload the PDF

POST/documents/{id}/file

For a draft created without a PDF. Multipart file, or the raw bytes with Content-Type: application/pdf. Once per document.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Request body

Content type: multipart/form-data, application/pdf

NameTypeDescription
filerequiredstringThe PDF (up to 25 MB) binary

Responses

200The document, with file_status: processing
404No such document, recipient or field in this mode
409Conflict (bad_state: the PDF was already uploaded; not_editable)
413The PDF is too big (file_too_large)
415Use multipart/form-data or application/pdf
422Invalid input (empty_file, not_a_pdf, missing_file)

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8/file \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -F "file=@contract.pdf"
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Recipients

Add a recipient (drafts)

POST/documents/{id}/recipients

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Request body

Content type: application/json

NameTypeDescription
namerequiredstring
emailrequiredstringemail
mobilestringUS mobile number; needed for sms or both
notify_viastringOne of "email", "sms", "both" · Default "email"
rolestringcopy recipients get the signed copy, sign nothing and cost nothing One of "signer", "copy" · Default "signer"

Responses

201The document
404No such document, recipient or field in this mode
409Conflict (not_editable, duplicate_email)
422Invalid input (validation_failed, invalid)

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8/recipients \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Ana Diaz", "email": "ana@example.com"}'
JSONResponse · 201
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Change a recipient

PATCH/documents/{id}/recipients/{rid}

On a draft, send the full recipient. On a document that's out, send exactly {"email": "…"}: the old link stops working and a new request goes to the new address.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8
ridrequiredin pathstringThe recipient ID, like rcp_def456

Request body

Content type: application/json

Send one of these shapes:

RecipientInput

NameTypeDescription
namerequiredstring
emailrequiredstringemail
mobilestringUS mobile number; needed for sms or both
notify_viastringOne of "email", "sms", "both" · Default "email"
rolestringcopy recipients get the signed copy, sign nothing and cost nothing One of "signer", "copy" · Default "signer"

RecipientEmailChange

NameTypeDescription
emailrequiredstringemail

Responses

200The document
404No such document, recipient or field in this mode
409Conflict (not_editable, duplicate_email, bad_state)
422Invalid input (validation_failed, invalid)

Example

cURLRequest
curl -X PATCH https://api.readyink.ai/v1/documents/doc_c9x1q8/recipients/rcp_def456 \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "ana.diaz@example.com"}'
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Remove a recipient (drafts; their fields go too)

DELETE/documents/{id}/recipients/{rid}

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8
ridrequiredin pathstringThe recipient ID, like rcp_def456

Responses

200The document
404No such document, recipient or field in this mode
409Conflict (not_editable)

Example

cURLRequest
curl -X DELETE https://api.readyink.ai/v1/documents/doc_c9x1q8/recipients/rcp_def456 \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Fields

Add one field or many

POST/documents/{id}/fields

Send one field, or up to 200 as {"fields": [...]}. All or nothing. The pages must be ready (file_status: ready). Positions are 0–1 fractions of the page from the top-left corner.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Request body

Content type: application/json

Send one of these shapes:

FieldInput

NameTypeDescription
typerequiredstringOne of "signature", "initials", "date", "name", "email", "phone", "company", "job_title", "address", "website", "short_text", "long_text", "number", "dropdown", "single_choice", "multiple_choice"
recipient_idrequiredstring
pagerequiredintegermin 1
xrequirednumberLeft edge, fraction of page width min 0 · max 1
yrequirednumberTop edge, fraction of page height min 0 · max 1
wrequirednumbermin 0 · max 1
hrequirednumbermin 0 · max 1
requiredbooleanDefault true
optionsobjectText types: placeholder, maxLength, prefill. number: min, max, decimals. dropdown, single_choice, multiple_choice: choices (required). Others: {}.

Batch: {"fields": [ … ]} (1–200 items)

Responses

201The document
404No such document, recipient or field in this mode
409Conflict (file_not_ready, not_editable)
422Invalid input (invalid_field, invalid_fields)

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8/fields \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"fields": [{"type": "signature", "recipient_id": "rcp_def456", "page": 1, "x": 0.1, "y": 0.8, "w": 0.28, "h": 0.035}]}'
JSONResponse · 201
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Move, resize or change a field (drafts)

PATCH/documents/{id}/fields/{fid}

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8
fidrequiredin pathstringThe field ID, like fld_9q2k

Request body

Content type: application/json

NameTypeDescription
recipient_idstring
pageintegermin 1
xnumbermin 0 · max 1
ynumbermin 0 · max 1
wnumbermin 0 · max 1
hnumbermin 0 · max 1
requiredboolean
optionsobject

Responses

200The document
404No such document, recipient or field in this mode
409Conflict (not_editable)
422Invalid input (validation_failed, invalid)

Example

cURLRequest
curl -X PATCH https://api.readyink.ai/v1/documents/doc_c9x1q8/fields/fld_9q2k \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"x": 0.12, "y": 0.82}'
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Remove a field (drafts)

DELETE/documents/{id}/fields/{fid}

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8
fidrequiredin pathstringThe field ID, like fld_9q2k

Responses

200The document
404No such document, recipient or field in this mode
409Conflict (not_editable)

Example

cURLRequest
curl -X DELETE https://api.readyink.ai/v1/documents/doc_c9x1q8/fields/fld_9q2k \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Sending

Quote, send and cancel.

Cost to send now, and anything to fix first

GET/documents/{id}/quote

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Responses

200The quote
404No such document, recipient or field in this mode

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8/quote \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "object": "quote",
  "document_id": "doc_c9x1q8",
  "signers": 1,
  "copies": 0,
  "tokens": 1,
  "balance_available": 57,
  "balance_after": 56,
  "enough_tokens": true,
  "problems": [
    "string"
  ],
  "can_send": true
}

Send for signature

POST/documents/{id}/send

Requires Idempotency-Key, so a retry never sends or charges twice. Rate limited to 10 a minute per key. Test keys send for 0 tokens.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8
Idempotency-Keyrequiredin headerstringA unique string (up to 200 characters). A retry with the same key and request returns the first response with Idempotent-Replayed: true; the same key with a different request is a 409. Remembered per API key for 24 hours.

Request body

Content type: application/json · optional

NameTypeDescription
quote_tokensintegerThe tokens from your quote; refused with 409 quote_changed if the cost changed min 0

Responses

200The document, with status: out
400idempotency_key_required, idempotency_key_too_long
402Not enough tokens (insufficient_tokens)
404No such document, recipient or field in this mode
409Conflict (quote_changed (with tokens), bad_state, idempotency_conflict)
422Something must be fixed first (not_ready_to_send)

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8/send \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{"quote_tokens": 1}'
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": "signature",
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ]
}

Cancel a document that's out

POST/documents/{id}/cancel

Links stop working and pending signers are emailed. Tokens come back only if no one had opened it (tokens_returned). Requires Idempotency-Key.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8
Idempotency-Keyrequiredin headerstringA unique string (up to 200 characters). A retry with the same key and request returns the first response with Idempotent-Replayed: true; the same key with a different request is a 409. Remembered per API key for 24 hours.

Responses

200The document, with status: cancelled
400idempotency_key_required
404No such document, recipient or field in this mode
409Conflict (bad_state, idempotency_conflict)

Example

cURLRequest
curl -X POST https://api.readyink.ai/v1/documents/doc_c9x1q8/cancel \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
JSONResponse · 200
{
  "id": "doc_c9x1q8",
  "object": "document",
  "title": "Mutual NDA",
  "status": "draft",
  "test_mode": false,
  "signing_mode": "parallel",
  "reminder_days": 1,
  "file_status": "awaiting_upload",
  "file_error": null,
  "page_count": 2,
  "readyink_id": "RI-7Q4K-2M9D",
  "send_error": null,
  "cost": {
    "signers": 1,
    "tokens": 1
  },
  "version_hash": "9f2c\u2026e41a",
  "final_hash": "b71d\u202609cc",
  "created_at": "2026-11-09T15:04:05Z",
  "sent_at": null,
  "completed_at": null,
  "delete_after": null,
  "recipients": [
    {
      "id": "rcp_def456",
      "object": "recipient",
      "name": "Ana Diaz",
      "email": "ana@example.com",
      "mobile_last4": "0142",
      "notify_via": "email",
      "role": "signer",
      "order": 1,
      "status": "pending",
      "signed_at": null,
      "declined_at": null
    }
  ],
  "fields": [
    {
      "id": "fld_9q2k",
      "object": "field",
      "type": null,
      "recipient_id": "rcp_def456",
      "page": 1,
      "x": 0.1,
      "y": 0.8,
      "w": 0.28,
      "h": 0.035,
      "required": true,
      "options": {}
    }
  ],
  "tokens_returned": 1
}

Results

Signed PDF, certificate and activity.

Download the signed PDF

GET/documents/{id}/signed-pdf

Redirects to a download link valid for 10 minutes. Completed documents only.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Responses

302Redirect to the sealed PDF
404No such document, recipient or field in this mode
409Conflict (not_completed)

Example

cURLRequest
curl -L https://api.readyink.ai/v1/documents/doc_c9x1q8/signed-pdf \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -o out.pdf

Download the certificate of completion

GET/documents/{id}/certificate

Redirects to a download link valid for 10 minutes. Completed documents only.

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Responses

302Redirect to the certificate
404No such document, recipient or field in this mode
409Conflict (not_completed)

Example

cURLRequest
curl -L https://api.readyink.ai/v1/documents/doc_c9x1q8/certificate \
  -H "Authorization: Bearer $READYINK_API_KEY" \
  -o out.pdf

The document's activity (oldest first)

GET/documents/{id}/events

Parameters

NameTypeDescription
idrequiredin pathstringThe document ID, like doc_c9x1q8

Responses

200Events
404No such document, recipient or field in this mode

Example

cURLRequest
curl https://api.readyink.ai/v1/documents/doc_c9x1q8/events \
  -H "Authorization: Bearer $READYINK_API_KEY"
JSONResponse · 200
{
  "object": "list",
  "data": [
    {
      "id": "doc_c9x1q8",
      "object": "event",
      "type": "sent",
      "description": "Ana Diaz signed",
      "actor": "owner",
      "recipient_id": "rcp_def456",
      "created_at": "2026-11-09T15:04:05Z"
    }
  ],
  "has_more": false
}

Objects

The main objects the API returns.

Account

NameTypeDescription
objectstringAlways "account"
namestring
planstringOne of "pay_as_you_go", "team"
modestringThe mode of the key used One of "live", "test"
key_namestring
balanceobject
balance.availableinteger
balance.reservedintegerHeld for sends in progress
balance.monthlyintegerTeam plan's monthly tokens left
tokens_per_recipientinteger

Document

NameTypeDescription
idstring
objectstringAlways "document"
titlestring
statusstringOne of "draft", "sending", "out", "completed", "declined", "cancelled", "send_failed"
test_modeboolean
signing_modestringOne of "parallel", "sequential"
reminder_daysinteger or nullOne of 1, 3, 7, null
file_statusstringOne of "awaiting_upload", "processing", "ready", "failed"
file_errorstring or null
page_countinteger or null
readyink_idstring or nullStamped on the signed copy; set when sealed
send_errorstring or null
costobject
cost.signersinteger
cost.tokensinteger
version_hashstring or nullSHA-256 of what was sent
final_hashstring or nullSHA-256 of the sealed PDF
created_atstringdate-time
sent_atstring or nulldate-time
completed_atstring or nulldate-time
delete_afterstring or nulldate-time
recipientsarray of Recipient
fieldsarray of Field

Recipient

NameTypeDescription
idstring
objectstringAlways "recipient"
namestring
emailstring
mobile_last4string or null
notify_viastringOne of "email", "sms", "both"
rolestringOne of "signer", "copy"
orderintegermin 1
statusstringOne of "pending", "notified", "viewed", "signed", "declined"
signed_atstring or nulldate-time
declined_atstring or nulldate-time

Field

NameTypeDescription
idstring
objectstringAlways "field"
typestringOne of "signature", "initials", "date", "name", "email", "phone", "company", "job_title", "address", "website", "short_text", "long_text", "number", "dropdown", "single_choice", "multiple_choice"
recipient_idstring
pageinteger
xnumber
ynumber
wnumber
hnumber
requiredboolean
optionsobject

Quote

NameTypeDescription
objectstringAlways "quote"
document_idstring
signersinteger
copiesinteger
tokensinteger
balance_availableinteger
balance_afterinteger
enough_tokensboolean
problemsarray of stringEmpty when it can be sent
can_sendboolean

Event

NameTypeDescription
idstring
objectstringAlways "event"
typestringWhat happened. Current types: sent, sender_not_signing, self_sign, send_failed, notified, cancelled, recipient_email_changed, texted, text_reminded, text_delivered, text_failed, text_not_sent, reminded, opened, code_sent, verified, verify_failed, verify_locked, sample_opened, consented, link_reissued, signed, declined, completed, sealed, delivered, downloaded, ai_created, ai_suggested, ai_accepted. New types may be added; show description for any you don't recognize.
descriptionstring
actorstringOne of "owner", "api", "recipient", "system", "admin", "ai_claude", "ai_chatgpt"
recipient_idstring or null
created_atstringdate-time

Error

NameTypeDescription
errorrequiredobject
error.typerequiredstringOne of "invalid_request", "authentication_error", "payment_required", "forbidden", "not_found", "conflict", "rate_limit_error", "api_error"
error.coderequiredstringThe specific reason; branch on this
error.messagerequiredstringA sentence you can show a person
error.paramstringThe input it's about (dot path)
error.doc_urlrequiredstring
Something unclear or missing? Email info@readyink.ai or use the contact page. A real person will reply.