Alerts
What has changed since you were answered.
An answer can change after it was given — a later gift takes a client over the year's limit, two recipient records turn out to be one person, a new version of the law is published. Himmel never edits the earlier answer. It issues a new one, and tells you here.
GET /v1/alerts lists them, newest first, and filters by type and status:
| Type | Raised when |
|---|---|
check.rechecked | An earlier answer has been issued again. payload.was and payload.now say what moved, for the law and for each of your policies; reason why, and by_user the person whose approval or decision issued it again, where one did. |
checks.rerun | Answers have been issued again because the rules changed: your rule owner confirmed or flagged rules, or a version or a policy was published. One alert for all of them: payload.cause says what happened, reissued how many answers were issued again and changed how many of them moved state or an outcome, against_rules how many of them are actions you took that now stand against your rules, and checks is the check log query that lists them. |
check.against_rules | An action you reported as taken was not allowed by your own rules as taken: a policy of yours answered not_allowed, needs_approval, hand_to_a_person — any outcome but allowed and not_applicable. One alert an action, whichever way it came to stand so: sent as taken, asked about and then reported done, corrected or completed, or turned by a later booking. payload.check_id is the answer that stands, actor who acted, cause how it came about, and against each policy that said so — its rule, the rule's title, the outcome, and the approver it names, where it names one. An ask raises none: the tool that asked was told. |
check.rule_set_broken | An action that happened could not be checked: its rules could not run on its facts. It is kept, counts in every total as an action taken, and is answered not_covered with the reason rule_set_broken until a version of the rules that can answer it is confirmed, when it is checked again. payload.check_id is that answer, detail what the rules said, naming rules and facts and never a value you sent. One alert an action. |
check.handed_over | An agent asked about an action, and your rules hand it to the person they name (to on the rule, handed_to on the answer's layer). payload.check_id is the answer that handed it over, handed_to the person, actor the agent, action the action's first booking, and rule_set, rule, its title and the outcome the rule that said so. One alert for each action and person: the agent asking again about the same action raises none. A notice: nothing waits on the person in Himmel, and they act in your own systems. |
rule_set.version.published | A new version of a rule set you use is published, with a summary of what changed and the rules now waiting for your rule owner. payload.by_user is the person of yours who published it - null for our law. |
recipient.probable_match | Two recipient records may be one person, and a person needs to answer. |
confirmation.overdue | Answers given for actions you took wait on rules of a version that applies today and that your rule owner has not confirmed yet. payload.waiting says how many answers wait, and payload.pending lists the rules still to confirm. Raised once per version, and only once an answer waits: a version just published, whose rules nothing has reached yet, is not overdue, and neither is an ask about an action not yet taken. |
A re-check is stored whenever any part of an answer moved, down to the year-to-date total it reports. An alert is raised when the state or an outcome moved — the changes someone has to act on.
For software that acted on an answer
An agent that acted on an answer learns here that the answer has changed. A key made for an agent lists the alerts about its own agent's actions alone - an answer given again, an action taken against your rules or handed to a person, one your rules could not answer - never another agent's or your account's own news; your account's own keys list every one. Each check.rechecked alert carries the new answer's check_id and the one it supersedes: poll GET /v1/alerts?type=check.rechecked and look for the check_ids you acted on under payload.supersedes. A checks.rerun alert covers many answers at once, so it links to them instead: follow payload.checks, and each answer listed names the one it replaced in supersedes_check_id. GET /v1/checks/{id} on an old answer shows superseded_by either way. Signed webhooks are not offered yet: polling is the interface.
Acknowledging
POST /v1/alerts/{id}/acknowledge marks an alert as seen. It changes nothing else: an alert has one status, shared by every caller, and is emailed to your admins whatever it is. A person marks one seen on the console's Home the same way, so software of yours that reads open alerts sees it seen too. acknowledged_by names who saw it — from one of your account's own keys a person in your account, signed in yourself — and a key made for an agent marks seen only the alerts it lists, any other being 404 not-found to it, and names nobody (422 invalid-request, not_the_keys).
Each alert is also emailed once to your account's admins - but never to the person whose own act it reports: a version they published, an answer their approval or decision issued again (by_user). Where they are your only admin it is emailed to nobody, and listed here for everyone all the same. The email says what it is about in your words, as the console does: a playbook by its title, a rule by its title, an agent by its role, and a changed answer by its action - what it came to, who asked, under which playbook - with what it was and is now. The listing's emailed_at and emailed_to say when everyone it goes to had been emailed, and how many it reached: a person whose mail server refused their address is not counted, and the others are emailed all the same. The email links the console's page for what it reports - the answer in the check log, a version's confirmation page, the review queue - the one Home links the same alert to. An action handed over goes to the person it is handed to alone, at once - never to your admins, who read it here and on Home. An action taken against your rules goes to the approver its rule names as well, and in one summary a day to each of them, grouped by rule — unless its rule is one your owner has chosen to hear of at once, under the setting emailed_at_once (a list of your policies' rule ids), which is emailed as it happens; payload.emailed says which. An alert belongs to the environment it is about, and in an account with live and test, one raised by test data is listed to test keys and emailed to nobody: trying an integration never reaches your finance team's inbox. The sandbox, which is test only, emails its own.
Endpoints
/v1/alertsScope checks:readWhat has changed since you last looked
Newest first. check.rechecked means an answer you were given has been issued again - payload.was and payload.now say what moved - and a caller that acted on the earlier answer learns it here. check.against_rules means an action reported as taken was not allowed by your own rules as taken - not_allowed, needs_approval, hand_to_a_person - one alert an action. check.rule_set_broken means an action that happened could not be checked, its rules unable to run on its facts: it is kept, counts in every total, and is answered not_covered until a version that can answer it is confirmed. check.handed_over means an agent asked about an action your rules hand to the person they name, who is told: one alert for each action and person. The others: a new version published, a probable match to answer, and confirmations still pending once a version is in force. Poll it; webhooks come later.
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
typequery · string or nullstatusquery · string or nulllimitquery · integer
Responses
200 Successful response
alertslist of Alertrequired9 fields
alert_idstringrequiredtypestringrequiredrule_set.version.published,check.rechecked,checks.rerun,recipient.probable_match,confirmation.overdue,check.against_rules,check.rule_set_brokenorcheck.handed_over.payloadobjectrequiredWhat changed: for
rule_set.version.published, therule_set, itsversionand the day it applies from (effective_from), the rules stillpending, andby_user, the person of yours who published it, null for our law; forcheck.rechecked,wasandnow, andby_user, the person whose approval or decision issued it again, null for any other cause; forchecks.rerun, itscause, how many answers it checked again (reissued) and changed (changed), how many of them are actions taken that now stand against your rules (against_rules), andchecks, the query that lists them; forconfirmation.overdue, therule_setandversion, the rules stillpending, and how many answers wait on them (waiting); forcheck.against_rules, an action taken that your own rules did not allow as taken - thecheck_idof the answer that stands,transaction_id,effective_date, who acted (actor), thecause, whether it is emailed at once or in the day's summary (emailed), andagainst: each policy that said so, itsrule_set,rule_version, theruleand itstitle, theoutcome, and theapproverit named, where it named one; forcheck.rule_set_broken, an action that happened whose rules could not run on its facts, kept and answerednot_covered- thecheck_id,transaction_id, therule_setits check named,effective_dateand the answer'sdetail; forcheck.handed_over, an action an agent asked about that your rules hand to the person they name - thecheck_idthat handed it over,transaction_id,action(its first booking),handed_to,effective_date, the agent (actor), and the policy that said so:rule_set,rule_version, therule, itstitleand theoutcome.status"open" | "acknowledged"requiredcreated_atstringrequiredacknowledged_bystring or nullacknowledged_atstring or nullemailed_atstring or nullemailed_tointeger or nullHow many people it was emailed to: your admins, and for
check.against_rulesthe approvers it names as well - never the person whose own act it reports (by_user): 0 where they are your only admin; forcheck.handed_overthe person it hands the action to alone. A person whose mail server refused their address is not counted, and the others are emailed all the same.
- 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.
/v1/alerts/{alert_id}/acknowledgeScope checks:writeMark an alert as seen
An alert has one status, shared by every caller of its environment, and is emailed to your admins whatever it is. acknowledged_by names who saw it: yourself, signed in; from one of the account's own keys, a person in the account, or nobody. A key made for an agent names nobody but itself, and naming anybody is 422 invalid-request (not_the_keys).
Parameters
alert_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
acknowledged_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.
Responses
200 Successful response
alert_idstringrequiredstatus"acknowledged"required
- 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.