Invoicing & freelance CRM
Obat
Quotes, invoices, reminders and clients for your Obat account.
14 endpoints
Extrabat publishes no public API: its API opens only to registered partners (checked 14 Nov 2026). Cotlet runs a hosted Extrabat MCP server with 13 tools that ChatGPT and Claude use in your own Extrabat account. E-signature requests and agenda bookings wait for your OK.
13 tools Read and write
Extrabat has an API, but only for registered partners: a user links a "User API Key" to a partner's "Third-Party" ID, and Extrabat publishes no developer docs. Extrabat has no official MCP server, and the Zapier and n8n directories list no Extrabat app.
| What you need | Extrabat alone | Cotlet |
|---|---|---|
| Ask ChatGPT or Claude to do the work | Partner API only, no MCP | Hosted MCP server |
| Leads, quotes and e-signature requests | By hand, quote by quote | 13 tools, sends after your OK |
| After-sales tickets and service contracts | One ticket at a time | On request or every morning |
| Run from n8n or a script | Only through a partner | REST, same key |
Checked 14 Nov 2026. Sources: Extrabat website · Extrabat pricing · Extrabat marketplace · Extrabat blog: connect Install Bois (User API Keys) · Extrabat blog: partner apps and the API login · Extrabat blog: e-signature with Oodrive Sign · Creatic: apps on the Extrabat partner API
Once, at myextrabat.com, in a browser we host for you.
One address in its settings.
It lists the unsigned quotes, you pick which go out again.
Your agent works in your own signed-in Cloud Browser. E-signature requests and agenda bookings wait for your OK. Who can see your session
Sign in to Extrabat in a Cloud Browser. Open myextrabat.com in your Cotlet Cloud Browser and log in with your own Extrabat user.
Add the Cotlet address. Enter https://cotlet.dev/mcp/v1 as the MCP server or connector URL in your agent.
Let the agent in. Chat apps open a Cotlet sign-in page. Editors, n8n and scripts send an API key made in the console.
Extrabat runs on the shared address https://cotlet.dev/mcp/v1 next to every other app you enable, so one connector is enough. Turned on Extrabat after connecting? Refresh the connector to see its 13 tools.
Settings > Apps & Connectors > Create
MCP server URL: https://cotlet.dev/mcp/v1/connect
Authentication: OAuth Settings > Connectors > Add custom connector
URL: https://cotlet.dev/mcp/v1/connect
Claude Code:
claude mcp add --transport http cotlet \
https://cotlet.dev/mcp/v1 \
--header "Authorization: Bearer $COTLET_API_KEY" // ~/.cursor/mcp.json
{
"mcpServers": {
"cotlet": {
"url": "https://cotlet.dev/mcp/v1",
"headers": { "Authorization": "Bearer ${env:COTLET_API_KEY}" }
}
}
} # ~/.codex/config.toml
[mcp_servers.cotlet]
url = "https://cotlet.dev/mcp/v1"
bearer_token_env_var = "COTLET_API_KEY" MCP Client Tool (inside an AI Agent)
Transport: HTTP Streamable
URL: https://cotlet.dev/mcp/v1
Auth: Bearer, <your key>
Tool: extrabat_read One tool per Extrabat module the office uses every day: CRM, Gestion commerciale, the agenda, worksites, Gestion SAV and service contracts. Each reads or writes only what your user can open.
Search customer files by name, phone, email or city, then add a new lead without a duplicate.
Returns the matching customer files with their contact details, in the order Extrabat lists them. Use it before create_customer to avoid duplicates. It reads what your user can open in the Gestion client / CRM module.
MCP callextrabat_read → search_customers
REST endpointGET https://cotlet.dev/api/v1/extrabat/customers/search
| Name | Type | Description |
|---|---|---|
| query string required | string | Text to match against name, phone, email or city |
| limit integer | integer | Maximum results to return |
{
"query": "query"
} {
"customers": [
{
"customer_id": "c_20481",
"name": "Durand Piscines",
"phone": "+33 5 45 00 00 01",
"email": "contact@durand-example.fr",
"city": "Angoulême"
}
],
"total": 1
} Creates the file in Gestion client / CRM and returns its ID. It reaches no one: Cotlet sends no message to the customer. Search first with search_customers to avoid a duplicate; this tool does not check for one.
MCP callextrabat_write → create_customer
REST endpointPOST https://cotlet.dev/api/v1/extrabat/customers
| Name | Type | Description |
|---|---|---|
| name string required | string | Company or person name |
| phone string | string | Phone number |
| email string | string | Email address |
| city string | string | City |
| note string | string | Free text kept on the file, for example where the lead came from |
{
"name": "Martin Paysage",
"phone": "+33 5 45 00 00 02",
"email": "martin@example.fr",
"city": "Cognac",
"note": "Lead from website form"
} {
"customer_id": "c_20533",
"name": "Martin Paysage",
"created": true
} Quotes with their signature state, draft quotes from your lines, Oodrive Sign requests and unpaid invoices.
Returns quotes from the Gestion commerciale module, newest first, with number, customer, total and the signature state. Reads only, nothing is sent. Quotes you cannot open with your Extrabat user are left out.
MCP callextrabat_read → list_quotes
REST endpointGET https://cotlet.dev/api/v1/extrabat/quotes
| Name | Type | Description |
|---|---|---|
| customer_id string | string | Only quotes of this customer |
| status string | string | Signature state to filter on, as the Commercial documents list shows it |
| created_before string | string | ISO date; only quotes created before it |
| limit integer | integer | Maximum results to return |
{
"quotes": [
{
"quote_id": "q_5530",
"number": "DEV-2026-0412",
"customer": "Durand Piscines",
"total": 8450,
"created": "2026-10-28",
"signature": "waiting"
}
],
"total": 1
} Returns the document lines, the totals and the customer email and phone that the e-signature request needs. Reads only.
MCP callextrabat_read → get_quote
REST endpointGET https://cotlet.dev/api/v1/extrabat/quotes/{quote_id}
| Name | Type | Description |
|---|---|---|
| quote_id string required | string | Quote ID from list_quotes |
{
"quote_id": "quote_8c41d2"
} {
"quote_id": "q_5530",
"number": "DEV-2026-0412",
"customer": "Durand Piscines",
"email": "contact@durand-example.fr",
"phone": "+33 5 45 00 00 01",
"lines": [
{
"label": "Pool liner replacement",
"quantity": 1,
"unit_price": 6800
},
{
"label": "Filtration pump",
"quantity": 1,
"unit_price": 1650
}
],
"total": 8450
} Creates the quote in Gestion commerciale and returns its number and total. It sends nothing to the customer: sending is a separate step, send_quote_for_signature. Check the draft in Extrabat before it goes out.
MCP callextrabat_write → create_quote
REST endpointPOST https://cotlet.dev/api/v1/extrabat/customers/{customer_id}/quotes
| Name | Type | Description |
|---|---|---|
| customer_id string required | string | Customer ID from search_customers |
| lines array required | array | Lines, each with label, quantity and unit_price |
| note string | string | Free text for the quote |
{
"customer_id": "customer_8c41d2",
"lines": "lines"
} {
"quote_id": "q_5561",
"number": "DEV-2026-0431",
"customer": "Martin Paysage",
"total": 2160
} Sends the signature request through Extrabat's Oodrive Sign option, which must be switched on for your account. Extrabat needs both an email and a phone number for the customer, so the call fails when either is missing. The customer gets a message right away. By default you confirm each call; you can switch that off for this tool.
MCP callextrabat_write → send_quote_for_signature
REST endpointPOST https://cotlet.dev/api/v1/extrabat/quotes/{quote_id}/for-signature
| Name | Type | Description |
|---|---|---|
| quote_id string required | string | Quote ID from list_quotes |
| email string | string | Customer email; defaults to the one on the quote |
| phone string | string | Customer phone; defaults to the one on the quote |
{
"quote_id": "quote_8c41d2"
} {
"quote_id": "q_5530",
"number": "DEV-2026-0412",
"sent_to": "contact@durand-example.fr",
"signature": "sent"
} Returns invoices from the Gestion commerciale module with number, customer, total, amount still due and due date. Reads only. Payments are recorded in Extrabat, not by this tool.
MCP callextrabat_read → list_invoices
REST endpointGET https://cotlet.dev/api/v1/extrabat/invoices
| Name | Type | Description |
|---|---|---|
| customer_id string | string | Only invoices of this customer |
| unpaid_only boolean | boolean | Only invoices not fully paid |
| due_before string | string | ISO date; only invoices due before it |
| limit integer | integer | Maximum results to return |
{
"invoices": [
{
"invoice_id": "i_9021",
"number": "FAC-2026-0388",
"customer": "Durand Piscines",
"total": 3200,
"due": 1200,
"due_date": "2026-10-15"
}
],
"total": 1
} Free slots in the synced agenda, bookings linked to a customer or chantier, and the open worksites.
Returns events in time order with title, start, end, the user and the linked customer when there is one. Use it to find a free slot before create_agenda_event. Reads only.
MCP callextrabat_read → list_agenda_events
REST endpointGET https://cotlet.dev/api/v1/extrabat/agenda-events
| Name | Type | Description |
|---|---|---|
| from string required | string | ISO date or datetime, start of the range |
| to string required | string | ISO date or datetime, end of the range |
| user string | string | Only events of this Extrabat user |
{
"from": "from",
"to": "to"
} {
"events": [
{
"event_id": "e_7710",
"title": "Visit: Durand Piscines",
"start": "2026-11-17T09:00",
"end": "2026-11-17T10:30",
"user": "Luc",
"customer": "Durand Piscines"
}
],
"total": 1
} Creates the event in the agenda and returns its ID. The agenda syncs to phones, so a technician can see it there soon after. Check list_agenda_events first for a free slot. By default you confirm each call; you can switch that off for this tool.
MCP callextrabat_write → create_agenda_event
REST endpointPOST https://cotlet.dev/api/v1/extrabat/agenda-events
| Name | Type | Description |
|---|---|---|
| title string required | string | Event title |
| start string required | string | ISO datetime |
| end string required | string | ISO datetime |
| user string | string | Extrabat user whose agenda gets the event |
| customer_id string | string | Customer to link |
| worksite_id string | string | Worksite to link |
{
"title": "title",
"start": "start",
"end": "end"
} {
"event_id": "e_7745",
"title": "Visit: Martin Paysage",
"start": "2026-11-18T09:00",
"end": "2026-11-18T10:00",
"user": "Luc"
} Returns the worksites from Gestion et planification des chantiers with customer, address and the planned dates when set. Reads only. Which worksites you see depends on your Extrabat user rights.
MCP callextrabat_read → list_worksites
REST endpointGET https://cotlet.dev/api/v1/extrabat/worksites
| Name | Type | Description |
|---|---|---|
| customer_id string | string | Only worksites of this customer |
| open_only boolean | boolean | Skip finished worksites |
| limit integer | integer | Maximum results to return |
{
"worksites": [
{
"worksite_id": "w_3302",
"name": "Pool renovation, rue des Lilas",
"customer": "Durand Piscines",
"city": "Angoulême",
"planned_start": "2026-11-24"
}
],
"total": 1
} SAV tickets in your own status names, status changes, and maintenance contracts by end date.
Returns tickets from the Gestion SAV module, oldest first, with customer, status and creation date. Statuses are the ones your account uses, for example "Intervention en cours" or "Retour atelier". Reads only.
MCP callextrabat_read → list_service_tickets
REST endpointGET https://cotlet.dev/api/v1/extrabat/service-tickets
| Name | Type | Description |
|---|---|---|
| status string | string | Only tickets in this status, using the status names set up in your account |
| customer_id string | string | Only tickets of this customer |
| limit integer | integer | Maximum results to return |
{
"tickets": [
{
"ticket_id": "s_1180",
"customer": "Durand Piscines",
"title": "Heat pump alarm",
"status": "Intervention en cours",
"created": "2026-11-03"
}
],
"total": 1
} Sets the status and returns the ticket as it is now. It reaches no one and changes back with one more call. A status name that does not exist in your account is rejected.
MCP callextrabat_write → update_service_ticket_status
REST endpointPATCH https://cotlet.dev/api/v1/extrabat/tickets/{ticket_id}/service-ticket-status
| Name | Type | Description |
|---|---|---|
| ticket_id string required | string | Ticket ID from list_service_tickets |
| status string required | string | A status name that exists in your account, for example "Intervention terminée à facturer" |
{
"ticket_id": "ticket_8c41d2",
"status": "status"
} {
"ticket_id": "s_1180",
"status": "Intervention terminée à facturer",
"previous": "Intervention en cours"
} Returns contracts from the Gestion des contrats de services module, ordered by end date. Extrabat can also send SMS reminders for service contracts if you switch them on in the app; this tool only reads.
MCP callextrabat_read → list_service_contracts
REST endpointGET https://cotlet.dev/api/v1/extrabat/service-contracts
| Name | Type | Description |
|---|---|---|
| ends_before string | string | ISO date; only contracts ending before it |
| customer_id string | string | Only contracts of this customer |
| limit integer | integer | Maximum results to return |
{
"contracts": [
{
"contract_id": "k_640",
"customer": "Durand Piscines",
"title": "Yearly pool maintenance",
"ends": "2027-01-12"
}
],
"total": 1
} Your signed-in Extrabat browser profile, AES-256-GCM encrypted, in Finland. Never your password.
The 13 Extrabat tools. The session cookie stays in the Cloud Browser.
The customers, quotes, worksites and tickets your user and its rights can open, and nothing more.
Accounting, recorded payments, e-invoices, SMS and email campaigns, the shop till, your user settings and API keys, and your plan.
You sign in again yourself at myextrabat.com, in the same Cloud Browser.
Disable Extrabat for agents, reset the browser, or change your password.
You type your Extrabat password yourself; the agent only uses the session that sign-in leaves behind. Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results).
The agent works through the pages you use, so an Extrabat update to the quote editor or the SAV list does not stop quote chasing or ticket moves.
Cotlet watches the apps it serves and updates the Extrabat server when those screens change. Modules you add later, such as worksite planning on the Standard plan, become available to the agent.
It still sees only what your own Extrabat user and its rights can open. Cotlet never sees or stores your password. If Extrabat signs you out, one click in the Cotlet console reopens the Cloud Browser so you can sign in again.
| Action | How to put it right |
|---|---|
| After-sales status changed | Call update_service_ticket_status with the previous status it returned |
| Draft quote created | Nothing was sent: delete the draft in Gestion commerciale |
| Customer file added | Delete or merge it in Gestion client / CRM |
| Agenda event booked | Move or delete it in the agenda; it syncs to phones |
| Signature request sent | Already with your customer: tell them to ignore it |
send_quote_for_signature and create_agenda_event ask first: by default you confirm each call, and you can switch that off per tool. The other 3 writes reach no one and run at once, like the 8 read tools.
{
"name": "create_customer",
"arguments": {
"name": "Martin Paysage",
"phone": "+33 5 45 00 00 02",
"email": "martin@example.fr",
"city": "Cognac",
"note": "Lead from website form"
}
} curl -X POST https://cotlet.dev/api/v1/extrabat/customers \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Martin Paysage","phone":"+33 5 45 00 00 02","email":"martin@example.fr","city":"Cognac","note":"Lead from website form"}' {
"customer_id": "c_20533",
"name": "Martin Paysage",
"created": true
} The example adds Martin Paysage of Cognac, a lead from your website form, as a customer file; Cotlet sends nothing to them. A cron job or n8n flow can make the same call over REST at /api/v1/extrabat with the same key and price, in JSON. Failed calls are free.
About $19 a monthfor a pool and heating installer with three office users, 3,320 credits. Your Extrabat plan stays as it is.
| Job | Calls | Credits |
|---|---|---|
| Website leads checked and added to the CRM | 2 × 20 | 400 |
| Site visits booked in the agenda | 2 × 15 | 300 |
| Quotes drafted from site notes | 2 × 10 | 200 |
| Unsigned quotes read and sent again | 3 × 8 | 240 |
| After-sales tickets moved on | 2 × 20 | 400 |
| Weekly worksite and agenda check | 3 × 4 | 120 |
| Service contracts ending soon | 2 × 4 | 80 |
| Unpaid invoice list | 2 × 4 | 80 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 182 calls | 3,320 |
The $29 pack covers a typical month for most owners. A firm with more technicians and more SAV tickets uses more calls.
Credit packs are one-time purchases, not a subscription. The month above is an example built from our own assumptions, not measured customer usage.
| Credits | Price, one time | Calls at 10 credits | Per 1,000 credits |
|---|---|---|---|
| 5,000 | $29 | 500 | $5.80 |
| 15,000 | $79 | 1,500 | $5.27 |
| 32,000 | $149 | 3,200 | $4.66 |
| 60,000 | $249 | 6,000 | $4.15 |
Only successful calls use credits; failed calls and timeouts cost nothing. At a balance of 0 calls pause, never a surprise charge. Authenticate with the Authorization: Bearer header.
| Option | What it does | Where it stops |
|---|---|---|
| Extrabat's own AI | The marketplace "Assistant IA SAV" finds manufacturer documentation from an error code or serial number. | It answers technical questions; it does not work in your quotes or agenda. |
| Partner API | A "User API Key" tied to a registered partner, or partner software with "Se connecter avec Extrabat". | No public docs: a partner builds and runs each connection. |
| Marketplace connectors | Ringover, Oodrive Sign, SimplyMeet, Urbassist and others each connect one job. | One job each; none takes requests from ChatGPT or Claude. |
| Zapier and n8n | Neither directory lists an Extrabat app (both pages answer 404). | No triggers or actions to build on. |
| "Statistiques & Exports" | Exports lists for a spreadsheet or your accountant. | A file out; nothing goes back into Extrabat. |
| By hand | Open each quote, ticket or agenda slot in myextrabat.com. | Only while someone sits at the office screen. |
If you sell software to Extrabat customers, the partner program ("Rejoindre la marketplace") is the right route. For your own office, only Cotlet lets your agent do the daily Extrabat work on every screen you use, reading and writing, from ChatGPT, Claude or any MCP client, with no API key from Extrabat and on the plan you already have.
Cotlet is run by Take Group sp. z o.o., a software company registered in Poland, EU (VAT PL6342984273) and in business since 2019. Its founders are Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing). Write to contact@cotlet.dev with questions about the Extrabat tools.
Sign up free at https://cotlet.dev/signup?app=extrabat, turn on Extrabat under Integrations in the console and log in at https://myextrabat.com in your Cloud Browser. Then connect your AI agent and ask it which quotes are still waiting for a signature. The trial needs no card.
Your own My Extrabat user. Cotlet sees what that user can open, so a module your plan does not include, such as Signature électronique (a paid option you take through your Extrabat adviser), is not available to the agent. Extrabat starts at 49 EUR per user per month excl. VAT (checked 14 Nov 2026).
No. The partner API is for software vendors registered with Extrabat. Cotlet works in your own signed-in account, so you need no "User API Key" and no partner ID.
Only in how it is called. Both carry the same 13 tools, inputs, answers, API key and price. Agents use MCP; scripts and n8n HTTP steps use REST.
No. Cotlet is independent and not affiliated with Extrabat.
Free 7-day trial with 2,000 credits, no card needed.
May we use Google Analytics to see which pages help people? It sets cookies only if you accept. No ads, and we never sell data. Cookie policy