Invoicing & freelance CRM
Obat
Quotes, invoices, reminders and clients for your Obat account.
14 endpoints
Batappli publishes no public API and has no official MCP server (checked 14 Nov 2026). Cotlet runs a hosted Batappli MCP server with 14 tools that ChatGPT and Claude use in your own Batappli en ligne account at batappli.app. Quotes, deposits and reminders wait for your OK.
14 tools Read and write
Batappli publishes no public API and no developer docs, and Batappli has no official MCP server. Its own llms.txt lists one integration: the accounting export. Cotlet works in Batappli en ligne, the web version at batappli.app; the installed versions run on your own computer and are out of reach.
| What you need | Batappli alone | Cotlet |
|---|---|---|
| Ask ChatGPT or Claude to do the work | No API or MCP server | Hosted MCP server |
| Quotes, deposits and invoices | By hand, document by document | 14 tools, sends after your OK |
| Unpaid reminders and margin | In the unpaid window and dashboard | On request or on a schedule |
| Run from n8n or a script | No API, no Zapier app | REST, same key |
Checked 14 Nov 2026. Sources: Batappli: features · Batappli: pricing · Batappli: accounting export · Batappli: llms.txt · Batappli Mobile or Batappli en ligne (19 Jun 2025) · Batappli en ligne sign-in
Once, in a browser we host for you.
One address in its settings.
It drafts the lines, you check the total.
Your agent works in your own signed-in Cloud Browser. Quotes sent to clients, deposits, invoices, payments and reminders wait for your OK. Who can see your session
Sign in to Batappli en ligne in a Cloud Browser. Open batappli.app in your Cotlet Cloud Browser and log in on the "Connexion" form with your own email and password.
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.
Batappli sits on the shared address https://cotlet.dev/mcp/v1 with every other app you enable, so one connector covers them all. Turned Batappli on after connecting? Refresh the connector and its 14 tools appear.
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: batappli_read The client, "Devis", "Factures" and "Impayés" screens of Batappli en ligne, one tool per job. Reads, new clients and draft quotes run at once; the 5 tools that send, invoice or record money ask first.
Search before adding, so a returning client keeps one file with all their documents and payments.
Returns the clients with the id of each client file, their name and the contact details shown on the file. Batappli gives every client a file that holds the history of their documents and payments. Suppliers and subcontractors are contacts of the same kind and are listed the same way. Pages follow next_cursor until it is null.
MCP callbatappli_read → list_clients
REST endpointGET https://cotlet.dev/api/v1/batappli/clients
| Name | Type | Description |
|---|---|---|
| search string | string | Part of a client name. |
| cursor string | string | next_cursor of the previous page. |
{
"clients": [
{
"client_id": "cl_4821",
"name": "Camille Roux",
"email": "camille@example.com",
"phone": "06 00 00 00 01"
},
{
"client_id": "cl_4790",
"name": "Syndic Les Tilleuls",
"email": "compta@example.com",
"phone": ""
}
],
"next_cursor": null
} Returns the same things as the client file in Batappli: the contact, the list of quotes and invoices with their type, date and amount, the payments, and the unpaid total shown at the top of the file. Read this before a reminder or a quote so the agent knows what the client already has.
MCP callbatappli_read → get_client
REST endpointGET https://cotlet.dev/api/v1/batappli/clients/{client_id}
| Name | Type | Description |
|---|---|---|
| client_id string required | string | Id from list_clients. |
{
"client_id": "client_8c41d2"
} {
"client_id": "cl_4821",
"name": "Camille Roux",
"documents": [
{
"document_id": "doc_9032",
"type": "Devis",
"date": "2026-11-03",
"total_ttc": 861.59,
"status": "Accepted"
},
{
"document_id": "doc_9047",
"type": "Facture d'acompte",
"date": "2026-11-10",
"total_ttc": 258.48,
"status": "Paid"
}
],
"payments": [
{
"date": "2026-11-10",
"amount": 258.48,
"method": "Virement"
}
],
"unpaid_total": 0
} Creates the client with an empty file that fills with their documents and payments. Search with list_clients first so the agent does not create a duplicate. It reaches no one: the client is not notified, so it does not wait for your OK, and you can edit or delete the client in Batappli.
MCP callbatappli_write → create_client
REST endpointPOST https://cotlet.dev/api/v1/batappli/clients
| Name | Type | Description |
|---|---|---|
| name string required | string | Client name. |
| email string | string | Email address. |
| phone string | string | Phone number. |
| address string | string | Postal address, one line. |
{
"name": "Jane Doe"
} {
"client_id": "cl_4833",
"name": "Camille Roux",
"email": "camille@example.com",
"phone": "06 00 00 00 01"
} Draft quotes take the lines your agent writes, not the BatiChiffrage library; "Partager" sends by email, link or PDF.
Returns the quote id, number, client, date, total including VAT, deposit received and status of each quote. It returns the list only; get_quote gives the lines and the margin. Amounts are the ones Batappli shows, no conversion.
MCP callbatappli_read → list_quotes
REST endpointGET https://cotlet.dev/api/v1/batappli/quotes
| Name | Type | Description |
|---|---|---|
| status string | string | The status label as shown in Batappli. Batappli lets you customise quote statuses, so use a label from your own list. |
| client_id string | string | Only this client's quotes. |
| since string | string | Only quotes dated on or after this date, YYYY-MM-DD. |
| cursor string | string | next_cursor of the previous page. |
{
"quotes": [
{
"quote_id": "doc_9032",
"number": "D-0412",
"client": "Camille Roux",
"date": "2026-11-03",
"total_ttc": 861.59,
"deposit": 258.48,
"status": "Accepted"
},
{
"quote_id": "doc_9020",
"number": "D-0409",
"client": "Syndic Les Tilleuls",
"date": "2026-10-28",
"total_ttc": 3400,
"deposit": 0,
"status": "Sent"
}
],
"next_cursor": null
} Returns each line with its description, quantity, unit and unit price, the totals before and after VAT, and the deposits recorded. It also returns the gross margin, the cost price and the margin coefficient that Batappli shows on every quote, for labour and for supplies. Nothing is changed.
MCP callbatappli_read → get_quote
REST endpointGET https://cotlet.dev/api/v1/batappli/quotes/{quote_id}
| Name | Type | Description |
|---|---|---|
| quote_id string required | string | Id from list_quotes. |
{
"quote_id": "quote_8c41d2"
} {
"quote_id": "doc_9032",
"number": "D-0412",
"client": "Camille Roux",
"lines": [
{
"description": "Chauffe-eau électrique 200 L",
"quantity": 1,
"unit": "U",
"unit_price_ht": 620.75,
"total_ht": 620.75
},
{
"description": "Main d'oeuvre, dépose et installation",
"quantity": 3,
"unit": "H",
"unit_price_ht": 54.17,
"total_ht": 162.51
}
],
"total_ht": 783.26,
"vat": 78.33,
"total_ttc": 861.59,
"deposits": [
{
"date": "2026-11-10",
"amount": 258.48
}
],
"status": "Accepted"
} Creates the quote in Batappli with the next quote number and returns its id and totals. It does not use the price library or Batappli.ia: the lines are the ones your agent writes. The quote stays a draft until share_quote sends it. It reaches no one and you can delete it in Batappli, so it does not wait for your OK.
MCP callbatappli_write → create_quote
REST endpointPOST https://cotlet.dev/api/v1/batappli/clients/{client_id}/quotes
| Name | Type | Description |
|---|---|---|
| client_id string required | string | Id from list_clients or create_client. |
| lines array required | array | Each line: description, quantity, unit (for example U or H) and unit_price_ht. |
| vat_rate number required | number | VAT rate in percent for every line, for example 10 or 20. |
{
"client_id": "cl_4833",
"lines": [
{
"description": "Chauffe-eau électrique 200 L",
"quantity": 1,
"unit": "U",
"unit_price_ht": 620.75
},
{
"description": "Main d'oeuvre, dépose et installation",
"quantity": 3,
"unit": "H",
"unit_price_ht": 54.17
}
],
"vat_rate": 10
} {
"quote_id": "doc_9032",
"number": "D-0412",
"client": "Camille Roux",
"total_ht": 783.26,
"vat": 78.33,
"total_ttc": 861.59,
"status": "Draft"
} Deposits create the "Facture d'acompte", "Convertir" makes the invoice, "Encaisser l'échéance" records the payment. No tool takes money from a client.
Returns the invoice id, number, type, client, date, total including VAT, amount still due and due date. The list is the one on the Batappli invoices screen. Use list_unpaid_invoices when you only want what is late.
MCP callbatappli_read → list_invoices
REST endpointGET https://cotlet.dev/api/v1/batappli/invoices
| Name | Type | Description |
|---|---|---|
| type string | string | The type column of the list, for example the deposit invoice (acompte), situation or credit note (avoir) types Batappli has. |
| client_id string | string | Only this client's invoices. |
| since string | string | Only invoices dated on or after this date, YYYY-MM-DD. |
| cursor string | string | next_cursor of the previous page. |
{
"invoices": [
{
"invoice_id": "doc_9047",
"number": "F-0388",
"type": "Facture d'acompte",
"client": "Camille Roux",
"date": "2026-11-10",
"total_ttc": 258.48,
"due": 0
},
{
"invoice_id": "doc_9051",
"number": "F-0389",
"type": "Facture",
"client": "Camille Roux",
"date": "2026-11-13",
"total_ttc": 861.59,
"due": 603.11
}
],
"next_cursor": null
} Does what Add a payment (Ajouter un règlement) does in the Deposits tab of a quote: it records the payment and Batappli creates the deposit invoice (facture d'acompte) by itself. The invoice takes the next number in your invoice sequence and feeds your accounting export. Check the amount with the client first. By default you confirm each call; you can switch that off for this tool.
MCP callbatappli_write → record_deposit
REST endpointPOST https://cotlet.dev/api/v1/batappli/quotes/{quote_id}/deposits
| Name | Type | Description |
|---|---|---|
| quote_id string required | string | Id from list_quotes. |
| amount number required | number | Amount received, as Batappli shows amounts. |
| method string required | string | Payment method as named in Batappli, for example transfer or cheque. |
{
"quote_id": "quote_8c41d2",
"amount": 1,
"method": "method"
} {
"quote_id": "doc_9032",
"invoice_id": "doc_9047",
"number": "F-0388",
"type": "Facture d'acompte",
"amount": 258.48
} Does what Convert does in the quote list: Batappli creates the invoice with every line and amount of the quote and its due date. The invoice takes the next number in your sequence and cannot be renumbered, so the agent checks the quote with get_quote first. It sends nothing to the client. By default you confirm each call; you can switch that off for this tool.
MCP callbatappli_write → convert_quote_to_invoice
REST endpointPOST https://cotlet.dev/api/v1/batappli/quotes/{quote_id}/to-invoice/convert
| Name | Type | Description |
|---|---|---|
| quote_id string required | string | Id from list_quotes. |
{
"quote_id": "quote_8c41d2"
} {
"invoice_id": "doc_9051",
"number": "F-0389",
"client": "Camille Roux",
"total_ttc": 861.59,
"due": 603.11
} Uses the Payment tab of the invoice (Encaisser l'échéance): it records the payment against the due date, so the invoice leaves the unpaid list when it is paid in full. Batappli puts the payment in your next accounting export, so a wrong amount reaches your accountant. By default you confirm each call; you can switch that off for this tool.
MCP callbatappli_write → record_payment
REST endpointPOST https://cotlet.dev/api/v1/batappli/invoices/{invoice_id}/payments
| Name | Type | Description |
|---|---|---|
| invoice_id string required | string | Id from list_invoices or list_unpaid_invoices. |
| amount number required | number | Amount received. |
| method string required | string | Payment method as named in Batappli. |
{
"invoice_id": "invoice_8c41d2",
"amount": 1,
"method": "method"
} {
"invoice_id": "doc_9051",
"amount": 603.11,
"method": "Virement",
"due": 0
} Days late as Batappli counts them, the three reminder templates, and the figures of the dashboard.
Returns what Batappli shows in its unpaid alert at start-up: the client, the amount due and the days late for each invoice, with the invoice id you pass to send_payment_reminder. Batappli computes the days late, nothing is estimated. Nothing is sent.
MCP callbatappli_read → list_unpaid_invoices
REST endpointGET https://cotlet.dev/api/v1/batappli/unpaid-invoices
| Name | Type | Description |
|---|---|---|
| client_id string | string | Only this client's unpaid invoices. |
{
"unpaid": [
{
"invoice_id": "doc_8920",
"number": "F-0371",
"client": "Syndic Les Tilleuls",
"amount_due": 1200,
"days_late": 34
},
{
"invoice_id": "doc_9051",
"number": "F-0389",
"client": "Camille Roux",
"amount_due": 603.11,
"days_late": 2
}
]
} Does what the reminder button in the unpaid tracking window does: it emails the client the chosen template for this invoice. The three templates go from friendly to formal, and Batappli suggests that order. The email reaches your client and cannot be recalled. By default you confirm each call; you can switch that off for this tool.
MCP callbatappli_write → send_payment_reminder
REST endpointPOST https://cotlet.dev/api/v1/batappli/invoices/{invoice_id}/payment-reminders
| Name | Type | Description |
|---|---|---|
| invoice_id string required | string | Id from list_unpaid_invoices. |
| template string required | string | One of `courtoisie`, `avertissement`, `mise_en_demeure`: the three email templates of the unpaid tracking window. |
| message string | string | Extra text added to the template. |
{
"invoice_id": "invoice_8c41d2",
"template": "template"
} {
"invoice_id": "doc_8920",
"template": "avertissement",
"sent_to": "compta@example.com"
} Returns the indicators of the Analyse > Tableau de bord screen for the period: invoiced revenue, collections, gross margin and the margin rate. Without dates it returns the period the dashboard opens on. Figures are the ones Batappli shows, with no recalculation. It changes nothing.
MCP callbatappli_read → get_dashboard
REST endpointGET https://cotlet.dev/api/v1/batappli/dashboard
| Name | Type | Description |
|---|---|---|
| from string | string | First day, YYYY-MM-DD. |
| to string | string | Last day, YYYY-MM-DD. |
{
"period": {
"from": "2026-11-02",
"to": "2026-11-08"
},
"invoiced_ht": 6840,
"collected": 4120,
"gross_margin": 2394,
"margin_rate": 35
} Your signed-in Batappli en ligne browser profile, AES-256-GCM encrypted, in Finland. Never your password.
The 14 Batappli tools. The session stays inside the Cloud Browser.
The clients, quotes and invoices your own user can open, and nothing more.
Your Batappli subscription and login, user rights, online card payment with Stripe, the accounting export, eFacture, stock and supplier orders.
You sign in again yourself, in the same Cloud Browser.
Disable Batappli for agents, reset the browser, or change your password.
You type your Batappli password yourself on the "Connexion" page; the agent only works in the session that sign-in opens. Our site scores A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory (live results).
Batappli is moving to a new interface with fewer windows and fewer steps (its site, 14 Nov 2026). The tools keep working through such updates because they use the pages you open yourself.
Cotlet watches the apps it serves and updates the Batappli server when its screens change. New Batappli features become available to the agent, which still sees only what your own user can see.
Cotlet never sees or stores your password. If Batappli 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 |
|---|---|
| Draft quote or new client | Edit or delete it in Batappli; nobody was told |
| Deposit recorded, deposit invoice made | The invoice keeps its number: cancel it with a credit note ("avoir") |
| Quote converted to an invoice | Same: a credit note in Batappli, then convert again |
| Payment recorded | Correct it before your next accounting export |
| Quote emailed or reminder sent | Already with your client: call or write to them |
The 5 tools that send a quote, invoice, record money or remind a client ask first: by default you confirm each call, and you can switch that off per tool. The 7 read tools run at once, and so do create_client and create_quote, which reach no one.
{
"name": "create_quote",
"arguments": {
"client_id": "cl_4833",
"lines": [
{
"description": "Chauffe-eau électrique 200 L",
"quantity": 1,
"unit": "U",
"unit_price_ht": 620.75
},
{
"description": "Main d'oeuvre, dépose et installation",
"quantity": 3,
"unit": "H",
"unit_price_ht": 54.17
}
],
"vat_rate": 10
}
} curl -X POST https://cotlet.dev/api/v1/batappli/clients/cl_4833/quotes \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"lines":[{"description":"Chauffe-eau électrique 200 L","quantity":1,"unit":"U","unit_price_ht":620.75},{"description":"Main d'\''oeuvre, dépose et installation","quantity":3,"unit":"H","unit_price_ht":54.17}],"vat_rate":10}' {
"quote_id": "doc_9032",
"number": "D-0412",
"client": "Camille Roux",
"total_ht": 783.26,
"vat": 78.33,
"total_ttc": 861.59,
"status": "Draft"
} The example drafts a water heater swap: one heater at 620.75 and three hours of labour at 54.17 make 783.26 before VAT, 861.59 with 10% VAT, saved as a draft and not sent. A cron job or n8n flow can make the same call over REST at /api/v1/batappli with the same key and price, in JSON. Failed calls are free.
About $20 a monthfor a plumbing and heating artisan with about twenty quotes a month, 3,520 credits. Your Batappli plan stays as it is.
| Job | Calls | Credits |
|---|---|---|
| New clients and draft quotes | 3 × 20 | 600 |
| Quotes checked and emailed | 2 × 20 | 400 |
| Deposits recorded on accepted quotes | 2 × 10 | 200 |
| Final invoices from finished jobs | 2 × 10 | 200 |
| Payments recorded on invoices | 2 × 15 | 300 |
| Unpaid check and reminders | 3 × 8 | 240 |
| Monday revenue and margin report | 2 × 4 | 80 |
| Cloud Browser, 30 days | 1,500 | |
| Total | 202 calls | 3,520 |
The $29 pack covers a typical month for most owners. A busier firm with more quotes 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 |
|---|---|---|
| Batappli.ia | Proposes quote lines from your spoken or written description: 8 AI quotes a month on Batappli Devis (39 € excl. VAT), 16 on Artisan. | Works inside one quote; sending, deposits, payments and reminders stay with you. |
| Zapier, Make, n8n | No Batappli app on Zapier or n8n, and none found on Make. | Nothing to trigger or act on in Batappli. |
| Official API | None published; the vendor lists only the accounting export as an integration. | Nothing to build on. |
| GitHub servers and CLIs | No Batappli repository on GitHub. | Nothing to install. |
| Accounting export and Excel | Entries for Cegid, EBP, Quadra, Sage or ASCII; Excel import and export of documents. | Files for your accountant: no quotes sent, no reminders. |
| Batappli Mobile | Quotes, intervention slips and client files on site. | Installed versions only; made for your thumbs, not for an agent. |
| By hand | Open each quote and invoice and click through. | Only while you are at the screen. |
Only Cotlet lets your agent do the daily Batappli work on every screen you use, reading and writing, from ChatGPT, Claude or any MCP client, with no API key from Batappli and on your current plan.
Cotlet belongs to Take Group sp. z o.o., a software company registered in Poland, EU (VAT PL6342984273) and trading since 2019. Bart Krawczyk (Co-founder, CTO) and Jake Slugocki (Co-founder, SEO, sales and marketing) founded it. Send questions about the Batappli tools to contact@cotlet.dev.
Sign up free at https://cotlet.dev/signup?app=batappli, turn on Batappli under Integrations in the console and log in at https://batappli.app in your Cloud Browser. Then connect your AI agent and ask it which invoices are late. The trial needs no card.
No. Cotlet works in Batappli en ligne, the web version you open at batappli.app in a browser. The installed versions (Devis, Artisan, Entreprise) run on your own computer, and Batappli Mobile only extends them, so a Cloud Browser cannot reach them (Batappli, 19 Jun 2025).
Any plan of Batappli en ligne with a login. Quotes, invoices, deposits, credit notes, situations and the accounting export are in Batappli Devis, at 39 EUR a month before VAT for one user. Stock, suppliers, site tracking, user rights and online payment with Stripe are in Batappli Artisan, at 79 EUR (batappli.fr/tarifs, checked 14 Nov 2026). The tools above need only the Devis features.
No. Batappli.ia is Batappli's own assistant: inside a quote, you describe the work and it proposes lines. Cotlet gives your own AI agent access to the Batappli screens from outside, for the jobs around a quote such as deposits, reminders and reports. create_quote takes the lines your agent writes and does not call Batappli.ia.
The user who writes your quotes and records payments. On Batappli Artisan, user rights limit what each user sees, so pick one who can open quotes, invoices and the unpaid list. The agent sees only what that user can see.
Only in how it is called. Both carry the same 14 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 Batappli or SYSTEMLOG.
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