Create document content
Adds content blocks to a document. Send the blocks in content, even when you create one.
Field Types:
TEXT- Rich text content section (Tiptap editor format)HTML- Raw HTML content with custom styling (API-only, sanitized for security)FORM- Form with input fields for signersPDF- PDF file sectionPRODUCT_TABLE- Product/service table with pricingTABLE- Simple table with custom rows and columnsSPACER,PAGE_BREAK,DURATION- Layout and duration blocks
Field Position: Determines the order fields appear in the document (0-based index).
Field Metadata: Each field type has specific metadata requirements. See schema documentation for details.
Placing fields on a PDF: a PDF field renders an uploaded PDF (fieldMeta.value is the storage key returned by the files endpoint). Add boxes on its pages with fieldMeta.placedFields. Each entry has a unique id, a page counted from 1, a rect (x, y, width, height), and a kind. By default, rect is in fractions of the page from 0 to 1, measured from its top-left corner, so { "x": 0.1, "y": 0.8, "width": 0.3, "height": 0.05 } is a box near the bottom left. To send PDF points from the bottom-left corner instead, set unit to POINTS and origin to BOTTOM_LEFT. The server fills pageWidth, pageHeight, and pageRotation from the PDF page when you omit them, and responses always return relative values from the top-left corner. The box kinds are the following:
INPUTwithinputTypeSIGNATUREorINITIALSand apartyId: a mark the party draws at signing, sealed into the PDF at that position.INPUTwithinputTypeTEXT,DATE,CHECKBOXorSELECTand apartyId: a value the party fills in before signing. Setrequiredto block signing until it is filled.STATICwithcontent(HTML): fixed text stamped at that position.
Set key on an INPUT box to fill it in by that key through PATCH /api/v1/documents/{id}/field-values. A key can contain lowercase letters, digits, hyphens, and underscores.
The following example creates a PDF field with a signature box:
The request fails with an HTTP 400 Bad Request status code, and writes nothing, when a box has a page the PDF doesn’t have, doesn’t fit on its page, names a partyId that isn’t a party on the document, or is a SIGNATURE or INITIALS box without a party with the SIGNER role. The issues array in the response lists every problem with its path, such as content.0.fieldMeta.placedFields.2.rect.
The response lists the created fields in request order, each in the same shape as GET /api/v1/documents/{id}/content/{contentId}. To add, move, or remove single boxes later, use PATCH /api/v1/documents/{id}/content/{contentId}/placed-fields.
Product tables: a PRODUCT_TABLE field’s price values are decimal amounts in the table’s currency, such as 1499.5, not minor units. vat is a rate in percent, such as 25.
Fields a party fills in: In TEXT or HTML content, place a field with a <sajn-field> tag, such as <sajn-field key="buyer-phone" party="PARTY_ID" type="TEXT" label="Phone"></sajn-field>. key names the field, and party is the party who fills it in. type is TEXT (default), DATE, or SELECT with its choices in options, separated by commas. A field is required unless you set required="false", and value prefills it. Responses return the same tag.
HTML Field Security: HTML fields accept raw HTML but are automatically sanitized server-side to allow only safe formatting tags (p, div, span, headings, lists, tables, images) and basic CSS styling. Links, script tags, and dangerous attributes are stripped. Images support HTTP/HTTPS URLs and data URIs for inline images.
Authorizations
Personal API key, e.g. Authorization: Bearer sajn_sk_.... Not scope-limited — acts as the issuing user.
Headers
API version for this request. Without it, the request uses the organization's default version; an organization without a default is pinned to the latest version by its first request.
2026-09, 2026-10 ID of the workspace this request acts in, from GET /api/v1/workspaces. Without it, an API key acts in its default workspace. The token's user must be a member of the workspace; an OAuth token only accepts the workspace it was granted for. A workspace that doesn't exist or can't be reached returns 403 WORKSPACE_ACCESS_DENIED.
Makes retries safe. A retry with the same key and the same request replays the stored response for 24 hours (header Idempotent-Replayed: true); the same key with a different request returns 400.
255Path Parameters
The document ID.
Body
Body
The content blocks to create, in the order the response lists them
1Response
200
The created fields, in request order

