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
  1. Basics
  2. Sign up and get a key
  3. Check the balance
  4. List the credit added
  5. Top up the balance
  6. Check auto-reload
  7. Turn auto-reload on, or change its amount
  8. Turn auto-reload off
  9. Check the limits
  10. Lower the limits
  11. List the keys
  12. Make a key
  13. Revoke a key
  14. List recent calls
  15. Get a call (poll background calls)
  16. Call a tool
  17. Routes for discovery

Basics

  • 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/json, up to 16 MB.
  • Amounts. Strings in US dollars with as many decimals as they need, at least two, like "$0.01". Amounts you send, like amount_usd, are numbers.
  • Times. ISO 8601 in UTC, like 2026-10-14T08:00:00+00:00.
  • Refusals. A status of 400 or more, with error and message, 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.

Sign up and get a key

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.

Body

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.

Reply 201

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_credit_note string or null Why this signup got no free credit, when it got none.
daily_budget_usd string This key's daily budget.
monthly_ceiling_usd 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.

Errors

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.

Example

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"
  }
}

Check the balance

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>.

Reply 200

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_budget_usd string This key's daily budget.
monthly_ceiling_usd string The account's monthly ceiling.
auto_reload object Whether auto-reload is on, and its amount.
auto_reload.status string off, pending (waiting for the first payment), active or failed (a card payment failed).
auto_reload.amount_usd 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_topup_offer string or null Only when the balance is empty: the first top-up's bonus.

Errors

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_not_allowed 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.

Example

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"
  }
}

List the credit added

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>.

Reply 200

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_refund_topup takes a top-up's number as topup_id.
credits[].kind string What added it: topup, bonus, auto_reload or free_credit.
credits[].amount_usd 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_until 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.

Errors

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_not_allowed 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.

Example

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."
}

Top up the balance

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>.

Body

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.

Reply 201

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_topup_bonus_usd 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.

Errors

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_not_allowed 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.

Example

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"
}

Check auto-reload

GEThttps://api.conecto.chat/v1/auto-reload

Whether auto-reload is on, and its amount.

Send the key as Authorization: Bearer <key>.

Reply 200

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.

Errors

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_not_allowed 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.

Example

Request

curl https://api.conecto.chat/v1/auto-reload \
  -H "Authorization: Bearer $CONECTO_KEY"

Reply 200

{
  "status": "off",
  "amount_usd": "$20.00"
}

Turn auto-reload on, or change its amount

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>.

Body

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.

Reply 200

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.

Reply 201

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.

Errors

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_not_allowed 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.

Example

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."
}

Turn auto-reload off

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>.

Reply 200

Off.

Field Type What it is
status string off.

Errors

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_not_allowed 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.

Example

Request

curl -X DELETE https://api.conecto.chat/v1/auto-reload \
  -H "Authorization: Bearer $CONECTO_KEY"

Reply 200

{
  "status": "off"
}

Check the limits

GEThttps://api.conecto.chat/v1/limits

This key's daily budget and the account's monthly ceiling.

Send the key as Authorization: Bearer <key>.

Reply 200

This key's daily budget and the account's monthly ceiling.

Field Type What it is
daily_budget_usd string This key's daily budget.
monthly_ceiling_usd string The account's monthly ceiling.

Errors

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_not_allowed 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.

Example

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"
}

Lower the limits

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>.

Body

Field Type What it is
daily_budget_usd number Its daily budget. On an account with an owner email, at most this key's.
monthly_ceiling_usd number The account's monthly ceiling.

Reply 200

The limits now.

Field Type What it is
daily_budget_usd string This key's daily budget.
monthly_ceiling_usd string The account's monthly ceiling.

Errors

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_not_allowed 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.

Example

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"
}

List the keys

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>.

Reply 200

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_id} 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_budget_usd 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_tools array or null Tools it may not run.
keys[].scope.read_only boolean It only reads.
keys[].scope.drafts_only boolean Every change it makes waits for a person.
keys[].scope.expires_at 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_used_at string or null When it last made a call.

Errors

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_not_allowed 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.

Example

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"
    }
  ]
}

Make a key

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>.

Body

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_budget_usd 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.

Reply 201

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_budget_usd 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_tools array or null Tools it may not run.
scope.read_only boolean It only reads.
scope.drafts_only boolean Every change it makes waits for a person.
scope.expires_at 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.

Errors

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_not_allowed 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.

Example

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"
  }
}

Revoke a key

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>.

Parameters

Parameter In Type What it is
key_id path integer The new key's number.

Reply 200

Revoked.

Field Type What it is
revoked integer The number of the key revoked.

Errors

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_not_allowed 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.

Example

Request

curl -X DELETE https://api.conecto.chat/v1/keys/4128 \
  -H "Authorization: Bearer $CONECTO_KEY"

Reply 200

{
  "revoked": 4128
}

List recent calls

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>.

Parameters

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.

Reply 200

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_usd 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_ms 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.

Errors

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_not_allowed 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.

Example

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
    }
  ]
}

Get a call (poll background calls)

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>.

Parameters

Parameter In Type What it is
call_id path string The call's id.

Reply 200

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.

Errors

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_not_allowed 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.

Example

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
  }
}

Call a tool

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>.

Headers

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.

Reply 200

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.

Reply 202

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.

Refusals

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_balance 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_credit_required 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_not_allowed 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_required 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_key_reused 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_budget_reached The key reached its daily budget. Keys made from one key share that key's budget.
429 monthly_ceiling_reached 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_budget_reached 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_unreadable 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.

Example

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"
}

Routes for discovery

These answer without a key. An agent reads them to find out what Conecto has before it signs up.

The index

GEThttps://api.conecto.chat/v1

What Conecto is, how to sign up, the prices in a few words and every area's MCP address.

Reply 200
{
  "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.

The areas

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:

Reply 200
{
  "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"
    }
  ]
}

The tools

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:

Reply 200
{
  "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
}

One tool

GEThttps://api.conecto.chat/v1/tools/{name}

One tool in full, with its input schema and examples. The same address with POST runs it.

Reply 200
{
  "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"
      }
    }
  ]
}

SKILL.md

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.

OpenAPI

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: /v1/openapi/<area>.json (OpenAPI 3.0, for a custom GPT's Actions) and /v1/openapi/<area>.swagger.json (OpenAPI 2.0 with the key in X-Api-Key, for Power Automate and Copilot Studio).

MCP servers

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.

initialize, reply
{
  "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)."
  }
}

The connector with sign-in

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.

Reply 401
{
  "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/.well-known/oauth-protected-resource/v1/mcp", scope="tools"

Updated . Every route, field and number here is read from the API's own code.