DocsReference
REST API
The REST API signs an agent up, runs every tool and looks after the account. This page lists every route with what it takes, what it answers and an example.
On this page
- Basics
- Sign up and get a key
- Check the balance
- List the credit added
- Top up the balance
- Check auto-reload
- Turn auto-reload on, or change its amount
- Turn auto-reload off
- Check the limits
- Lower the limits
- List the keys
- Make a key
- Revoke a key
- List recent calls
- Get a call (poll background calls)
- Call a tool
- Routes for discovery
- Base address.
https://api.conecto.chat. Every route below starts there. - Keys. Send the key as
Authorization: Bearer <key>.X-Api-Key: <key>works too. The routes for discovery need no key. Keys and scopes - Bodies. JSON, with
Content-Type: application/, up to 16 MB.json - Amounts. Strings in US dollars with as many decimals as they need, at least two, like
"$0.01". Amounts you send, likeamount_usd, are numbers. - Times. ISO 8601 in UTC, like
2026-10-14T08:00:00+00:00. - Refusals. A status of 400 or more, with
errorandmessage, and nothing charged. Errors - OpenAPI. https://api.conecto.chat/v1/openapi.json describes every route here and every tool.
The balance and the call log also have tools, account_balance, account_list_calls and account_get_call, so an agent on MCP reaches them too.
POSThttps://api.conecto.chat/v1/signup
Makes the account, its first key and $1 of free credit. With join, it makes a key on the company's account instead, for the team and areas the code names. That reply has joined and scope, and no free credit, ceiling, terms or owner_note.
It needs no key.
| Field | Type | What it is |
|---|---|---|
bot_name Required |
string | The bot's name, as the call log shows it. 1 to 80 characters. |
accept_terms Required |
boolean | Must be true. It accepts the terms, with their data processing terms, for the business you act for. |
business_name |
string | The business the account is for. Without it the account is called after the bot. |
owner_email |
string (email) | The owner's address. It makes them the owner at once, with nothing to confirm. |
country |
string | The business's country as two letters, like US or DE. |
runtime |
string | What the agent runs in, like n8n or Claude Code. It shows beside the key. |
website |
string | The business's website. |
referral |
string | A Conecto partner's code, if a partner sent you. It only counts at signup. |
join |
string | A join code the company gave you, in place of signing up alone. |
accountable |
string | The person who answers for the key. |
The key (shown once) and the balance.
| Field | Type | What it is |
|---|---|---|
account_id |
integer | The account's number. |
business_name |
string | The business the account is for. |
key |
string | The key. It is shown once. |
key_note |
string | How to send the key. |
balance_usd |
string | What the account can spend now: its credit, less what running calls hold, plus the reload amount while auto-reload is on. |
free_credit_usd |
string | The free credit this signup got. |
free_ |
string or null | Why this signup got no free credit, when it got none. |
daily_ |
string | This key's daily budget. |
monthly_ |
string | The account's monthly ceiling. |
owner_note |
string | What the owner email means: whether anyone has something to confirm, and who raises limits. |
terms |
object | The terms accepted: their version, their addresses and the business they were accepted for. |
next |
object | The next calls to make, in words. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 400 | invalid_input |
The arguments do not fit the tool: a field is missing, has the wrong type or is out of range, or a value is not one the tool takes. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl -X POST https://api.conecto.chat/v1/signup \
-H "Content-Type: application/json" \
-d '{
"bot_name": "Pip",
"accept_terms": true,
"business_name": "Halverson Cycle & Repair",
"owner_email": "dana@halversoncycle.example"
}'Reply 201
{
"account_id": 4127,
"business_name": "Halverson Cycle & Repair",
"key": "conecto_sk_4f9b2c7e1a8d3f6b0e5c9a2d7f1b4e8c",
"key_note": "Shown once. Send it as \"Authorization: Bearer <key>\" on every call.",
"balance_usd": "$1.00",
"free_credit_usd": "$1.00",
"free_credit_note": null,
"daily_budget_usd": "$20.00",
"monthly_ceiling_usd": "$100.00",
"owner_note": "dana@halversoncycle.example is the owner now, with nothing to confirm: they sign in at conecto.chat/account/login with that address. Only the owner raises limits, and the account's warnings and approval requests go to them.",
"terms": {
"version": "2026-10-27",
"url": "https://conecto.chat/terms",
"privacy": "https://conecto.chat/privacy",
"accepted_for": "Halverson Cycle & Repair"
},
"next": {
"tools": "GET /v1/tools",
"run": "POST /v1/tools/<name> with the arguments as a JSON object",
"mcp": "Connect https://api.conecto.chat/mcp/<area> with the same Authorization header",
"top_up": "POST /v1/topups {\"amount_usd\": 20}: your first top-up is doubled, up to $20 extra"
}
}GEThttps://api.conecto.chat/v1/balance
The balance, this key's daily budget, the account's monthly ceiling, auto-reload and the month's free reads and downloads. With an empty balance it also says how to top up.
Send the key as Authorization: Bearer <key>.
The balance and limits.
| Field | Type | What it is |
|---|---|---|
balance_usd |
string | What the account can spend now: its credit, less what running calls hold, plus the reload amount while auto-reload is on. |
reserved_usd |
string | What running calls hold until they settle. |
daily_ |
string | This key's daily budget. |
monthly_ |
string | The account's monthly ceiling. |
auto_reload |
object | Whether auto-reload is on, and its amount. |
auto_ |
string | off, pending (waiting for the first payment), active or failed (a card payment failed). |
auto_ |
string | The reload amount. |
free_this_month |
object | The month's free reads and downloads: what is used, what was bought and when they start again. |
top_up |
string | Only when the balance is empty: how to top up. |
minimum_usd |
integer | Only when the balance is empty: the smallest top-up. |
fee |
string | Only when the balance is empty: the fee on a top-up. |
first_ |
string or null | Only when the balance is empty: the first top-up's bonus. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/balance \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"balance_usd": "$1.00",
"reserved_usd": "$0.00",
"daily_budget_usd": "$20.00",
"monthly_ceiling_usd": "$100.00",
"auto_reload": {
"status": "off",
"amount_usd": "$0.00"
},
"free_this_month": {
"reads": {
"free": 1000000,
"used": 0,
"bought": 0,
"price_after": "$0.50 per 10,000 reads"
},
"downloads": {
"free": "5 GB",
"used": "0 bytes",
"bought": "0 bytes",
"free_bytes": 5368709120,
"used_bytes": 0,
"bought_bytes": 0,
"price_after": "$0.30 per GB"
},
"resets_at": "2026-11-01T00:00:00+00:00"
}
}GEThttps://api.conecto.chat/v1/topups
The newest 100 entries of credit added: top-ups, first top-up bonuses, auto-reloads and free credit. A top-up says until when the account_refund_topup tool can refund it.
Send the key as Authorization: Bearer <key>.
The credit added.
| Field | Type | What it is |
|---|---|---|
credits |
array of objects | The credit added, newest first: top-ups, first top-up bonuses, auto-reloads and free credit. |
credits[].id |
integer | The entry's number. account_ takes a top-up's number as topup_id. |
credits[].kind |
string | What added it: topup, bonus, auto_reload or free_credit. |
credits[].amount_ |
string | The credit added. |
credits[].at |
string | When it was added. |
credits[].note |
string or null | Its note, like the purchase order number of a top-up. |
credits[].refundable_ |
string or null | Until when a top-up can be refunded. null once the window has closed or part of it was used. |
refunds |
string | How a top-up is refunded. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/topups \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"credits": [
{
"id": 813,
"kind": "bonus",
"amount_usd": "$20.00",
"at": "2026-10-14T09:12:00+00:00",
"note": "First top-up doubled"
},
{
"id": 812,
"kind": "topup",
"amount_usd": "$20.00",
"at": "2026-10-14T09:12:00+00:00",
"note": "Top-up, PO 4500012345",
"refundable_until": "2026-10-15T09:12:00+00:00"
},
{
"id": 790,
"kind": "free_credit",
"amount_usd": "$1.00",
"at": "2026-10-14T08:00:00+00:00",
"note": "Free signup credit"
}
],
"refunds": "An unused top-up can be refunded within 24 hours with the account_refund_topup tool; the fee is kept."
}POSThttps://api.conecto.chat/v1/topups
A Stripe checkout link to pay once for credit, from $5 to $5,000 in whole cents. po_number prints a purchase order number on the receipt and the invoice.
Send the key as Authorization: Bearer <key>.
| Field | Type | What it is |
|---|---|---|
amount_usd Required |
number | The credit to buy, in US dollars, in whole cents. |
po_number |
string | A purchase order number. It is printed on the receipt and the invoice. |
A Stripe checkout link to pay once.
| Field | Type | What it is |
|---|---|---|
checkout_url |
string | Stripe's checkout page. Open it, or hand it to the owner, and pay once. |
amount_usd |
string | The credit bought, before the fee. |
fee_usd |
string | The service fee on this top-up. |
total_usd |
string | What the card pays. |
first_ |
string | The bonus credit this top-up brings, when it is the account's first. |
credited_usd |
string | The credit the balance gets once it is paid. |
po_number |
string | The purchase order number, when one was given. |
how |
string | What happens next, in words. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 400 | invalid_input |
The arguments do not fit the tool: a field is missing, has the wrong type or is out of range, or a value is not one the tool takes. |
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl -X POST https://api.conecto.chat/v1/topups \
-H "Authorization: Bearer $CONECTO_KEY" \
-H "Content-Type: application/json" \
-d '{"amount_usd": 20, "po_number": "4500012345"}'Reply 201
{
"checkout_url": "https://checkout.stripe.com/c/pay/cs_live_a1B2c3D4e5F6g7H8",
"amount_usd": "$20.00",
"fee_usd": "$1.75",
"total_usd": "$21.75",
"first_topup_bonus_usd": "$20.00",
"credited_usd": "$40.00",
"how": "Open the link, or hand it to your owner. Credit lands within seconds of payment.",
"po_number": "4500012345"
}GEThttps://api.conecto.chat/v1/auto-reload
Whether auto-reload is on, and its amount.
Send the key as Authorization: Bearer <key>.
Whether auto-reload is on, and its amount.
| Field | Type | What it is |
|---|---|---|
status |
string | off, pending (waiting for the first payment), active or failed (a card payment failed). |
amount_usd |
string | The reload amount. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/auto-reload \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"status": "off",
"amount_usd": "$20.00"
}POSThttps://api.conecto.chat/v1/auto-reload
When auto-reload is off, it answers 201 with a Stripe checkout link to pay once. After that the card is charged each time the bots use the amount, plus the top-up fee. When it is on, it changes the amount and answers 200. A scoped key answers key_scope.
Send the key as Authorization: Bearer <key>.
| Field | Type | What it is |
|---|---|---|
amount_usd |
number | The reload amount in US dollars, in whole cents. Left out, it keeps the amount set before. |
It was on: the new amount.
| Field | Type | What it is |
|---|---|---|
status |
string | pending until the first payment, or active when it was on already. |
amount_usd |
string | The reload amount. |
Pay once through the link to turn it on.
| Field | Type | What it is |
|---|---|---|
status |
string | pending until the first payment, or active when it was on already. |
checkout_url |
string | Stripe's checkout page. Open it, or hand it to the owner, and pay once. |
amount_usd |
string | The reload amount. |
how |
string | What happens next, in words. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 400 | invalid_input |
The arguments do not fit the tool: a field is missing, has the wrong type or is out of range, or a value is not one the tool takes. |
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | key_scope |
The key's scope doesn't cover this: another area, a tool it isn't given or is denied, a change by a read-only key, or a setting only a key without limits changes. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
| 503 | unavailable |
The tool, or a service it needs, is not available right now (or not switched on yet). Nothing was charged. |
Request
curl -X POST https://api.conecto.chat/v1/auto-reload \
-H "Authorization: Bearer $CONECTO_KEY" \
-H "Content-Type: application/json" \
-d '{"amount_usd": 20}'Reply 201
{
"status": "pending",
"checkout_url": "https://checkout.stripe.com/c/pay/cs_live_b2C3d4E5f6G7h8I9",
"amount_usd": "$20.00",
"how": "Pay once through the link; after that the card is charged automatically each time your bots use the reload amount, plus the 7% + $0.35 fee each time."
}DELETEhttps://api.conecto.chat/v1/auto-reload
Turns auto-reload off, and a last invoice bills the usage left. A scoped key answers key_scope.
Send the key as Authorization: Bearer <key>.
Off.
| Field | Type | What it is |
|---|---|---|
status |
string | off. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | key_scope |
The key's scope doesn't cover this: another area, a tool it isn't given or is denied, a change by a read-only key, or a setting only a key without limits changes. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl -X DELETE https://api.conecto.chat/v1/auto-reload \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"status": "off"
}GEThttps://api.conecto.chat/v1/limits
This key's daily budget and the account's monthly ceiling.
Send the key as Authorization: Bearer <key>.
This key's daily budget and the account's monthly ceiling.
| Field | Type | What it is |
|---|---|---|
daily_ |
string | This key's daily budget. |
monthly_ |
string | The account's monthly ceiling. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/limits \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"daily_budget_usd": "$20.00",
"monthly_ceiling_usd": "$100.00"
}PATCHhttps://api.conecto.chat/v1/limits
Lowers this key's daily budget or the account's monthly ceiling, at any time. On an account with an owner email, raising either is the owner's and answers owner_required. A scoped key answers key_scope.
Send the key as Authorization: Bearer <key>.
| Field | Type | What it is |
|---|---|---|
daily_ |
number | Its daily budget. On an account with an owner email, at most this key's. |
monthly_ |
number | The account's monthly ceiling. |
The limits now.
| Field | Type | What it is |
|---|---|---|
daily_ |
string | This key's daily budget. |
monthly_ |
string | The account's monthly ceiling. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 400 | invalid_input |
The arguments do not fit the tool: a field is missing, has the wrong type or is out of range, or a value is not one the tool takes. |
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | key_scope |
The key's scope doesn't cover this: another area, a tool it isn't given or is denied, a change by a read-only key, or a setting only a key without limits changes. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 403 | owner_required |
Only the owner may raise a spending limit or give a new key more daily budget than the key making it. The account page's own tools, and asking Conecto for a higher limit, take the owner, an admin or a key of the company-wide team without limits. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl -X PATCH https://api.conecto.chat/v1/limits \
-H "Authorization: Bearer $CONECTO_KEY" \
-H "Content-Type: application/json" \
-d '{"daily_budget_usd": 10}'Reply 200
{
"daily_budget_usd": "$10.00",
"monthly_ceiling_usd": "$100.00"
}GEThttps://api.conecto.chat/v1/keys
The account's keys that work, with their scopes. current marks the key making the call.
Send the key as Authorization: Bearer <key>.
The keys that work.
| Field | Type | What it is |
|---|---|---|
keys |
array of objects | The account's keys that work. |
keys[].key_id |
integer | The key's number. DELETE /v1/keys/{key_ revokes it. |
keys[].bot_name |
string | The name it was made with. |
keys[].runtime |
string | What it runs in, when it said. |
keys[].last4 |
string | The key's last four characters. |
keys[].daily_ |
string | Its daily budget. |
keys[].current |
boolean | true for the key making this call. |
keys[].scope |
object | What the key may do: its areas, tools, tools it may not run, reading only, drafts only, end date, networks, team and the person who answers for it. null means no limit. |
keys[].scope.areas |
array or null | The areas it works in. |
keys[].scope.tools |
array or null | The only tools it may run. |
keys[].scope.deny_ |
array or null | Tools it may not run. |
keys[].scope.read_ |
boolean | It only reads. |
keys[].scope.drafts_ |
boolean | Every change it makes waits for a person. |
keys[].scope.expires_ |
string or null | It stops working at this time, as ISO 8601 with its offset. |
keys[].scope.networks |
array or null | The addresses or ranges it may be used from. |
keys[].scope.team |
string or null | Its team. |
keys[].scope.accountable |
string or null | The person who answers for the key. |
keys[].last_ |
string or null | When it last made a call. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/keys \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"keys": [
{
"key_id": 4127,
"bot_name": "Pip",
"runtime": "n8n",
"last4": "4e8c",
"daily_budget_usd": "$20.00",
"current": true,
"scope": {
"areas": null,
"tools": null,
"deny_tools": null,
"read_only": false,
"drafts_only": false,
"expires_at": null,
"networks": null,
"team": "Company",
"accountable": null
},
"last_used_at": "2026-10-14T09:30:00+00:00"
}
]
}POSThttps://api.conecto.chat/v1/keys
A key for another bot or job, within this key's scope and team. It shares the daily budget of its line's first key. An account has at most 25 keys that work.
Send the key as Authorization: Bearer <key>.
| Field | Type | What it is |
|---|---|---|
bot_name Required |
string | The bot's name, as the call log shows it. 1 to 80 characters. |
runtime |
string | What the agent runs in, like n8n or Claude Code. It shows beside the key. |
daily_ |
number | Its daily budget. On an account with an owner email, at most this key's. |
areas |
array of strings | The areas it works in. |
tools |
array of strings | The only tools it may run. |
deny_tools |
array of strings | Tools it may not run. |
read_only |
boolean | It only reads. |
drafts_only |
boolean | Every change it makes waits for a person. |
expires_in_days |
integer | It stops working after this many days. |
expires_at |
string (date-time) | It stops working at this time, as ISO 8601 with its offset. |
networks |
array of strings | The addresses or ranges it may be used from. |
team |
string | Its team. Only a key of the company-wide team with no limits names another team, and a new name makes it. |
accountable |
string | The person who answers for the key. |
The new key (shown once) and its scope.
| Field | Type | What it is |
|---|---|---|
key_id |
integer | The new key's number. |
key |
string | The key. It is shown once. |
key_note |
string | How to send the key. |
daily_ |
string | This key's daily budget. |
scope |
object | What the key may do: its areas, tools, tools it may not run, reading only, drafts only, end date, networks, team and the person who answers for it. null means no limit. A person's own assistant shows the person and their teams. |
scope.areas |
array or null | The areas it works in. |
scope.tools |
array or null | The only tools it may run. |
scope.deny_ |
array or null | Tools it may not run. |
scope.read_only |
boolean | It only reads. |
scope.drafts_ |
boolean | Every change it makes waits for a person. |
scope.expires_ |
string or null | It stops working at this time, as ISO 8601 with its offset. |
scope.networks |
array or null | The addresses or ranges it may be used from. |
scope.team |
string or null | Its team. |
scope.accountable |
string or null | The person who answers for the key. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 400 | invalid_input |
The arguments do not fit the tool: a field is missing, has the wrong type or is out of range, or a value is not one the tool takes. |
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 403 | owner_required |
Only the owner may raise a spending limit or give a new key more daily budget than the key making it. The account page's own tools, and asking Conecto for a higher limit, take the owner, an admin or a key of the company-wide team without limits. |
| 403 | scope_too_wide |
A new key can't be wider than the key making it: more areas or tools, other networks, or a later expiry. |
| 409 | limit_reached |
The business has as many of these as it may: keys, tables, schedules, pages, channels and the like. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl -X POST https://api.conecto.chat/v1/keys \
-H "Authorization: Bearer $CONECTO_KEY" \
-H "Content-Type: application/json" \
-d '{
"bot_name": "Support bot",
"areas": ["helpdesk"],
"drafts_only": true,
"expires_at": "2027-01-31T18:00:00Z",
"networks": ["203.0.113.0/24"],
"team": "Support",
"accountable": "Lena Brandt"
}'Reply 201
{
"key_id": 4128,
"key": "conecto_sk_9d2e7b4a1c6f3e8b5a0d7c2f9e4b1a6d",
"key_note": "Shown once.",
"daily_budget_usd": "$20.00",
"scope": {
"areas": ["helpdesk"],
"tools": null,
"deny_tools": null,
"read_only": false,
"drafts_only": true,
"expires_at": "2027-01-31T18:00:00+00:00",
"networks": ["203.0.113.0/24"],
"team": "Support",
"accountable": "Lena Brandt"
}
}DELETEhttps://api.conecto.chat/v1/keys/{key_id}
A key revokes itself and the keys made from it, and the first key of a line revokes any key of its line.
Send the key as Authorization: Bearer <key>.
| Parameter | In | Type | What it is |
|---|---|---|---|
key_id |
path | integer | The new key's number. |
Revoked.
| Field | Type | What it is |
|---|---|---|
revoked |
integer | The number of the key revoked. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 403 | not_yours |
A key revokes itself and the keys made from it. The first key of a line revokes any key of its line. |
| 404 | not_found |
The thing named does not exist for this business: a record, a file, a call, a key or a page. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl -X DELETE https://api.conecto.chat/v1/keys/4128 \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"revoked": 4128
}GEThttps://api.conecto.chat/v1/calls
The account's calls, newest first. A scoped key sees its own calls only.
Send the key as Authorization: Bearer <key>.
| Parameter | In | Type | What it is |
|---|---|---|---|
limit |
query | integer | How many calls to list, newest first. |
status |
query | string | Only the calls in this state. |
The calls.
| Field | Type | What it is |
|---|---|---|
calls |
array of objects | The calls, newest first. |
calls[].call_id |
string | The call's id. |
calls[].tool |
string | The tool called. |
calls[].area |
string | The tool's area. |
calls[].status |
string | Where the call is: reserved (waiting to run), running, succeeded or failed. |
calls[].cost_ |
string | What the call cost. A call that fails costs $0.00. |
calls[].error |
string or null | The error code of a call that failed. |
calls[].message |
string or null | What went wrong, in words. |
calls[].latency_ |
integer or null | How long the tool took, in milliseconds. |
calls[].at |
string | When the call was made. |
calls[].bot |
string or null | The name of the key that made it. |
calls[].person |
string or null | Whose agent it was: the person the key belongs to, by name or email. null for a bot's own key. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/calls?limit=20&status=succeeded \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"calls": [
{
"call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
"tool": "crm_save_contact",
"area": "crm",
"status": "succeeded",
"cost_usd": "$0.01",
"error": null,
"message": null,
"latency_ms": 84,
"at": "2026-10-14T08:00:00+00:00",
"bot": "Pip",
"person": null
}
]
}GEThttps://api.conecto.chat/v1/calls/{call_id}
One call with its status and cost, what it was given and what it answered. Poll it for a call that runs in the background.
Send the key as Authorization: Bearer <key>.
| Parameter | In | Type | What it is |
|---|---|---|---|
call_id |
path | string | The call's id. |
The call, its status and cost, with what it was given and what it answered.
| Field | Type | What it is |
|---|---|---|
call_id |
string | The call's id. |
tool |
string | The tool called. |
area |
string | The tool's area. |
status |
string | Where the call is: reserved (waiting to run), running, succeeded or failed. |
cost_usd |
string | What the call cost. A call that fails costs $0.00. |
error |
string or null | The error code of a call that failed. |
message |
string or null | What went wrong, in words. |
latency_ms |
integer or null | How long the tool took, in milliseconds. |
at |
string | When the call was made. |
bot |
string or null | The name of the key that made it. |
person |
string or null | Whose agent it was: the person the key belongs to, by name or email. null for a bot's own key. |
input |
object or null | The arguments it was given. A secret argument shows as [redacted]. |
output |
object or null | What it answered. |
A refusal costs nothing and its message says what to do. Each code links to its fix.
| Status | Code | What it means |
|---|---|---|
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 404 | not_found |
The thing named does not exist for this business: a record, a file, a call, a key or a page. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
Request
curl https://api.conecto.chat/v1/calls/5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93 \
-H "Authorization: Bearer $CONECTO_KEY"Reply 200
{
"call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
"tool": "crm_save_contact",
"area": "crm",
"status": "succeeded",
"cost_usd": "$0.01",
"error": null,
"message": null,
"latency_ms": 84,
"at": "2026-10-14T08:00:00+00:00",
"bot": "Pip",
"person": null,
"input": {
"email": "jana@weber-kuechenplanung.example",
"name": "Jana Weber",
"title": "Kitchen planner",
"company": "Weber Küchenplanung",
"phone": "+49 40 66969 120",
"location": "Hamburg",
"lifecycle_stage": "lead",
"tags": ["trade", "test-kitchen-visit"]
},
"output": {
"contact": {
"id": 4107,
"email": "jana@weber-kuechenplanung.example",
"name": "Jana Weber",
"title": "Kitchen planner",
"company": "Weber Küchenplanung",
"company_id": 4105,
"phone": "+49 40 66969 120",
"location": "Hamburg",
"lifecycle_stage": "lead",
"outreach_status": null,
"notes": "",
"tags": ["test-kitchen-visit", "trade"],
"custom_fields": {},
"archived": false,
"updated_at": "2026-10-14T08:00:00+00:00"
},
"created": true
}
}POSThttps://api.conecto.chat/v1/tools/{name}
Runs one of the 581 tools. The body is the tool's arguments as a JSON object, and each tool's page in the tools directory lists them. Send the key as Authorization: Bearer <key>.
| Header | What it is |
|---|---|
Authorization Required |
Bearer and the key. X-Api-Key with the key works too. |
Content-Type |
application/json. |
Idempotency-Key |
Any string up to 120 characters. The same key never charges twice. A longer one is kept as its SHA-256. |
X-Conecto-Approval |
The approval_id of a call a person approved. It lets that one call run. |
The envelope every tool answers in. The tool's own answer is in result.
| Field | Type | What it is |
|---|---|---|
call_id |
string | The call's id. |
tool |
string | The tool called. |
status |
string | succeeded. A call that runs in the background answers running first, with status 202. |
replayed |
boolean | true when the reply repeats an earlier call with the same Idempotency-Key. A replay costs nothing. |
cost_usd |
string | What the call cost. A call that fails costs $0.00. |
balance_usd |
string | What the account can spend now: its credit, less what running calls hold, plus the reload amount while auto-reload is on. |
result |
object | What the tool answered. Each tool's page shows its result. |
bought |
object | Only on a read that bought the month's next block of reads: what it bought and what that cost, as a call of its own. |
A tool that runs in the background answers 202 at once with status: "running". Poll GET /v1/calls/{call_id} or the account_get_call tool until status is succeeded or failed. The call is charged only when it succeeds.
A refusal answers with a status of 400 or more, and cost_usd is $0.00. These codes come from the API before or around the tool's own work. Each tool's page lists the codes the tool itself can give.
| Field | Type | What it is |
|---|---|---|
error |
string | The error code of a call that failed. |
message |
string | What went wrong, in words. |
cost_usd |
string | What the call cost. A call that fails costs $0.00. |
details |
object | What is needed to fix it, when there is something to add. |
| Status | Code | What it means |
|---|---|---|
| 400 | invalid_input |
The arguments do not fit the tool: a field is missing, has the wrong type or is out of range, or a value is not one the tool takes. |
| 401 | key_expired |
The key has expired. |
| 401 | unauthorized |
The call has no key, or the key is wrong or revoked. |
| 402 | insufficient_ |
The balance cannot cover the most this call can cost, or the next reads or downloads once the month's free ones are used (a download link answers it to whoever opens it). |
| 402 | purchased_ |
AI visibility and the phone (calls, minutes and a number's rent) run only on credit bought with a top-up, never on free, beta or bonus credit, and the credit bought left cannot cover the most this call can cost. |
| 403 | account_paused |
The owner paused every bot of the account. |
| 403 | key_scope |
The key's scope doesn't cover this: another area, a tool it isn't given or is denied, a change by a read-only key, or a setting only a key without limits changes. |
| 403 | network_ |
The key may only be used from the networks it was given. |
| 403 | no_approver |
Nobody but the person asking can approve this call, and nobody approves their own. |
| 403 | other_team |
The record belongs to another team. Every team reads it. Its own team changes it. |
| 403 | team_paused |
The key's team is paused, so its keys can't run tools. |
| 404 | not_found |
The thing named does not exist for this business: a record, a file, a call, a key or a page. |
| 404 | unknown_tool |
No tool has that name, or a background call's tool is gone. |
| 409 | approval_ |
A person must approve this exact call first: an approval rule holds the tool, the key or its team is set to drafts only, or it gives a supplier new bank details. The request went to the approvers, each on a link of their own, and two people approve when the amount is over the rule's second line. Nothing was charged. |
| 409 | idempotency_ |
The Idempotency-Key was used before for a different tool or different arguments. |
| 409 | in_progress |
The same work is running right now: a call with this Idempotency-Key, an import, the reading of a scan, or an export of the account. |
| 413 | too_large |
The file, page or upload is over its size limit. |
| 429 | daily_ |
The key reached its daily budget. Keys made from one key share that key's budget. |
| 429 | monthly_ |
The business reached its monthly spending ceiling. |
| 429 | rate_limited |
Too many calls in a short time: from this key or account, or to a service the tool uses (search, social posting, a site's analytics events), or more than three exports of the account in a day. |
| 429 | team_ |
The key's team spent its budget for this period, and the budget is hard. |
| 500 | internal_error |
Something failed on Conecto's side. Nothing was charged. |
| 500 | secret_ |
A background call's secret arguments could not be read back. Nothing was charged. |
| 503 | unavailable |
The tool, or a service it needs, is not available right now (or not switched on yet). Nothing was charged. |
Request
curl -X POST https://api.conecto.chat/v1/tools/crm_save_contact \
-H "Authorization: Bearer $CONECTO_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "jana@weber-kuechenplanung.example",
"name": "Jana Weber",
"title": "Kitchen planner",
"company": "Weber Küchenplanung",
"phone": "+49 40 66969 120",
"location": "Hamburg",
"lifecycle_stage": "lead",
"tags": ["trade", "test-kitchen-visit"]
}'Reply 200
{
"call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
"tool": "crm_save_contact",
"status": "succeeded",
"replayed": false,
"cost_usd": "$0.01",
"balance_usd": "$19.75",
"result": {
"contact": {
"id": 4107,
"email": "jana@weber-kuechenplanung.example",
"name": "Jana Weber",
"title": "Kitchen planner",
"company": "Weber Küchenplanung",
"company_id": 4105,
"phone": "+49 40 66969 120",
"location": "Hamburg",
"lifecycle_stage": "lead",
"outreach_status": null,
"notes": "",
"tags": ["test-kitchen-visit", "trade"],
"custom_fields": {},
"archived": false,
"updated_at": "2026-10-14T08:00:00+00:00"
},
"created": true
}
}Reply 202
{
"call_id": "9b7e3c51-2f4a-4d8e-a0c6-71e5d2b8f4a3",
"tool": "speech_transcribe",
"status": "running",
"reserved_usd": "$0.60",
"poll": "GET /v1/calls/9b7e3c51-2f4a-4d8e-a0c6-71e5d2b8f4a3 (or the account_get_call tool) until status is succeeded or failed. You are charged only when it succeeds."
}Reply 409
{
"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"
}These answer without a key. An agent reads them to find out what Conecto has before it signs up.
GEThttps://api.conecto.chat/v1
What Conecto is, how to sign up, the prices in a few words and every area's MCP address.
{
"name": "Conecto",
"what": "The business backend for AI agents: CRM, email, phone, help desk, documents and more, paid per call.",
"signup": {
"method": "POST",
"url": "https://api.conecto.chat/v1/signup",
"body": {
"bot_name": "string",
"accept_terms": true,
"business_name": "optional",
"owner_email": "optional",
"country": "optional, two letters",
"runtime": "optional",
"referral": "optional, a Conecto partner's code; only at signup"
},
"free_credit_usd": "$1.00"
},
"pricing": {
"failed_calls": "never charged",
"reads": "free up to 1,000,000 a month",
"top_up_minimum_usd": "$5.00",
"top_up_fee": "7% + $0.35",
"first_top_up": "doubled, up to $20 extra",
"catalog": "https://api.conecto.chat/v1/tools"
},
"areas": "https://api.conecto.chat/v1/areas",
"mcp": {
"analytics": "https://api.conecto.chat/mcp/analytics",
"code": "https://api.conecto.chat/mcp/code",
"crm": "https://api.conecto.chat/mcp/crm",
"calendar": "https://api.conecto.chat/mcp/calendar",
"chat": "https://api.conecto.chat/mcp/chat",
"account": "https://api.conecto.chat/mcp/account",
"admin": "https://api.conecto.chat/mcp/admin",
"email": "https://api.conecto.chat/mcp/email",
"helpdesk": "https://api.conecto.chat/mcp/helpdesk",
"documents": "https://api.conecto.chat/mcp/documents",
"esign": "https://api.conecto.chat/mcp/esign",
"hiring": "https://api.conecto.chat/mcp/hiring",
"outreach": "https://api.conecto.chat/mcp/outreach",
"prospects": "https://api.conecto.chat/mcp/prospects",
"lookups": "https://api.conecto.chat/mcp/lookups",
"companies": "https://api.conecto.chat/mcp/companies",
"longlists": "https://api.conecto.chat/mcp/longlists",
"mergers": "https://api.conecto.chat/mcp/mergers",
"valuation": "https://api.conecto.chat/mcp/valuation",
"newsletters": "https://api.conecto.chat/mcp/newsletters",
"notify": "https://api.conecto.chat/mcp/notify",
"projects": "https://api.conecto.chat/mcp/projects",
"schedules": "https://api.conecto.chat/mcp/schedules",
"speech": "https://api.conecto.chat/mcp/speech",
"uptime": "https://api.conecto.chat/mcp/uptime",
"vault": "https://api.conecto.chat/mcp/vault",
"web": "https://api.conecto.chat/mcp/web",
"tables": "https://api.conecto.chat/mcp/tables",
"links": "https://api.conecto.chat/mcp/links",
"images": "https://api.conecto.chat/mcp/images",
"files": "https://api.conecto.chat/mcp/files",
"forms": "https://api.conecto.chat/mcp/forms",
"helpcenter": "https://api.conecto.chat/mcp/helpcenter",
"imports": "https://api.conecto.chat/mcp/imports",
"invoices": "https://api.conecto.chat/mcp/invoices",
"books": "https://api.conecto.chat/mcp/books",
"inventory": "https://api.conecto.chat/mcp/inventory",
"whistleblowing": "https://api.conecto.chat/mcp/whistleblowing",
"connect": "https://api.conecto.chat/mcp/connect",
"microsoft365": "https://api.conecto.chat/mcp/microsoft365",
"googleworkspace": "https://api.conecto.chat/mcp/googleworkspace",
"hubspot": "https://api.conecto.chat/mcp/hubspot",
"salesforce": "https://api.conecto.chat/mcp/salesforce",
"directory": "https://api.conecto.chat/mcp/directory",
"hr": "https://api.conecto.chat/mcp/hr",
"social": "https://api.conecto.chat/mcp/social",
"purchasing": "https://api.conecto.chat/mcp/purchasing",
"phone": "https://api.conecto.chat/mcp/phone",
"websites": "https://api.conecto.chat/mcp/websites",
"views": "https://api.conecto.chat/mcp/views",
"visibility": "https://api.conecto.chat/mcp/visibility",
"markets": "https://api.conecto.chat/mcp/markets"
}
}Its reads are free up to the month's 1,000,000 reads. Past that, each 10,000 more cost $0.50, as Money explains.
GEThttps://api.conecto.chat/v1/areas
Every area with its title, its summary, how many tools it has and its MCP address. There are 52. The first two:
{
"areas": [
{
"area": "analytics",
"title": "Website analytics",
"summary": "Count a website's visits with one script tag, like Plausible or Umami: visitors, pages, sources, countries, devices and custom events. No cookies, and no IP addresses kept. $3 a month per site with 100,000 events.",
"tools": 18,
"mcp": "https://api.conecto.chat/mcp/analytics"
},
{
"area": "code",
"title": "Code",
"summary": "Run Python or Node.js in a fresh sandbox with no network: files from the store go in, the files it writes come back. $0.0001 per second of run time, at least $0.005 a run.",
"tools": 1,
"mcp": "https://api.conecto.chat/mcp/code"
}
]
}GEThttps://api.conecto.chat/v1/tools
Every tool with its name, area, title, description, price and whether it only reads, deletes data or runs in the background. Add ?area=crm for one area. The CRM has 41. The first two:
{
"tools": [
{
"name": "crm_find_contacts",
"area": "crm",
"title": "Find contacts",
"description": "Search the CRM by name, email, company or phone, or by filters on any field, tag or custom field, or by a saved segment. Returns a page of contacts (most recently seen first unless `sort` says otherwise), the total, and next_offset for the next page.",
"price": {
"model": "free",
"usd": "$0.00",
"micros": 0
},
"read_only": true,
"destructive": false,
"runs_in_background": false
},
{
"name": "crm_get_contact",
"area": "crm",
"title": "Get a contact",
"description": "One contact with its tags, custom fields, recent activity, open tasks and deals, by id or email, and came_from: the website visit that led to their first chat, booking, form or signup (channel, source, campaign, landing page), when the site is counted. crm_timeline has everything that happened with them.",
"price": {
"model": "free",
"usd": "$0.00",
"micros": 0
},
"read_only": true,
"destructive": false,
"runs_in_background": false
}
],
"count": 41
}GEThttps://api.conecto.chat/v1/tools/{name}
One tool in full, with its input schema and examples. The same address with POST runs it.
{
"name": "crm_save_contact",
"area": "crm",
"title": "Save a contact",
"description": "Create a contact, or update the one with this email if it already exists. Only the fields you send change; tags are added, custom fields merged. Without an email a new contact is always created.",
"price": {
"model": "per_call",
"usd": "$0.01",
"micros": 10000
},
"read_only": false,
"destructive": false,
"runs_in_background": false,
"input_schema": {
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email"
},
"name": {
"type": "string",
"maxLength": 255
},
"title": {
"type": "string",
"maxLength": 255
},
"company": {
"type": "string",
"maxLength": 255,
"description": "Company name; also links or creates the company record."
},
"phone": {
"type": "string",
"maxLength": 60
},
"location": {
"type": "string",
"maxLength": 255
},
"timezone": {
"type": "string",
"maxLength": 60
},
"language": {
"type": "string",
"maxLength": 60
},
"lifecycle_stage": {
"type": "string",
"enum": [
"lead",
"trial",
"onboarding",
"customer",
"at_risk",
"churned",
"advocate"
]
},
"notes": {
"type": "string",
"maxLength": 20000
},
"custom_fields": {
"type": "object",
"maxProperties": 60,
"additionalProperties": {
"type": ["string", "number", "boolean", "null"],
"maxLength": 1000
},
"description": "Custom fields as {\"key\": value}, merged into the existing ones; null clears one. Keys defined with crm_define_field are checked against their type."
},
"tags": {
"type": "array",
"maxItems": 20,
"items": {
"type": "string",
"maxLength": 60,
"minLength": 1
},
"description": "Tags to add, e.g. [\"vip\"]; a new tag is made on first use. crm_tag_records removes tags."
}
},
"required": [],
"additionalProperties": false
},
"examples": [
{
"email": "ana@acme.com",
"name": "Ana Ruiz",
"company": "Acme",
"lifecycle_stage": "lead",
"tags": ["webinar-2026-10"],
"custom_fields": {
"plan": "Pro"
}
}
]
}GEThttps://api.conecto.chat/v1/skill.md
The instructions an agent keeps, as Markdown. https://conecto.chat/SKILL.md answers the same. For agents says what it holds.
GEThttps://api.conecto.chat/v1/openapi.json
OpenAPI 3.1.0 with every REST route above and every tool, 590 paths in all. One area at a time: / (OpenAPI 3.0, for a custom GPT's Actions) and / (OpenAPI 2.0 with the key in X-Api-Key, for Power Automate and Copilot Studio).
POSThttps://api.conecto.chat/mcp/{area}
One MCP server per area, over Streamable HTTP. It answers JSON-RPC messages as plain JSON. initialize and tools/list need no key. tools/call needs the key in the Authorization header. A batch holds up to 50 messages. Calling tools has the details.
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"protocolVersion": "2025-11-25",
"capabilities": {
"tools": {
"listChanged": false
}
},
"serverInfo": {
"name": "conecto-crm",
"version": "1.0.0",
"title": "Conecto CRM"
},
"instructions": "Conecto CRM: Contacts, companies and deals in pipelines, with notes, tasks, tags, custom fields, saved segments, one search, full timelines, duplicate merging, bulk saves, reports and CSV export: the business's customer records. Every tool lists its price; reads are free up to 1,000,000 a month for the account (then $0.50 per 10,000), and a call that fails is never charged. Pay from your Conecto balance (GET https://api.conecto.chat/v1/balance)."
}
}POSThttps://api.conecto.chat/v1/mcp
One address for every area, for assistants that sign in with OAuth, like ChatGPT, Claude and Copilot. The person ticks the areas it may use when they sign in, and it lists those areas' tools. Without a key or a token it answers 401 and names its OAuth metadata.
{
"error": "unauthorized",
"message": "Sign in to connect: this server uses OAuth, or a Conecto key as \"Authorization: Bearer <key>\"."
}The WWW-Authenticate header of that reply: Bearer resource_metadata="https://api.conecto.chat/
Updated . Every route, field and number here is read from the API's own code.