Which property do I need?
- The signer should type their own value, and you don’t need to touch it — don’t set
read_only. Just position the field normally. - You want a fixed value nobody can edit (a contract number, a department name, anything you already know) — set
read_only: trueandread_only_value: "...". - You want the recipient’s own profile data shown and locked (their email, name, company, etc.) — set
read_only: trueandformat_rules: { prefilledData: "..." }. - You just need a label to identify the field later (for your own bookkeeping, or to match a field when updating a template-based signing request) — that’s
variable_name. It never sets or changes what the signer sees. - You’re reading a field back (after creation, or after signing) and want the value that’s actually there — read
valuein the API response.
Property reference
format_rules.prefilledData automatically locks the field for the signer and populates its value regardless of the read_only flag — unless format_rules.prefilledEditable: true is also set, which lets the signer edit the prefilled value. read_only_value also populates the value regardless of read_only. The read_only flag only matters for plain fields with no prefill and no read_only_value — it controls whether the signer can type into the field.Creating a signing request with prefilled fields
This example creates and sends a document with two locked fields: a static contract reference, and the recipient’s email pulled from their own recipient record.recipient_id uses a temporary id (temp_1) here because the recipient is defined in the same request (document-based creation). If you’re adding fields to an existing signing request or one created from a template, use the recipient’s real UUID instead.Accepted prefilledData keys
format_rules.prefilledData accepts these recipient attributes:
first_name, last_name, full_name, email, phone_number, company, title, street_address, city, state_province, postal_code, country
You can also reference any key present in a recipient’s custom_fields object (matched case-insensitively) — set that key when you create the recipient, then reference it the same way:
Reading field values back
When you GET a signing request or list its fields, each field includes avalue property — the actual resolved value, whether it came from read_only_value, from prefilled recipient data, or from what the signer typed. final_value still appears in responses but is a deprecated alias; prefer value in new integrations.
Prefill resolution happens at field-creation time once the recipient record exists, and is re-checked when the signing request is actually sent. If you use
create-and-send, both steps happen atomically and the field’s value is populated immediately in the response.Gotchas
variable_name is a label, not a data source
variable_name is a UI-facing label and a matcher used when merging fields from a template into a signing request — it’s never read as the source of a displayed value. Setting variable_name: "email" on a field does not prefill anything; you still need format_rules.prefilledData for that. Treat variable_name purely as an identifier you choose for your own reference.
Signers can’t override read-only or prefilled fields
If your integration renders its own signing UI and submits field values directly, any value submitted for aread_only or prefilled field is rejected server-side rather than silently accepted — the signer’s submission is ignored for that field, and the attempt is logged as a security event. Don’t rely on client-side hiding of these fields alone; the server enforces it independently.
Prefilled fields block sending on missing recipient data
Any field prefilled with a standard key (email, first_name, phone_number, company, etc.) blocks sending if the assigned recipient is missing that attribute — regardless of whether the field is marked required. This is unconditional for the 12 standard keys.
For custom_fields-keyed prefill, the block only applies when the field is both required: true and read_only: true — a non-required custom-fields prefill that doesn’t resolve simply leaves the field empty for the signer to fill.
Next steps
- Sending a signing request for the full recipient and field creation flow
- Webhooks — subscribe to webhook events to track signing progress