Anchor placeholders

The [[ls:KIND:ROLE]] marker syntax used by placement="anchors".

placement="anchors" (the default) on POST /v1/signing-requests finds markers in your PDF's text layer and places fields on top. This page covers the marker syntax, what we do with the marker once we find it, and the rules that produce 400 errors.

Syntax

[[ ls : KIND : ROLE (: FIELD_KEY)? ]]

KIND       — signature | initial | date | name | text
ROLE       — must match a signers[].role
FIELD_KEY  — optional third part: a letter, then letters, digits,
             _ - or . — up to 64 characters in all
             (e.g. [[ls:text:tenant:person.date_of_birth]])

A text or name marker becomes a text box the signer fills in. Its optional third part is stored as the box's field key; a name marker without one is keyed person.full_name. A key that asks for the signer's own details opens the box with them:

Field keyThe box opens with
person.full_name (or full_name)The signer's full name
person.first_name, person.last_name (or first_name, last_name)That part of the signer's name
contact.email (or email)The signer's email address
company.legal_name (or company)The company of the workspace address-book contact with the signer's email, if there is one
roleThe role (job title) of that address-book contact, if there is one

Name and email come from the signing request (the address book can complete a missing half of the name). The signer can change what the box opens with, and an empty text box never blocks signing. Any other key only names the box. The company and job_title you send on a signer print in the caption under the signature; they do not fill these boxes.

On a date marker the third part is not a key. This endpoint ignores it.

A date marker stamps the date that signer signs on, taken in the workspace owner's time zone, in your workspace's house format: 15.03.1990, or 03/15/1990 when the workspace's country (Settings → Company) is the United States.

Whitespace inside the brackets is tolerated ([[ls:signature:tenant]] and [[ ls : signature : tenant ]] parse the same). The marker must live on a single line in the PDF's text layer — line-wrapped markers are skipped silently, and so is a marker that breaks the syntax (a FIELD_KEY over 64 characters, say): it is ordinary text, neither placed nor masked.

Example PDF excerpt

CLIENT — Acme GmbH

  [[ls:signature:client_principal]]              [[ls:date:client_principal]]
  ─────────────────────────────────                ──────────────
  [[ls:name:client_principal]]                     Date

VENDOR — letssign.now Partners AG

  [[ls:signature:vendor_director]]                [[ls:date:vendor_director]]
  ─────────────────────────────────                ──────────────
  [[ls:name:vendor_director]]                      Date

When this contract is POSTed with two signers (client_principal and vendor_director), the response contains "anchors": { "found": 6, "fields": 6 } — two signatures, two dates, two names — and "placement": "anchors". Each field belongs to the signer whose role its marker names, and each name box opens with its signer's name.

Rules

A marker can appear once per page per role for signature, initial, date, and name kinds. Multiple text markers per page per role are allowed (e.g. multiple inline fill-in-the-blanks).

ViolationErrorStatus
Marker references a role not in signers[]unknown_role (meta.role, meta.page)400
Same kind and role twice on the same page (signature, initial, date, name)duplicate_anchor (meta.role, meta.kind, meta.page)400
The PDF has markers, but a signer in signers[] has none for their rolesigner_has_no_anchor (meta.role)400

A PDF with no markers at all is not an error, whether you passed placement="anchors" or left the default: the call falls through to auto_append and appends a signature page. The response tells you — "placement": "auto_append" and anchors.found: 0 instead of "placement": "anchors". By then the invitations are out (unless you sent send_emails: false), so if a PDF without markers must never go out, check your generator's output for markers before you send, and withdraw anything that slipped through.

What happens to the marker

The hash covers what the signer sees. Before presenting the PDF we draw a white rectangle over each marker, so the signer sees their field on a clean page rather than the [[ls:…]] text underneath. The document's SHA-256 — presentedSha256 in the response — is taken after that step: it is the hash of exactly the file the signers are shown. We don't keep the file you uploaded or its hash, so keep your own if you ever need to show the pre-masking original.

The rectangle covers the marker; it does not delete it. The marker's text is still in the page's content stream, so text extraction (pdftotext, copy and paste, search in a PDF viewer) can still find [[ls:…]] in the presented and in the signed PDF. Apart from the rectangles the file keeps its content — a password-protected PDF is decrypted first, because it could not be sealed otherwise.