DocsGet started
Quickstart
One call signs an agent up, and the next one does real work. This page shows both, then the balance and a top-up, in curl, Python and JavaScript.
POST https://api.conecto.chat/ makes the account and its first key. Send your agent's name as bot_name and accept_terms: true. That accepts the terms for the business you act for, so read them first at https://conecto.chat/terms.md. business_name and owner_email are optional. The request needs no key.
curl
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"
}'Python
import requests
reply = requests.post(
"https://api.conecto.chat/v1/signup",
json={
"bot_name": "Pip",
"accept_terms": True,
"business_name": "Halverson Cycle & Repair",
"owner_email": "dana@halversoncycle.example",
},
)
print(reply.status_code, reply.json())JavaScript
const reply = await fetch("https://api.conecto.chat/v1/signup", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
bot_name: "Pip",
accept_terms: true,
business_name: "Halverson Cycle & Repair",
owner_email: "dana@halversoncycle.example",
}),
});
console.log(reply.status, await reply.json());The reply, with status 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"
}
}The address in owner_email is the owner at once, with nothing to confirm. owner_note says what that means: only the owner raises limits, and the account's warnings and approval requests go to them. Accounts and people covers an account with no owner yet.
The free credit is $1, for one new account per network a day. A second signup from the same network that day still gets a key, and free_credit_note says why it got no credit.
The key starts with conecto_sk_ and the reply shows it once. Conecto keeps only a hash of it. Store it where your agent keeps secrets, like an environment variable, and send it on every call:
Authorization: Bearer conecto_sk_...A key spends the balance, so keep it out of prompts, logs and shared code. A lost key is gone for good: make another with POST /v1/keys from a key that works, or ask the owner to make one. Keys and scopes has the rest.
The samples below read the key from an environment variable:
export CONECTO_KEY="conecto_sk_..."Every tool is one call: POST https://api.conecto.chat/ with the tool's arguments as a JSON object. This one saves a contact in the CRM, for $0.01. It is the tool's documented call, made for Hansen & Voss, a restaurant-equipment wholesaler in Hamburg, so its balance differs from a new account's.
curl
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"]
}'Python
import os
import requests
reply = requests.post(
"https://api.conecto.chat/v1/tools/crm_save_contact",
headers={"Authorization": f"Bearer {os.environ['CONECTO_KEY']}"},
json={
"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"],
},
)
print(reply.status_code, reply.json())JavaScript
const reply = await fetch("https://api.conecto.chat/v1/tools/crm_save_contact", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CONECTO_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
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"],
}),
});
console.log(reply.status, await reply.json());The reply:
{
"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
}
}cost_usd is what the call cost and balance_usd what is left. result is the tool's own answer, and each tool's page in the tools directory shows it. A call that fails costs nothing. Calling tools explains every field, retries and calls that run in the background.
GET /v1/balance shows the balance, the key's daily budget, the account's monthly ceiling and where the month's free reads and downloads stand. The account_balance tool answers the same.
curl
curl https://api.conecto.chat/v1/balance \
-H "Authorization: Bearer $CONECTO_KEY"Python
import os
import requests
reply = requests.get(
"https://api.conecto.chat/v1/balance",
headers={"Authorization": f"Bearer {os.environ['CONECTO_KEY']}"},
)
print(reply.status_code, reply.json())JavaScript
const reply = await fetch("https://api.conecto.chat/v1/balance", {
headers: {
Authorization: `Bearer ${process.env.CONECTO_KEY}`,
},
});
console.log(reply.status, await reply.json());{
"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"
}
}Free credit works inside the business. Email, phone calls and documents sent to people outside it need one real top-up first. POST /v1/topups with an amount answers with a Stripe checkout link: open it, or hand it to the owner. A top-up is $5 to $5,000 in whole cents, with a 7% + $0.35 fee, and the first one is doubled, up to $20 extra.
curl
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"}'Python
import os
import requests
reply = requests.post(
"https://api.conecto.chat/v1/topups",
headers={"Authorization": f"Bearer {os.environ['CONECTO_KEY']}"},
json={
"amount_usd": 20,
"po_number": "4500012345",
},
)
print(reply.status_code, reply.json())JavaScript
const reply = await fetch("https://api.conecto.chat/v1/topups", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.CONECTO_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
amount_usd: 20,
po_number: "4500012345",
}),
});
console.log(reply.status, await reply.json());{
"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"
}The credit lands within seconds of the payment. Money covers auto-reload, refunds and receipts for a company.
An MCP client connects one server for every area the key may use, https://api.conecto.chat/, with the same Authorization header. This adds Conecto to Claude Code:
claude mcp add --transport http --scope user conecto https://api.conecto.chat/v1/mcp \
--header "Authorization: Bearer $CONECTO_KEY"Connect your agent shows the other ways in, and the setup pages give the steps for each agent.
- Calling tools: the reply envelope, safe retries and background calls.
- Keys and scopes: a key for each job, limited to what it needs.
- Approvals: calls that wait for a person.
- The tools directory: every tool with its inputs, its price and a real reply.
Updated . Every route, field and number here is read from the API's own code.