Invly REST API
Sąskaitos, klientai, prekės ir sąnaudos - tie patys duomenys, kuriuos matote programoje, pasiekiami iš jūsų sistemos. Ir MCP serveris, kad tai pasiektų AI agentas.
curl https://www.invly.lt/api/v1/invoices \ -H "Authorization: Bearer ily_<raktas>"
Autentifikacija
Raktą susikuriate programoje ir pridedate prie kiekvienos užklausos kaip Authorization: Bearer ily_… antraštę.
Raktai turi read arba read+write apimtį. Write būtina POST, PATCH ir DELETE užklausoms.
- Bazinis URL
- https://www.invly.lt/api
- Limitas
- 60 užklausų / min. raktui
- Rakto matomumas
- Rodomas tik kūrimo metu
Prijunkite AI agentą
Invly turi MCP serverį, todėl Claude, ChatGPT ar bet kuris kitas MCP palaikantis agentas gali skaityti jūsų sąskaitas, klientus bei sąnaudas ir paruošti juodraščius. Jungiantis prisijungiate su Invly paskyra, o ten, kur prisijungimo nėra, tinka API raktas.
Settings → Connectors → Add custom connector. Įklijuokite adresą ir prisijunkite su Invly paskyra, rakto nereikia.
URL: https://www.invly.lt/mcp
Viena komanda, tada /mcp atidaro prisijungimą naršyklėje.
claude mcp add --transport http invly https://www.invly.lt/mcp # arba su raktu, be naršyklės (CI, serveris): claude mcp add --transport http invly https://www.invly.lt/mcp \ --header "Authorization: Bearer ily_<raktas>"
| Įrankis | Ką daro |
|---|---|
| list_invoices | Sąskaitų sąrašas (filtrai: statusas, data, limitas) |
| get_invoice | Viena sąskaita su visomis eilutėmis |
| list_clients | Klientų sąrašas |
| list_expenses | Sąnaudų sąrašas |
| list_products | Prekių / paslaugų katalogas |
| revenue_summary | Pajamų suvestinė pagal statusą ir laikotarpį |
| create_draft_invoice | Sukuria sąskaitos JUODRAŠTĮ (niekada nesiunčia, reikia write apimties) |
| mark_invoice_paid | Pažymi sąskaitą apmokėta su data ir būdu (reikia write apimties) |
| mark_expense_paid | Pažymi sąnaudą apmokėta pavedimu; grynieji tik per KIO programoje (reikia write apimties) |
Cursor, VS Code ir kiti klientai jungiasi tuo pačiu adresu: per prisijungimą naršyklėje arba su antrašte Authorization: Bearer ily_<raktas>.
Prisijungdami pasirenkate, ar agentas gali tik skaityti, ar ir keisti. Net su keitimo teise jis kuria tik juodraščius ir žymi apmokėjimus, o sąskaitas išsiunčiate jūs programoje. Kiekvienas prijungtas agentas gauna savo raktą, kurį matote ir atšaukiate skiltyje API.
Endpoints
/v1Health check. No auth required.
curl https://www.invly.lt/api/v1
{
"data": {
"name": "Invly API",
"version": "v1",
"docs": "https://www.invly.lt/docs/api"
}
}/v1/invoicesList invoices for the authenticated user. Supports ?limit (max 100), ?status, ?since (ISO date).
curl https://www.invly.lt/api/v1/invoices?limit=10 \ -H "Authorization: Bearer ily_<key>"
{
"data": [
{
"id": "...",
"invoice_number": "SF-2026-042",
"status": "išsiųsta",
"total": 2032.80,
"issue_date": "2026-05-15",
"due_date": "2026-06-14",
"client_snapshot": { "name": "UAB Klientas" }
}
]
}/v1/invoices/{id}Fetch a single invoice including all lines.
curl https://www.invly.lt/api/v1/invoices/<id> \ -H "Authorization: Bearer ily_<key>"
/v1/invoicesCreate an invoice. invoice_number auto-generated if omitted.
curl https://www.invly.lt/api/v1/invoices \
-X POST \
-H "Authorization: Bearer ily_<key>" \
-H "Content-Type: application/json" \
-d '{
"client_id": "<client-uuid>",
"lines": [
{
"description": "Konsultacijos",
"quantity": 8,
"unit": "val",
"kind": "services",
"unit_price": 60,
"vat_rate": 21
}
]
}'{
"data": {
"id": "...",
"invoice_number": "SF-2026-043",
"status": "juodraštis",
"subtotal": 480.00,
"vat_amount": 100.80,
"total": 580.80,
"lines": [ ... ]
}
}/v1/invoices/{id}Change status (juodraštis, išsiųsta, apmokėta, atšaukta) and record the payment: paid_at (ISO, default now) and paid_method (bank or cash). paid_at / sent_at stay coherent exactly as in the app; a status change fires the matching webhook. Quotes cannot be paid (409 not_payable).
curl https://www.invly.lt/api/v1/invoices/<id> \
-X PATCH \
-H "Authorization: Bearer ily_<key>" \
-H "Content-Type: application/json" \
-d '{
"status": "apmokėta",
"paid_at": "2026-05-20",
"paid_method": "bank"
}'{
"data": {
"id": "...",
"invoice_number": "SF-2026-042",
"status": "apmokėta",
"paid_at": "2026-05-20T00:00:00+00:00",
"paid_method": "bank",
"lines": [ ... ]
}
}/v1/invoices/{id}Delete an invoice with its lines. Financial documents (saskaita, isankstine, kreditine) can be deleted only as a DRAFT: an issued one is numbered paper and returns 409 not_draft; set its status to atšaukta instead. Quotes (pasiulymas) and delivery notes (vaztarastis) move no money and can be deleted in any status, exactly as in the app.
curl https://www.invly.lt/api/v1/invoices/<id> \ -X DELETE \ -H "Authorization: Bearer ily_<key>"
{
"data": { "id": "...", "deleted": true }
}/v1/clientsList clients. Supports ?limit (max 200).
curl https://www.invly.lt/api/v1/clients \ -H "Authorization: Bearer ily_<key>"
/v1/clientsCreate a client. `name` is required; everything else optional.
curl https://www.invly.lt/api/v1/clients \
-X POST \
-H "Authorization: Bearer ily_<key>" \
-H "Content-Type: application/json" \
-d '{
"name": "UAB Klientas",
"email": "info@atlasis.lt",
"company_code": "305678901",
"vat_code": "LT100789012",
"iban": "LT123456789012345678"
}'/v1/productsList your product/service catalog.
curl https://www.invly.lt/api/v1/products \ -H "Authorization: Bearer ily_<key>"
/v1/expensesList tracked expenses with vat_treatment, cost_type and document_number. Supports ?limit (max 200).
curl https://www.invly.lt/api/v1/expenses \ -H "Authorization: Bearer ily_<key>"
/v1/expensesRecord an expense. amount is the document total INCLUDING VAT, vat_amount the VAT part of it. Optional: vat_treatment (deductible, non_deductible, margin, reverse_charge with vat_reverse_charge_kind), cost_type (operating, cogs, inventory, raw_materials, work_in_progress, fixed_asset, finance_cost, interest, loan_principal, supplier_advance), document_number, description. Omitted vat_treatment / cost_type take the defaults and stay flagged for review in the app. Optional payment mark: paid_at (YYYY-MM-DD) with paid_method bank; a cash payment is proven by a KIO in the cash book, so paid_method cash returns 409 cash_needs_kio. A row matching an existing expense is saved linked as a suspected duplicate, never dropped.
curl https://www.invly.lt/api/v1/expenses \
-X POST \
-H "Authorization: Bearer ily_<key>" \
-H "Content-Type: application/json" \
-d '{
"supplier": "UAB Tiekėjas",
"date": "2026-05-18",
"amount": 121.00,
"vat_amount": 21.00,
"vat_treatment": "deductible",
"cost_type": "operating",
"document_number": "TK-2026-0117"
}'{
"data": {
"id": "...",
"date": "2026-05-18",
"supplier": "UAB Tiekėjas",
"amount": 121.00,
"vat_amount": 21.00,
"vat_treatment": "deductible",
"cost_type": "operating",
"document_number": "TK-2026-0117",
"paid_at": null,
"paid_method": null,
"suspected_duplicate_of": null
}
}/v1/expenses/{id}Record or clear the manual payment mark on an expense: paid_at (YYYY-MM-DD) and paid_method together, or both null to clear. Only bank is accepted; cash returns 409 cash_needs_kio because a cash payment is proven by a KIO written in the cash book. A matched bank transaction or a KIO always outranks this mark in the journals, exactly as in the app.
curl https://www.invly.lt/api/v1/expenses/<id> \
-X PATCH \
-H "Authorization: Bearer ily_<key>" \
-H "Content-Type: application/json" \
-d '{
"paid_at": "2026-05-20",
"paid_method": "bank"
}'{
"data": {
"id": "...",
"supplier": "UAB Tiekėjas",
"amount": 121.00,
"paid_at": "2026-05-20",
"paid_method": "bank"
}
}Būsenų reikšmės
status saugomas lietuviškai ir toks pat keliauja į abi puses: ir filtre ?status=, ir kuriant sąskaitą. Nežinomos reikšmės klaidos negrąžina - sąskaita tiesiog lieka juodraščiu, tad sent vietoj išsiųsta praeitų tyliai.
juodraštis - sukurta, dar neišsiųstaišsiųsta - perduota klientuiapmokėta - gautas mokėjimasvėluoja - praėjo apmokėjimo terminasatšaukta - anuliuotaKuriant per API priimamos tik išsiųsta ir apmokėta; vėluoja nustatoma pačios sistemos pagal apmokėjimo terminą. Keičiant per PATCH nežinoma reikšmė grąžina 400 validation, tyliai nepraeina niekas.
Klaidos
Visos klaidos grąžinamos vienoda forma: { "error": { "code", "message" } }
| Kodas | Reikšmė |
|---|---|
| 401 unauthenticated | Missing or malformed Authorization header |
| 401 invalid_key | Key not recognized or revoked |
| 402 plan_required | Caller needs a Komandos plan (or trial of Verslas) |
| 403 scope_insufficient | Key lacks the required read/write scope |
| 400 validation | Request body failed validation; `message` explains |
| 400 invalid_json | Request body was not valid JSON |
| 404 not_found | Route does not exist or resource not owned by caller |
| 409 not_draft | DELETE on an issued financial document; only drafts, quotes and delivery notes can be deleted |
| 409 not_payable | PATCH to apmokėta on a quote or delivery note |
| 409 cash_needs_kio | Expense paid_method cash; a cash payment is proven by a KIO in the cash book |
| 500 server_error | Database or upstream error; check `message` |
Webhooks
Įvykių pranešimai į jūsų URL. Adresą ir įvykius nustatote /app/api, eilė išsiunčiama kas minutę. Prenumeruojate invoice.created, invoice.sent, invoice.paid ir client.created. Kiekviena žinutė pasirašoma HMAC-SHA256 jūsų endpoint'o paslaptimi.
Antraštė X-Invly-Signature: t=<unix>,v1=<hex>, kur pasirašoma eilutė yra t + "." + kūnas. Atsakykite 2xx per 10 s. Nepavykus kartojame iki 5 kartų su augančia pauze (1 min, 5 min, 30 min, 2 val, 6 val), po to pristatymas žymimas nepavykusiu, o klaida matoma prie endpoint'o.