Delivery A+B: contract signing and document remediation
This section is the implementation contract for the hosted portal and API. The API examples below use the public platform routes and the response fields are the normalized fields returned by the handlers.Inline remediation: verify the email, add a number, unlock the number
When a newly linked phone has not been verified, phone-based OTP actions stay in a four-hour cooldown. The portal must show the compliance call to action and let the member choose an independent factor: a verified email challenge or a TOTP challenge. A code sent to the new number never unlocks this protection.{"status":"unlocked","channel":"email"};
when no cooldown exists it is {"status":"not_locked"}. Missing or spent
codes return 401 invalid_otp; a phone/SMS/WhatsApp factor returns
403 independent_factor_required. If no independent factor is available,
the member must wait until the four-hour window expires. After the member adds
and verifies the number, the profile reflects the result in GET /v1/me.
An organization administrator can clear the marker without changing the phone
or its phone_verified state:
{"status":"cleared","account_id":"<ACCOUNT_ID>"}. The
admin action is audited and requires the account-write permission.
Typed signatures in the portal and wizard
The contract wizard offers Draw signature and Type full name. Both produce the samesignature_png field. For a typed signature, send the
rendered PNG plus the explicit mode and exact name:
signature_mode is drawn by default or typed. In typed mode,
typed_name is required and must exactly match signer_name; otherwise the
API returns 422 typed_name_mismatch. An unknown mode returns
422 invalid_signature_mode. The OTP remains a header, never a JSON field.
KYB wizard: United Kingdom and generic countries
For a hosted company link, sendcountry: "uk" for the United Kingdom. The
wizard then asks for the UK company number, registered details, directors,
beneficial owners and control/signing roles using the UK profile. For a
country outside the corridor catalog, send country: "generic" and an ISO
alpha-2 generic_country:
Verification emails and language
Verification and remediation emails include a Continue compliance CTA when a hosted link or an actionable submission exists. The CTA points to the same wizard token; email delivery is best-effort, so the link or submission resource remains authoritative. The message language follows the profile locale (en, es or zh), falling back to English. Integrators must not
infer a decision from delivery of the email.
Native document upload: multipart and raw
The presign response tells the portal which transport to use:
shape: "multipart", POST the file to upload_url as the file part
and include category and the reserved key:
shape: "raw", PUT the bytes to upload_url with the same
Content-Type; the filename remains in the presign/confirm JSON. Never expose
an upstream storage or provider URL in the integration UI. Both paths finish
with POST .../{submissionID}/documents/confirm, then GET .../documents.
The native route accepts up to 24 MiB at the platform proxy; the core limit is
15 MiB per file.
After compliance asks for evidence, the response marks the item with
uploaded_after_request: true. Render that as an Uploaded after request
badge, alongside the document’s outcome and effective_outcome. The latter
is the manual resolution when one exists; otherwise it is the OCR outcome.
States and errors
See the error catalog for the complete response contract.
FAQ
Can the new phone unlock its own cooldown?
Can the new phone unlock its own cooldown?
No. Use the verified email or authenticator app, or wait four hours.
Which upload shape should the portal use?
Which upload shape should the portal use?
Use the
shape returned by presign; never infer it from a storage URL.