Resolutions
What your people decided about an answer, kept beside it - and the approvals Himmel asks of them.
A resolution records what your people decided about an answer: a sign-off on a contested check's question, or an admin's override of what an answer decided. It is kept beside the answer and never changes it; a decision on a question whose rule says what its answers lead to answers the action again, in a new answer (below). The record of what Himmel answered and the record of what your company then decided are two different things, and the second one is yours.
curl https://api.gethimmel.com/v1/checks/chk_01J8.../resolution \
-H "Authorization: Bearer $HIMMEL_KEY" -H "Content-Type: application/json" \
-d '{ "resolved_outcome": "exceptional", "resolved_by": "usr_01J9Q4TZ8M...",
"method": "sign_off", "note_ref": "MEMO-2025-77" }'
| Field | |
|---|---|
resolved_outcome | What was decided: one of the question's candidates, or for an override of a determined answer one of the outcomes its rule set declares. |
resolved_by | Who decided, by their Himmel id. Required with one of your account's own keys; signed in to the console, it is you. A key made for an agent records no decision. |
method | sign_off on a contested check's question, override for an admin overruling a determined or a contested answer. |
note_ref | Optional: your own reference to the note or memo behind the decision. Keep it opaque: one that looks like an email address or an IBAN is refused with pii-in-facts. |
GET /v1/checks/{id} returns the answer with its latest resolution beside it, and every one in resolutions.
A decision answers the action
Where the question's rule says what each of its answers leads to - on to the rules after it, or an outcome of its own - a sign-off, or an admin's override of the question, answers the action again in the same request: the decision is read as the question's answer, and the rules after it answer too. A late refund the team lead decides is exceptional is then held to its amount like any other; one they decide is not exceptional is refused, as the playbook says. The response names the new answer:
{ "resolution_id": "res_01J9...", "check_id": "chk_01J8...", "resolved_outcome": "exceptional",
"method": "sign_off", "superseded_by": "chk_01J9..." }
It replaces the contested answer (supersedes_check_id, recheck_reason: decision), lists the decision it read in decisions - who decided, how, the resolution's id, and what the answer led to - and raises a check.rechecked alert, so software waiting on the decision hears of it. superseded_by is null where the answer stands as it was: a question whose rule says nothing of what its answers lead to, or a change to your rules still waiting for your rule owner, whose confirmation then issues it.
A person who decides and approves is asked once. Where your rule set marks the fact that records an approval (approved_by), a decision that goes on is also its decider's approval in the rules after the question, unless the action records an approval of its own. So the team lead's sign-off on a late €70 refund, which the team lead approves up to €250, allows it; on a late €300 refund the answer names the head of support's approval as the next stage of the same refund. The decision says approval: "approved_by" where it stood in that way. Where your rule set gives approval for an amount - "for this amount or more" - and marks the money fact that records it too (approved_amount), the decider's approval is for the action's own amount, unless the action records an amount of its own.
Every answer the action is given after reads the decision again - when it is reported done, completed with facts it lacked, or issued again because something it depends on moved - for as long as the rule asks the very same question.
Who decides, and what
- A sign-off answers a contested check's question. Only the person the answer names as its
signergives one, and they choose one of the question'scandidates. - An override is an admin overruling your own rules: a determined answer, choosing one of the outcomes its rule set declares, or a contested one, signed off or not, choosing one of its question's answers. A question that names nobody is decided this way.
- On the answer that stands, for an action that was taken or is still open. A decision sent to an answer a later one replaced is refused with
409 answer-replaced, andstandingnames the answer to decide on - the action's, once a check completed it or asked about it again. One about an action never taken - it expired, or the caller reported it not done - is409 action-not-taken.
Anybody else is 403 cannot-decide, and so is a key made for an agent, whoever it names (agent_key): a decision is a person's, made signed in to the console or sent by your own software with one of your account's own keys. An answer the question or the rule set does not offer is 422 invalid-request with not_a_choice, and the detail lists the ones it does.
A decision is made once
Himmel issues an answer again when something it depends on moves: a later booking, a new version of your rules confirmed, two customer records answered to be one. A decision the answer read, it reads again, as above. For a question whose rule says nothing of what its answers lead to, the answer stays contested beside its decision, and where the new answer asks the very same question - raised by the same rule, in the words your rule owner confirmed, with the same answers to choose from - the latest decision on the answer it replaces carries over to it. It reads as the decision it carries, with given_on naming the answer it was given on, so the person who decided is never asked twice. An override of a determined answer carries over where the new answer gives the same outcome from the same rules.
Where the question changed - the rule was reworded, or the answer now asks another question or none - the new answer waits for a decision again, and the earlier decision stays on record on the answer it was given to.
Approvals Himmel asks for
When an agent asks before it acts - a check with status: proposed, sent with a key made for it, through the API or the MCP server - and the answer names a person, Himmel asks that person: the approver your policy names where the answer needs_approval, and the signer of a contested answer's question. Every answer to the action then carries requests, beside the answer, as each stands now:
"requests": [ { "id": "apr_01J9...", "asked_of": "usr_01J9Q4TZ8M...", "asked_at": "2026-10-12T09:14:02Z",
"asks": "approval", "status": "waiting", "decided_by": null, "resolution_id": null,
"closed_at": null, "reason": null, "emailed_at": null, "waits_until": "2026-10-19T09:14:02Z" } ]
An approver is asked only where your rule set marks the fact that records who approved (approved_by, approval: true), so their approval can be read. Nobody is asked for your own software or a person signed in, which keep their approvals in their own systems and send them as approved_by, nor for an action already taken: that is too late to ask.
Himmel emails the person asked within a minute, at the address they sign in with. The email says what is asked as the answer that stands for the action says it - the action's figure in your rule set's own words, the rule that named them with the clauses it cites, or the question and its answers; which agent asks, for whom and in which run; and until when it waits - and links the request's page in the console, where they decide signed in. A link alone never decides. It names no customer and no person: the email provider is a sub-processor. Several requests found at once for one person go in one message. emailed_at says when it went; it stays null where the person's mail server refused their address, and the request waits for them in the console. In an account with live and test, a request made with a test key is never emailed: it waits in the console for whoever is trying the flow, and nobody's inbox hears of it.
The person asked decides, signed in to the console, in any role - POST /v1/approvals/{id}/approve, or /refuse - and is told what became of the request:
{ "request": { "id": "apr_01J9...", "status": "approved", "decided_by": "usr_01J9Q4TZ8M...", "...": "..." },
"check_id": "chk_01J8...", "resolution_id": "res_01J9...", "superseded_by": "chk_01J9..." }
An approval is recorded as theirs (method: approval) and answers the action again in the same request, read as the approval the rules ask for: allowed where they need nothing more, replacing the answer that named them (recheck_reason: approval), and listed among the new answer's decisions. It covers the action as asked. POST /v1/approvals/{id}/refuse records a refusal: no answer is issued again, every answer to the action says it was refused, and nobody is asked about it again. A question's request is answered by a sign-off (above), never an approval.
The agent hears what was decided by asking again about the action, naming it, with only the facts an answer asked for: an approval answers it allowed, a refusal leaves the answer as it was, requests saying refused. It never asks the person itself. Your own software hears the answer an approval issued as it hears any answer issued again, by its check.rechecked alert. See When an answer names a person, which also says how to see an approval through in the sandbox, whose team lead and head of support nobody signs in as.
Nobody else decides: a key - an agent's (agent_key) or one of your account's own (a_key) - and another person (not_the_approver) are 403 cannot-decide; an admin may still overrule the answer itself. The same decision sent twice is answered as it stands; once a request no longer waits, any other is 409 nothing-to-decide, with request_status. GET /v1/approvals/{id} reads a request, with the answer that named the person and the one that stands now.
A request waits a week at most - until its waits_until, which every request carries, so you can tell whoever your agent acts for when the person will have answered by - and the agent's proposal waits with it: it is not closed as expired while a request on it waits, and once decided its 24 hours run from the decision. A request lapses, saying why, when its action is reported taken (executed) or not done (abandoned), expires (expired), or gets no answer in a week (no_answer).
What waits on a person
GET /v1/review says what waits on somebody at your company now, in groups, each with how many and the check log query that lists them. It needs checks:read, and reads the environment of the request, as the log does.
curl https://api.gethimmel.com/v1/review -H "Authorization: Bearer $HIMMEL_KEY"
{
"waiting": 8,
"checks": "/v1/checks?waiting=true",
"groups": [
{ "kind": "approval", "count": 1, "checks": "/v1/checks?waiting=true&state=determined&request=waiting" },
{ "kind": "contested", "count": 2, "checks": "/v1/checks?waiting=true&question=policy.example.q.exceptional",
"question": { "id": "policy.example.q.exceptional", "candidates": ["exceptional", "not_exceptional"],
"reason": "...", "rule": "policy.example.refunds.late_is_exceptional", "wording": "..." } },
{ "kind": "match", "count": 1, "matches": "/v1/recipients/matches?status=open",
"answers": 1, "checks": "/v1/checks?waiting=true&missing=recipient_identity" },
{ "kind": "not_covered", "reason": "policy_gap", "count": 1, "checks": "/v1/checks?waiting=true&reason=policy_gap" },
{ "kind": "undetermined_missing_facts", "fact": "delivered_on", "description": "The day the order was delivered",
"count": 1, "checks": "/v1/checks?waiting=true&missing=delivered_on&transaction_status=executed" }
]
}
| Group | What waits | Who acts on it |
|---|---|---|
approval | Agents' actions whose answer names a person Himmel asked to approve, who has not answered yet. | The person asked approves or refuses (above). |
contested | A question your rules leave to a person, one group per question, as its newest answer asks it: the answers to choose from, and the rule that raises it in the words your rule owner confirmed. | The person each answer names as signer signs it off, or an admin overrules it (above). |
match | "The same customer?": count is the questions open, which matches lists with both records' names for an admin or ops, and answers the answers waiting on one. | An admin or ops answers each with POST /v1/recipients/matches/{id} (see Recipients). |
not_covered | Answers your rules do not give yet, one group per reason: policy_gap first, where your policy does not say, then awaiting_confirmation and rule_flagged, then the rest. | Your rule owner, who confirms the rules or changes the policy. |
undetermined_missing_facts | One group per fact missing from actions that were taken, with its description as the rule set declares it. An answer missing two facts is in both groups, and counted once in waiting. | Your own systems: send the check again with the facts. |
The groups come in that order, and within a kind the largest first, then by name — but for not_covered, whose reasons keep the order above. A group with nothing in it is not listed. Every figure is exactly what its link lists. An action never taken waits on nobody, and an action still being asked about waits only on a question for a person: its missing facts are its asker's to send. Nothing here decides anything.
What a resolution is not
Supplying facts that were missing is a check, not a resolution: for an action taken, send a check that completes it, naming its booking in transaction.completes (see Check); for one you are still asking about, ask about it again, naming it the same way, with the facts. An answer waiting on your rules waits for your rule owner to confirm them. A resolution records a person's decision about a question the rules leave open, or an admin overruling them. It never turns a missing fact into an answer.
Endpoints
/v1/checks/{check_id}/resolutionScope checks:writeA sign-off, or an override
Record what your people decided. A sign-off decides a contested answer's question: only the person it names as signer gives one, choosing one of the question's candidates. An override is an admin overruling a determined answer, choosing one of the outcomes its rule set declares, or a contested one, choosing one of its question's answers. A decision is made on the answer that stands, for an action taken or still open. Where the question's rule says what each answer leads to, a decision on it issues the action's answer again in this request - the rules after the question answering too, the person who decided counting as approving it where the rules ask their approval next - and superseded_by names it; every answer the action is given after reads the decision while its rule asks the very same question. The answer decided on is never changed: the resolution is kept beside it. Supplying missing facts is a new check, not a resolution.
Needs a key with the scope checks:write. It records what a person decided, so a key made for an agent, which names nobody but itself, gets 403 cannot-decide.
Parameters
check_idpath · stringrequiredIdempotency-Keyheader · string or nullMakes a retry safe: the same key with the same request within 24 hours gets the first answer again, and nothing is done twice. The same key with a different request is
409 idempotency-conflict. Keys are per environment and per path.
Request body · application/json
resolved_outcomestringrequiredmethod"sign_off" | "override"requiredresolved_bystring or nullWho did it, when your key acts for a person: their Himmel id, which the console's Developers page shows them, and Settings' People an admin. They must be in your account, with a role that could do this themselves, and the record keeps it as your key's claim. A key made for an agent names nobody but itself: leave it out. Signed in to the console, leave it out: it is you. Required from the account's own keys; a key made for an agent records no decision. For a contested check, the person its
signernames.note_refstring or nullYour own reference to the note behind the decision, opaque and at most 200 characters: one that looks like an email address or an IBAN is refused (
pii-in-facts).
Responses
200 Successful response
resolution_idstringrequiredcheck_idstringrequiredresolved_outcomestringrequiredmethod"sign_off" | "override"requiredsuperseded_bystring or nullThe answer the decision issued for the action, which replaces the one decided on: where the question's rule says what each answer leads to, the decision is read as its answer and the rules after it answer too. Null where the answer stands as it was - a question that says nothing of its answers, or a change still waiting for your rule owner, which issues it once confirmed.
- 401No API key was sent, or it is not in use (
unauthorized). - 403The caller may not do this, and
typesays why: the key or role lacks the scope, the rule set is not enabled for this account, the person signed in belongs to no account, names were asked for by a caller that is not shown them, or a request acting in test tried to change the account's settings (live-only). - 404Nothing with that id or name exists for this account.
- 409The request conflicts with what is stored: see
detail. - 413The request's body is larger than the operation takes, refused before any of it is read (
body-too-large): a policy's files at most 5 MB, any other body 1 MB - and an uploaded file at most 20 MB (file-too-large). - 422The request, or a fact in it, is not in the documented shape - a query parameter the operation does not take included, which is named (
unknown_parameter) rather than ignored - or itsHimmel-Envdoes not fit the caller. Missing facts are not errors. - 429More requests in a minute than the key's or the person's limit (
rate-limited) - or, opening an account, more accounts in a day than the deployment opens, withRetry-Aftersaying when to try again. - 500Something failed on our side.
X-Request-Ididentifies it in our logs.
/v1/approvals/{request_id}Scope checks:readWhat Himmel asked a person
A request Himmel made of a person an answer to an agent's proposal named: whom it asks and when, for what - an approval, or the answer to a question - and where it stands now: waiting, approved, refused, decided by a sign-off or an admin's override, or lapsed (reason: the action taken, abandoned or expired, a week with no answer, an answer issued again that no longer names them, or another person refusing the action). With the answer that named the person (check_id), the rule set and rule that did, and the answer that stands for the action now (standing).
Needs a key with the scope checks:read. From a key made for an agent it reads that agent's own alone: another agent's action is 403 not-the-agents-action, another agent's record 403 insufficient-scope.
Parameters
request_idpath · stringrequired
Responses
200 Successful response
idstringrequiredThe request,
apr_…:GET /v1/approvals/{id}.asked_ofstringrequiredThe person asked: a person in your account, by Himmel id.
asked_atstringrequiredWhen Himmel asked them.
asks"approval" | "question"requiredWhat they are asked: their
approvalof the action, which a policy of yours asks of them - or their answer to the answer'squestion, which a sign-off gives.status"waiting" | "approved" | "refused" | "decided" | "lapsed"requiredwaitingfor them, a week at most;approvedorrefusedby them;decidedby a sign-off or an admin's override;lapsed,reasonsaying why.waits_untilstringrequiredUntil when it waits for its person: a week after it was asked, the proposal held open until then. One still waiting then lapses,
no_answer, and a decision after it is409 nothing-to-decide.check_idstringrequiredThe answer that named the person.
transaction_idstringrequiredThe booking of the action the request is about.
decided_bystring or nullWho decided it, by Himmel id: the person asked, or the admin who overruled.
resolution_idstring or nullThe decision that answered it, on the answer it was recorded on.
closed_atstring or nullWhen it stopped waiting.
reasonstring or nullWhy it lapsed: the action
executed,abandonedorexpired;no_answerin a week;no_longer_asked, an answer issued again naming them no more;refused, another person refusing the action.emailed_atstring or nullWhen Himmel emailed them, linking the request's page in the console: within a minute of the request, in your account's own environment. Null until then, and where it never goes - a request made in test in an account with a live side, one that stopped waiting first, a person with no address, or one whose mail server refused their address.
rule_setstring or nullFor an approval: the policy whose answer named the person.
rulestring or nullThe rule that named them, or raised the question.
standingstring or nullThe answer that stands for the action now:
GET /v1/checks/{id}.
- 401No API key was sent, or it is not in use (
unauthorized). - 403The caller may not do this, and
typesays why: the key or role lacks the scope, the rule set is not enabled for this account, the person signed in belongs to no account, names were asked for by a caller that is not shown them, or a request acting in test tried to change the account's settings (live-only). - 404Nothing with that id or name exists for this account.
- 422The request, or a fact in it, is not in the documented shape - a query parameter the operation does not take included, which is named (
unknown_parameter) rather than ignored - or itsHimmel-Envdoes not fit the caller. Missing facts are not errors. - 429More requests in a minute than the key's or the person's limit (
rate-limited) - or, opening an account, more accounts in a day than the deployment opens, withRetry-Aftersaying when to try again. - 500Something failed on our side.
X-Request-Ididentifies it in our logs.
/v1/approvals/{request_id}/approveScope rules:readApprove what Himmel asked you
Your approval of the action an agent asked about, as it was asked - its facts and its figures. The action's answer is issued again in this request, your approval read as the approval the rules ask for: where they need nothing more, allowed, replacing the answer that named you (superseded_by, recheck_reason: approval); where they ask another person next, that person is asked. Recorded as yours, on the answer that stands for the action, and audited; the request then reads approved wherever an answer to the action is read. The same decision sent again is answered as it stands; once the request no longer waits - decided, or lapsed with its action or after a week - any other is 409 nothing-to-decide. A question's request is answered by a sign-off, choosing one of its answers (POST /v1/checks/{check_id}/resolution): approving it is 422 invalid-request.
Needs the person the request asks, signed in to the console, in any role: a key - an agent's, or one of your account's own - gets 403 cannot-decide.
Parameters
request_idpath · stringrequiredIdempotency-Keyheader · string or nullMakes a retry safe: the same key with the same request within 24 hours gets the first answer again, and nothing is done twice. The same key with a different request is
409 idempotency-conflict. Keys are per environment and per path.
Responses
200 Successful response
requestAskedOfAPersonrequired11 fields
idstringrequiredThe request,
apr_…:GET /v1/approvals/{id}.asked_ofstringrequiredThe person asked: a person in your account, by Himmel id.
asked_atstringrequiredWhen Himmel asked them.
asks"approval" | "question"requiredWhat they are asked: their
approvalof the action, which a policy of yours asks of them - or their answer to the answer'squestion, which a sign-off gives.status"waiting" | "approved" | "refused" | "decided" | "lapsed"requiredwaitingfor them, a week at most;approvedorrefusedby them;decidedby a sign-off or an admin's override;lapsed,reasonsaying why.waits_untilstringrequiredUntil when it waits for its person: a week after it was asked, the proposal held open until then. One still waiting then lapses,
no_answer, and a decision after it is409 nothing-to-decide.decided_bystring or nullWho decided it, by Himmel id: the person asked, or the admin who overruled.
resolution_idstring or nullThe decision that answered it, on the answer it was recorded on.
closed_atstring or nullWhen it stopped waiting.
reasonstring or nullWhy it lapsed: the action
executed,abandonedorexpired;no_answerin a week;no_longer_asked, an answer issued again naming them no more;refused, another person refusing the action.emailed_atstring or nullWhen Himmel emailed them, linking the request's page in the console: within a minute of the request, in your account's own environment. Null until then, and where it never goes - a request made in test in an account with a live side, one that stopped waiting first, a person with no address, or one whose mail server refused their address.
check_idstring or nullThe answer the decision was recorded on.
resolution_idstring or nullsuperseded_bystring or nullThe answer an approval issued for the action, which replaces the one that named you: read with your approval. Null after a refusal, which issues none, and where the answer stands as it was.
- 401No API key was sent, or it is not in use (
unauthorized). - 403The caller may not do this, and
typesays why: the key or role lacks the scope, the rule set is not enabled for this account, the person signed in belongs to no account, names were asked for by a caller that is not shown them, or a request acting in test tried to change the account's settings (live-only). - 404Nothing with that id or name exists for this account.
- 409The request conflicts with what is stored: see
detail. - 422The request, or a fact in it, is not in the documented shape - a query parameter the operation does not take included, which is named (
unknown_parameter) rather than ignored - or itsHimmel-Envdoes not fit the caller. Missing facts are not errors. - 429More requests in a minute than the key's or the person's limit (
rate-limited) - or, opening an account, more accounts in a day than the deployment opens, withRetry-Aftersaying when to try again. - 500Something failed on our side.
X-Request-Ididentifies it in our logs.
/v1/approvals/{request_id}/refuseScope rules:readRefuse what Himmel asked you
Your refusal of the action an agent asked about. No answer is issued again: the rules still need the approval, and every answer to the action says you refused it. Nobody is asked about the action again. Recorded as yours, on the answer that stands for the action, and audited; the request then reads refused wherever an answer to the action is read. The same decision sent again is answered as it stands; once the request no longer waits - decided, or lapsed with its action or after a week - any other is 409 nothing-to-decide. A question's request is answered by a sign-off, choosing one of its answers (POST /v1/checks/{check_id}/resolution): approving it is 422 invalid-request.
Needs the person the request asks, signed in to the console, in any role: a key - an agent's, or one of your account's own - gets 403 cannot-decide.
Parameters
request_idpath · stringrequiredIdempotency-Keyheader · string or nullMakes a retry safe: the same key with the same request within 24 hours gets the first answer again, and nothing is done twice. The same key with a different request is
409 idempotency-conflict. Keys are per environment and per path.
Responses
200 Successful response
requestAskedOfAPersonrequired11 fields
idstringrequiredThe request,
apr_…:GET /v1/approvals/{id}.asked_ofstringrequiredThe person asked: a person in your account, by Himmel id.
asked_atstringrequiredWhen Himmel asked them.
asks"approval" | "question"requiredWhat they are asked: their
approvalof the action, which a policy of yours asks of them - or their answer to the answer'squestion, which a sign-off gives.status"waiting" | "approved" | "refused" | "decided" | "lapsed"requiredwaitingfor them, a week at most;approvedorrefusedby them;decidedby a sign-off or an admin's override;lapsed,reasonsaying why.waits_untilstringrequiredUntil when it waits for its person: a week after it was asked, the proposal held open until then. One still waiting then lapses,
no_answer, and a decision after it is409 nothing-to-decide.decided_bystring or nullWho decided it, by Himmel id: the person asked, or the admin who overruled.
resolution_idstring or nullThe decision that answered it, on the answer it was recorded on.
closed_atstring or nullWhen it stopped waiting.
reasonstring or nullWhy it lapsed: the action
executed,abandonedorexpired;no_answerin a week;no_longer_asked, an answer issued again naming them no more;refused, another person refusing the action.emailed_atstring or nullWhen Himmel emailed them, linking the request's page in the console: within a minute of the request, in your account's own environment. Null until then, and where it never goes - a request made in test in an account with a live side, one that stopped waiting first, a person with no address, or one whose mail server refused their address.
check_idstring or nullThe answer the decision was recorded on.
resolution_idstring or nullsuperseded_bystring or nullThe answer an approval issued for the action, which replaces the one that named you: read with your approval. Null after a refusal, which issues none, and where the answer stands as it was.
- 401No API key was sent, or it is not in use (
unauthorized). - 403The caller may not do this, and
typesays why: the key or role lacks the scope, the rule set is not enabled for this account, the person signed in belongs to no account, names were asked for by a caller that is not shown them, or a request acting in test tried to change the account's settings (live-only). - 404Nothing with that id or name exists for this account.
- 409The request conflicts with what is stored: see
detail. - 422The request, or a fact in it, is not in the documented shape - a query parameter the operation does not take included, which is named (
unknown_parameter) rather than ignored - or itsHimmel-Envdoes not fit the caller. Missing facts are not errors. - 429More requests in a minute than the key's or the person's limit (
rate-limited) - or, opening an account, more accounts in a day than the deployment opens, withRetry-Aftersaying when to try again. - 500Something failed on our side.
X-Request-Ididentifies it in our logs.
/v1/reviewScope checks:readWhat waits on a person
What waits on somebody at your company, in groups: the approvals Himmel asked of a person about an agent's action, each question the rules leave to a person, the "same customer?" questions open, the answers your rules do not give yet by why, and the facts missing from actions taken, fact by fact. Each group says how many wait in it and links to the check log's query that lists them (waiting=true). An action never taken waits on nobody, and the facts of one still being asked about are its asker's to send. Nothing here decides anything: an approval is given or refused by the person asked, a question is decided with a resolution, "the same customer?" under Recipients, the rules by your rule owner confirming them, and missing facts come in a new check.
Needs a key with the scope checks:read. What it reads is your whole account's, so a key made for an agent, which reads its own agent's alone, gets 403 insufficient-scope.
Responses
200 Successful response
waitingintegerrequiredHow many answers wait on a person, each counted once, in whichever groups.
checksstringrequiredThe
GET /v1/checksquery that lists them:waiting=true.groupslist of ReviewGrouprequiredApprovals Himmel asked for, questions, "the same customer?", the rules, then facts; within a kind the largest first, but for the rules:
policy_gap,awaiting_confirmation,rule_flagged, then the rest. A group with nothing in it is not listed.9 fields
kind"approval" | "contested" | "match" | "not_covered" | "undetermined_missing_facts"requiredapproval: agents' actions whose answer names a person Himmel asked to approve, who has not answered yet.contested: a question the rules leave to a person.match: "the same customer?" questions.not_covered: answers your rules do not give yet, byreason.undetermined_missing_facts: a fact missing from actions taken.countintegerrequiredHow many wait in the group: the answers
checkslists, or formatchthe questions open, whichmatcheslists.checksstringrequiredThe
GET /v1/checksquery that lists the group's answers, exactly.questionQuestion or nullFor
contested: the question, as its newest answer asks it - the answers to choose from, and the rule that raises it in the words your rule owner confirmed.5 fields
idstringrequiredcandidateslist of stringrequiredreasonstringrequiredWhy this one cannot be settled by the rule.
rulestringrequiredwordingstring or nullThe rule's wording, as your rule owner confirmed it.
reason"awaiting_confirmation" | "rule_flagged" | "policy_gap" | "no_rule_matched" | "no_rule_set_for_jurisdiction" | "rule_set_broken" or nullFor
not_covered: why its answers are not covered.factstring or nullFor
undetermined_missing_facts: the fact.descriptionstring or nullFor
undetermined_missing_facts: the fact, as its rule set describes it.matchesstring or nullFor
match: where the open questions are listed,GET /v1/recipients/matches.answersinteger or nullFor
match: the answers waiting on one of its questions, whichcheckslists.
- 401No API key was sent, or it is not in use (
unauthorized). - 403The caller may not do this, and
typesays why: the key or role lacks the scope, the rule set is not enabled for this account, the person signed in belongs to no account, names were asked for by a caller that is not shown them, or a request acting in test tried to change the account's settings (live-only). - 422The request, or a fact in it, is not in the documented shape - a query parameter the operation does not take included, which is named (
unknown_parameter) rather than ignored - or itsHimmel-Envdoes not fit the caller. Missing facts are not errors. - 429More requests in a minute than the key's or the person's limit (
rate-limited) - or, opening an account, more accounts in a day than the deployment opens, withRetry-Aftersaying when to try again. - 500Something failed on our side.
X-Request-Ididentifies it in our logs.