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.

Komandos planasBearer autentifikacijaJSON
pirmoji užklausa
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.

MCP adresas
https://www.invly.lt/mcp
Claude (claude.ai)

Settings → Connectors → Add custom connector. Įklijuokite adresą ir prisijunkite su Invly paskyra, rakto nereikia.

URL:  https://www.invly.lt/mcp
Claude Code (terminale)

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>"
ĮrankisKą daro
list_invoicesSąskaitų sąrašas (filtrai: statusas, data, limitas)
get_invoiceViena sąskaita su visomis eilutėmis
list_clientsKlientų sąrašas
list_expensesSąnaudų sąrašas
list_productsPrekių / paslaugų katalogas
revenue_summaryPajamų suvestinė pagal statusą ir laikotarpį
create_draft_invoiceSukuria sąskaitos JUODRAŠTĮ (niekada nesiunčia, reikia write apimties)
mark_invoice_paidPažymi sąskaitą apmokėta su data ir būdu (reikia write apimties)
mark_expense_paidPaž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

GET/v1

Health check. No auth required.

Reikia apimties: read
užklausa
curl https://www.invly.lt/api/v1
atsakymas
{
  "data": {
    "name": "Invly API",
    "version": "v1",
    "docs": "https://www.invly.lt/docs/api"
  }
}
GET/v1/invoices

List invoices for the authenticated user. Supports ?limit (max 100), ?status, ?since (ISO date).

Reikia apimties: read
užklausa
curl https://www.invly.lt/api/v1/invoices?limit=10 \
  -H "Authorization: Bearer ily_<key>"
atsakymas
{
  "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" }
    }
  ]
}
GET/v1/invoices/{id}

Fetch a single invoice including all lines.

Reikia apimties: read
užklausa
curl https://www.invly.lt/api/v1/invoices/<id> \
  -H "Authorization: Bearer ily_<key>"
POST/v1/invoices

Create an invoice. invoice_number auto-generated if omitted.

Reikia apimties: write
užklausa
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
      }
    ]
  }'
atsakymas
{
  "data": {
    "id": "...",
    "invoice_number": "SF-2026-043",
    "status": "juodraštis",
    "subtotal": 480.00,
    "vat_amount": 100.80,
    "total": 580.80,
    "lines": [ ... ]
  }
}
PATCH/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).

Reikia apimties: write
užklausa
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"
  }'
atsakymas
{
  "data": {
    "id": "...",
    "invoice_number": "SF-2026-042",
    "status": "apmokėta",
    "paid_at": "2026-05-20T00:00:00+00:00",
    "paid_method": "bank",
    "lines": [ ... ]
  }
}
DELETE/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.

Reikia apimties: write
užklausa
curl https://www.invly.lt/api/v1/invoices/<id> \
  -X DELETE \
  -H "Authorization: Bearer ily_<key>"
atsakymas
{
  "data": { "id": "...", "deleted": true }
}
GET/v1/clients

List clients. Supports ?limit (max 200).

Reikia apimties: read
užklausa
curl https://www.invly.lt/api/v1/clients \
  -H "Authorization: Bearer ily_<key>"
POST/v1/clients

Create a client. `name` is required; everything else optional.

Reikia apimties: write
užklausa
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"
  }'
GET/v1/products

List your product/service catalog.

Reikia apimties: read
užklausa
curl https://www.invly.lt/api/v1/products \
  -H "Authorization: Bearer ily_<key>"
GET/v1/expenses

List tracked expenses with vat_treatment, cost_type and document_number. Supports ?limit (max 200).

Reikia apimties: read
užklausa
curl https://www.invly.lt/api/v1/expenses \
  -H "Authorization: Bearer ily_<key>"
POST/v1/expenses

Record 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.

Reikia apimties: write
užklausa
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"
  }'
atsakymas
{
  "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
  }
}
PATCH/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.

Reikia apimties: write
užklausa
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"
  }'
atsakymas
{
  "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 - anuliuota

Kuriant 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" } }

KodasReikšmė
401 unauthenticatedMissing or malformed Authorization header
401 invalid_keyKey not recognized or revoked
402 plan_requiredCaller needs a Komandos plan (or trial of Verslas)
403 scope_insufficientKey lacks the required read/write scope
400 validationRequest body failed validation; `message` explains
400 invalid_jsonRequest body was not valid JSON
404 not_foundRoute does not exist or resource not owned by caller
409 not_draftDELETE on an issued financial document; only drafts, quotes and delivery notes can be deleted
409 not_payablePATCH to apmokėta on a quote or delivery note
409 cash_needs_kioExpense paid_method cash; a cash payment is proven by a KIO in the cash book
500 server_errorDatabase 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.