Create a signature request

POST
/v1/sign/requests

Asks one or more signers to sign one or more PDFs. Give documents by id (uploaded) or inline, and each signer's fields by position (page, x, y, width, height in PDF points from the page's top left) or by text anchor ({{signature:signer_1}}). Every signer needs a signature field. Sent at once unless send is false (a draft). Each signer signs by email (delivery: "email", the default) or in your app ("embedded").

Authorization

bearerAuth
headerAuthorizationBearer <token>

A secret API key from the dashboard: coss_live_… for production environments, coss_test_… for sandbox environments.

Header Parameters

Idempotency-Key?string

Makes retries safe: a repeated request with the same key and body returns the original request (in its current state) instead of creating another, for 24 hours. 1-256 characters.

Length1 <= length <= 256
Coss-Version?"2026-10-10"

The API version (a date) to use for this request. Defaults to your organization's version, pinned to the latest one when it first used the API and upgraded from the dashboard. The SDK always sends the version it was built for.

Value in"2026-10-10"

Request Body

application/json
  1. body
title*string

Shown to signers.

Length1 <= length <= 200
message?string

A note to signers.

Lengthlength <= 2000
documents*array<|>

Uploaded documents by id, or PDFs inline (base64).

Items1 <= items <= 10
signers*array<>
Items1 <= items <= 20
signing_order?string

parallel (default): everyone at once. sequential: in each signer's order.

Value in"parallel""sequential"
expires_at?string

When unsigned requests expire (at most 365 days ahead).

Formatdate-time
metadata?

Your own key-value pairs, returned with the request and its webhooks.

reminder_interval_days?|

Email signers who haven't signed get a reminder every this many days (up to 3). Default: your Sign settings' reminder_interval_days; null: none.

Range1 <= value <= 30
send?boolean

Default true: send at once. false keeps a draft to send later.

Response Body

The signature request (sent, or draft). A replay returns the original request in its current state.

application/json
  1. response
object*"sign_request"
Value in"sign_request"
id*string
status*string

draft until sent, sent while signers sign, then completed (everyone signed), declined (a signer declined), canceled or expired.

Value in"draft""sent""completed""declined""canceled""expired"
title*string
message*string|null
signing_order*string
Value in"parallel""sequential"
documents*array<>
signers*array<>
fields*array<>
metadata*
sandbox*boolean
reminder_interval_days*|

Days between automatic reminders to email signers; null: none.

expires_at*|
Formatdate-time
expired_at*|
Formatdate-time
sent_at*|
Formatdate-time
completed_at*|
Formatdate-time
canceled_at*|
Formatdate-time
declined_at*|
Formatdate-time
signed_document*|

The completed document, sealed by coss.com: every document with the signatures and values filled in, and a certificate of completion. null until it is ready (shortly after completed, announced by the sign_request.completed webhook); download it from GET /v1/sign/requests/{id}/signed_document.

created_at*string
Formatdate-time
import { Coss } from "coss";const coss = new Coss({  apiKey: process.env.COSS_API_KEY,  baseUrl: "https://api.coss.com",});const { data, error } = await coss.sign.requests.create({  title: "Services agreement",  documents: [    {      document_id: "sdoc_01k7c8m4q2f3e9v6t5r1n0p8yz",    },  ],  signers: [    {      name: "Ada Lovelace",      email: "ada@example.com",      fields: [        {          type: "signature",          anchor: "{{signature:signer_1}}",        },        {          type: "date_signed",          page: 2,          x: 320,          y: 640,          width: 120,          height: 18,        },      ],    },  ],});
{  "object": "sign_request",  "id": "sreq_01k7c8m4q2f3e9v6t5r1n0p8yz",  "status": "sent",  "title": "Services agreement",  "message": null,  "signing_order": "parallel",  "documents": [    {      "id": "sdoc_01k7c8m4q2f3e9v6t5r1n0p8yz",      "filename": "agreement.pdf",      "sha256": "9f2c6c0f0e1d4b7a8c5e3f2a1b0c9d8e7f6a5b4c3d2e1f0a9b8c7d6e5f4a3b2c",      "page_count": 2    }  ],  "signers": [    {      "object": "sign_signer",      "id": "ssgn_01k7c8m4q2f3e9v6t5r1n0p8yz",      "name": "Ada Lovelace",      "email": "ada@example.com",      "order": 1,      "delivery": "email",      "authentication": "email_link",      "status": "pending",      "client_ref": null,      "viewed_at": null,      "signed_at": null,      "declined_at": null,      "decline_reason": null    }  ],  "fields": [    {      "object": "sign_field",      "id": "sfld_01k7c8m4q2f3e9v6t5r1n0p8yz",      "signer_id": "ssgn_01k7c8m4q2f3e9v6t5r1n0p8yz",      "document_id": "sdoc_01k7c8m4q2f3e9v6t5r1n0p8yz",      "type": "signature",      "page": 2,      "x": 72,      "y": 640,      "width": 140,      "height": 12,      "required": true,      "label": null,      "anchor": "{{signature:signer_1}}"    }  ],  "metadata": {},  "sandbox": false,  "reminder_interval_days": 3,  "expires_at": null,  "expired_at": null,  "sent_at": "2026-10-26T15:04:05.000Z",  "completed_at": null,  "canceled_at": null,  "declined_at": null,  "signed_document": null,  "created_at": "2026-10-26T15:04:05.000Z"}