Invico for developers

Invoices, contacts, expenses and stock over a simple REST API. Signed webhooks for events, an MCP server for AI agents. Create a key in Settings → Integrations.

Quick start

curl https://app.invico.org/v1/documents?limit=5 \
  -H "Authorization: Bearer invk_…"

A read key may only GET; a write key also POST/PUT/DELETE. Everything is bound to the key's company — no tenant parameter. Error answers: {"error":"code"} — 401 bad key, 403 scope/plan, 429 rate/quota, 409 document-number collision.

Endpoints

Method + pathDescription
GET /v1/pingkey check → {ok, company}
GET /v1/documentsdocument list — ?status=, ?kind=, ?contactId=, ?limit=, ?offset=
POST /v1/documentscreate/upsert (with id = update); line items in items[]
GET /v1/documents/:iddocument + items + payments + events
PUT /v1/documents/:idedit a document
POST /v1/documents/:id/status{status:"issued"|"paid"|"sent"|"cancelled"}
POST /v1/documents/:id/finalizeproforma → issued (+ send) — drafts return not_a_proforma
POST /v1/documents/:id/sende-mail with PDF and a public link
POST /v1/documents/:id/payments{amount, currency, method, note}
GET|POST /v1/contactscontacts — upsert {name, ico, dic, address, email, kind}
GET|POST /v1/expensesexpenses — incl. recurEvery for recurring
GET /v1/collections/:kindprice list, categories, projects…
GET /v1/ares?ico=ARES lookup (Czech business register)
POST /v1/mcpJSON-RPC interface for agents (same tools as the stdio MCP)

OpenAPI spec: /openapi.yaml. LLM summary: /llms.txt.

Webhooks

Subscriptions are set in the app (Settings → Integrations → Webhooks). Each delivery is a JSON POST with X-Invico-Event, X-Invico-Delivery and a X-Invico-Signature: sha256=<hmac-sha256 of body> signature against your endpoint secret. Event filter: *, document.*, or an exact name (payment.matched, quote.negotiation…). On the Max plan a custom JSON template can remap the payload — ready-made Slack/Discord/Teams presets are in the UI.

POST https://your-server.com/hook
X-Invico-Event: payment.matched
X-Invico-Signature: sha256=…

{"id":"…","event":"payment.matched","companyIco":"25549260",
 "createdAt":"2026-10-19T10:00:00Z","data":{"documentId":"…","amount":12100}}

MCP server

apps/mcp in the repo is a stdio MCP server exposing invico_* tools — issue invoices, read documents, contacts, overviews. The same interface runs over POST /v1/mcp (JSON-RPC). Client config:

{ "mcpServers": { "invico": {
    "command": "invico-mcp",
    "env": { "INVICO_TOKEN": "invk_…", "INVICO_URL": "https://app.invico.org" }
} } }