POST /request to ask one or more people to review and approve something. They can agree to a consent, fill a form, sign a document, or accept a block of structured data, and you receive the signed result as a W3C Verifiable Credential. This guide covers everything except agent-action mandates; for those, see Agent Actions.
Every approval a user makes is captured as a signed, tamper-evident credential. You don’t store the signature or manage the signing UI. Humanos does, and streams you the outcome over webhooks.
What you can request
Each request carries one or more credentials, the things you are asking the subject to approve. Every credential has atype:
The
You supply credentials two ways, and you can mix them in one request:
POLICY type is for agent mandates and is intentionally out of scope here. It’s covered in Verifying Agent Actions.- Inline: put them in
credentials[]with adatafield. Best for one-off, dynamic content. - From the library: reference resources built in the dashboard by id with
resourcesIds, or whole workflows by id withgroupIds. A workflow, also called a group, bundles several resources, so a single request can collect multiple approvals at once.
Making the request
POST /request, signed per Authentication.
Request fields
object[]
required
The people who must approve. Up to 20 per request.
object[]
Inline credentials to collect. Up to 30. Each has
type, a required name
shown to the user, optional internalId, description, data, and, for
DOCUMENT, placements.string[]
Ids of existing dashboard resources to include as credentials.
string[]
Ids of existing workflows, also called groups. Each workflow expands to all
of its resources, so one request collects several approvals.
string
default:"CONTACT"
Whether identity verification is required. See Identity
verification.
string
Your own reference for the whole request. Echoed back on the webhook so you
can correlate. Each credential also takes its own
internalId.object
Embed the flow instead of sending a link. See Embedding & trusted
sessions.
Signing placements
Only applicable to aDOCUMENT credential, placements[] positions signature and field boxes on the PDF pages. These placements allow users to fill information, draw, sign, select dates, auto-place identity fields, and more.
Upload your PDF and select the placements and get your custom API payload here.
object
How the user receives it
The subject gets a one-time code and a signing link. The channel is chosen per contact: email if the contact contains@, otherwise SMS. There are three delivery modes:
- Standard
- 2FA
- Iframe
The code and the link both go to the subject’s primary
contact. They open
the link, enter the code, and approve.PATCH /request/resend/{requestId} with exactly one selector query param: contact, id, or internalId. Resends are rate-limited to a minimum of 30 seconds apart, up to 10 attempts.
Embedding & trusted sessions
Instead of sending a link, embed the approval flow directly in your product withiframe.pubKey, a P-256 public key, and receive the result over an encrypted postMessage. Set iframe.cookie.allow to opt into a trusted session so a returning subject can skip the OTP on later approvals; the lifetime, iframe.cookie.duration, is 1–24 hours. Full setup, including key generation, embedding, and decryption, is in the Iframe Integration guide.
Identity verification
securityLevel controls whether the subject must verify their identity before approving:
When a KYC level is set, the subject completes verification first; if it fails, no credential is issued. The KYC outcome arrives as a separate
identity webhook event.
One request, many approvals
Combinecredentials, resourcesIds, and groupIds in a single request and each subject in users[] receives all of them to approve together. Workflows, referenced by groupIds, are the easiest way to bundle a fixed set of approvals you reuse across requests.
Getting the result
You don’t poll. When a subject decides, Humanos sends acredential webhook event with the signed credential and a decision of accept or reject; KYC results arrive as an identity event. Match them back to your system with the internalId you set on the request or per credential.
See the Webhooks guide for the event payloads and how to verify and decrypt them.