Skip to main content
Text tags let you define signing fields inside the PDF itself. When you send a signature request via the API, Lumin parses the document for any tags that match the expected syntax and converts them into interactive form fields for your signers. This approach is ideal when you generate documents programmatically and want to define field placement without using the Lumin Sign editor.

How to enable text tags

Include "use_text_tags": true in your POST /signature_request/send request body. If you omit this field, it defaults to false and tags are ignored.
{
  "use_text_tags": true,
  "file_url": "https://example.com/my-document.pdf",
  ...
}

Syntax

A text tag is a string placed directly in the body of your PDF document, wrapped in square brackets with identifiers separated by pipe characters:
[type|req|signerN|Label|UniqueId]
Example tags:
[sig|req|signer1|Sign here|sig_001]
[initial|noreq|signer2|Initials|init_002]
[text|req|signer1|Full name|name_003]
[date|noreq|signer1|Date signed|date_004]

Identifiers

IdentifierAccepted valuesRequiredDescription
Field typesig, initial, text, dateYesThe type of interactive form field to render
Requirementreq, noreqYesWhether the signer must complete this field before submitting
Assignersigner1, signer2, signer3, …YesMaps to the signer at that index in the signers array of your API request
LabelAny textNoPlaceholder text shown inside the field. Currently overridden by Lumin Sign’s default placeholders
Unique IDAny textNoA name you assign to the field for your own reference

Field types

TypeRenders as
sigSignature field
initialInitials field
textSingle-line text input
dateDate picker

Important notes

Tags are detected by reading actual text in the PDF — not by OCR. If your tag text is embedded in an image, it will not be detected.
  • PDF format is required. Form fields may be placed incorrectly if the document is not a PDF.
  • Tags remain in the rendered document. To hide a tag, set its text color to match the document background color.
  • No whitespace allowed inside tags. If you need extra horizontal space for layout, use underscores (_) after the last identifier instead:
    [sig|req|signer1|____________________]
    

Form field sizing

  • Height is fixed to accommodate a 12pt font.
  • Width equals the rendered length of the full tag string (including brackets). Add underscores after the last identifier to make a field wider.
[sig|req|signer1]               ← narrow field
[sig|req|signer1|____________]  ← wider field

Validation behavior

Lumin does not validate tag syntax at the time of the API request. Instead:
  • A tag missing any required identifier (type, requirement, assigner) is silently ignored — it is not converted into a form field and no error is returned.
  • A tag with an invalid value (e.g., wrong requirement type, or a signer index that does not exist in your signers array) triggers the signature_request_invalid webhook event after submission.
You will not receive an immediate API error for malformed tags. Subscribe to the signature_request_invalid webhook event to catch these issues in your integration. See the Webhooks guide for setup instructions.

Validation errors

When a text tag is malformed or references invalid data, the signature_request_invalid webhook event is fired with an error_code and error_message. Below are the possible validation errors:
Error typeMeaningError message
Missing field typeParser cannot infer the field type from the tag text.can't detect field type from this text tag
Undefined requirement typeThe requirement token is not a supported value (e.g. a typo of req). No form field is created.the requirement type <value> is undefined. Form field could not be created from this text tag
Wrong requirement typeIncompatible pairing — e.g. noreq used on a sig, initial, or date field which must be required.the requirement type noreq can't be used for signature/initial/date field
Missing requirement typeNo recognizable requirement segment in the tag.can't detect requirement type from this text tag
Undefined assignerSigner reference (e.g. signer3) does not match any signer on the request.signer3 is undefined. Form field could not be assigned to this assigner
Assigner index not numericSigner slot is not parseable as a number (e.g. signerOne instead of signer1).Can't detect assigner index from this text tag
Duplicated definition tagThe unique ID collides with another tag (e.g. checkbox group definitions must be unique).definition tag must be unique for each check box group

Example webhook payload

When a text tag error is detected, the signature_request_invalid webhook event is sent:
{
  "event": {
    "event_time": 1776408567122,
    "event_type": "signature_request_invalid",
    "event_metadata": {}
  },
  "signature_request": {
    "signature_request_id": "69e1d7f623ab47de200c8903",
    "error_code": "invalid_request",
    "error_message": "The requirement type noreq can't be used for signature/initial/date field"
  }
}

Example: complete request with text tags

curl -X POST https://api.luminpdf.com/v1/signature_request/send \
  -H "Authorization: API-key <your-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Tenant Agreement",
    "file_url": "https://example.com/tenant-agreement.pdf",
    "use_text_tags": true,
    "expires_at": 1927510980694,
    "signing_type": "SAME_TIME",
    "signers": [
      { "email_address": "[email protected]", "name": "Alex Tenant" }
    ]
  }'
In this example, the PDF at file_url might contain:
Please sign below:
[sig|req|signer1|Signature|sig_001]

Date:
[date|req|signer1|Date|date_001]

Full name:
[text|req|signer1|Full name|name_001]
signer1 resolves to [email protected] because that signer is at index 1 in the signers array.