DocsConcepts
Approvals
Some calls should wait for a person, like a big refund or a change to the company's HubSpot. An approval rule holds them, and the agent goes on once someone says yes.
On this page
- The agent calls a tool that a rule holds. The call answers
approval_requiredwith status 409 and costs nothing. - The request goes to the approver as a one-time page, by email or through a saved channel like Slack.
- The approver picks Approve or Decline on that page, with a comment if they like.
- The agent gets the event
notify.answeredwith the answer.notify_get_approvalshows it too. - On Approve, the agent calls the tool again with the same arguments and the approval. That one call runs.
{
"error": "approval_required",
"approval_id": "3e9a6f12-5c7b-4d81-9f0e-2a6b8c4d1e57",
"approver": "dana@halversoncycle.example",
"message": "A person must approve this first: the request went to dana@halversoncycle.example. When notify.answered arrives (or notify_get_approval says Approve), call again with the same arguments and the approval (header X-Conecto-Approval, or _meta.approvalId over MCP). Nothing was charged.",
"cost_usd": "$0.00"
}The approval goes in the X-Conecto-Approval header over REST, or in _meta.approvalId over MCP. It fits the exact call it was made for: the same tool with the same arguments. Calling again with the same arguments while the request waits reuses that request, so the approver gets one.
account_add_approval_rule makes a tool wait for a person, for $0.001.
| Field | What it does |
|---|---|
tool |
The tool to hold. |
argument and over |
Hold only the calls whose argument is over a number, like invoices_ when amount is over 500. |
argument and values |
Hold only the calls whose argument is one of some values, like connect_call when method is POST, PUT, PATCH or DELETE. |
approver_email |
A person who approves. |
approver_ |
A saved notify channel that gets the request. |
approver_team and approvers |
A team that approves, through its managers or everyone in it. |
two_people_over |
Calls whose argument is over this need two different people. |
With no argument, every call of the tool waits. account_list_approval_rules lists the rules. Bots add rules and tighten them. On an account with an owner email, removing a rule is the owner's, on the account page.
- The person a call is for never approves it: the person an assistant acts as, or the person a bot answers to, its key's
accountable. In a one-person business, with nobody else on the account, the owner approves their own. - Calls over
two_people_overneed two different people to approve. One Decline declines it. - Someone away passes their approvals to their delegate.
- When too few people are left, the owner steps in, then the admins and the billing people. With nobody at all, the call answers
no_approver. - Each approver gets a link of their own, so the page knows who answered. A channel's link is shared, so a call with a known requester goes to people by email.
Three holds need no rule:
- A supplier's new or changed bank details, in
purchasing_save_supplier, always wait for someone else. - Paying a person's expense claims back to an IBAN never paid before, in
books_repay_claims, waits the same way. - Every change from a key or a team set to drafts only waits for its team's managers, or the owner. Reads go through.
On an account with an owner email, connecting some of the company's systems makes rules of its own, with the owner as the approver, unless the tool has a rule already. The request shows what the call would change.
| Connecting with | Waits for the owner | Which calls |
|---|---|---|
connect_add |
connect_ |
Every call |
connect_add |
connect_call |
When method is POST, PUT, PATCH or DELETE |
google_connect |
google_ |
Every call |
google_connect |
google_ |
When if_exists is REPLACE |
hubspot_connect |
hubspot_update |
Every call |
m365_connect |
m365_ |
Every call |
m365_connect |
m365_ |
When if_exists is REPLACE |
salesforce_ |
salesforce_ |
Every call |
directory_ |
directory_ |
Every call |
Your own systems covers each connection.
notify_request_approval asks a person before the agent acts, with no rule needed: approve or decline, or one of up to 5 options, with an optional comment. It goes through a saved channel or by email as a one-time page, and costs $0.01 a request, $0.02 more by email, up to $0.03. The answer is free.
{
"question": "Refund order 1042 in full ($849)?",
"details": "The buyer says the Tabor arrived with a bent derailleur hanger and sent two photos.",
"email": "dana@halversoncycle.example",
"reference": "order-1042"
}- The first answer reaches the agent as the event
notify.answered, with the option picked and the comment. - A request lapses after
expires_in_hours: 72 hours unless set, 720 at most. - Anyone holding the link can answer, so send it to the person who decides and nobody else.
- Email follows the account's rules: on free credit, it reaches only the owner.
Updated . Every route, field and number here is read from the API's own code.