Biznesa plāns: 14 dienas bez maksas
DokumentācijaREST v1 · MCP

erekini.eu API

REST API rēķiniem un klientiem: izveidot, izsūtīt, lasīt un saņemt notikumus ar webhookiem. Blakus ir bezmaksas MCP serveris, kas nolasa e-rēķinus bez atslēgas un bez konta.

Bāzes adrese
/api/v1
Plāns
Bizness un augstāk
Lasīšana
60 pieprasījumi/min
Rakstīšana
30 pieprasījumi/min

API ir pieejams Biznesa plānā un augstāk, un atslēgu var izveidot tikai konta īpašnieks.

curl
curl -X GET "https://www.erekini.eu/api/v1/invoices" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json"
Sākums

Ātrais sākums

1.Iegūstiet API atslēgu

Dodieties uz Organizācijas iestatījumi → API un ģenerējiet jaunu API atslēgu.

Integrācijas testēšanai tajā pašā vietā izveidojiet testa atslēgu (sk_test_). Tā strādā ar tiem pašiem datiem, bet klientam neko nenosūta, neko nenodod Peppol un neizmanto kredītus. Webhooki tiek izsūtīti.

2.Autentifikācija

Visiem pieprasījumiem jāsatur Authorization header ar Bearer token: Bearer YOUR_API_KEY

Galapunkti

Galapunkti

Pieejamība

GET/api/v1/healthPārbaudīt API pieejamību

Atbilde

json
{
  "status": "ok",
  "timestamp": "2026-01-11T12:00:00.000Z",
  "organization": {
    "id": "uuid-org",
    "name": "SIA Piemērs"
  }
}

Rēķini

GET/api/v1/invoicesIegūt visu rēķinu sarakstu

Vaicājuma parametri

status string
Filtrēt pēc statusa (draft, issued, sent, paid, partially_paid, voided)
overdue boolean
overdue=true — tikai kavētie rēķini: vēl neapmaksāti un termiņš pagājis
page number
Lapas numurs (noklusējums: 1)
limit number
Ieraksti uz lapu (noklusējums: 20, ne vairāk kā 100)
sort string
Kārtošana (newest, oldest, amount_desc, amount_asc)

Atbilde

json
{
  "data": [
    {
      "id": "uuid-1234",
      "number": "INV-2026-0001",
      "issue_date": "2026-01-10",
      "due_date": "2026-01-25",
      "currency": "EUR",
      "subtotal": 1000.00,
      "vat": 210.00,
      "total": 1210.00,
      "status": "issued",
      "client_id": "uuid-client",
      "created_at": "2026-01-10T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 45,
    "totalPages": 3
  }
}
GET/api/v1/invoices/:idIegūt konkrētu rēķinu

Atbilde

json
{
  "data": {
    "id": "uuid-1234",
    "number": "INV-2026-0001",
    "issue_date": "2026-01-10",
    "due_date": "2026-01-25",
    "currency": "EUR",
    "items": [
      {
        "description": "Web izstrāde",
        "quantity": 10,
        "unit_price": 100.00,
        "unit": "h",
        "vat_rate": 21,
        "line_total": 1000.00,
        "line_vat": 210.00
      }
    ],
    "subtotal": 1000.00,
    "vat": 210.00,
    "total": 1210.00,
    "status": "issued",
    "clients": {
      "id": "uuid-client",
      "name": "SIA Klients",
      "reg_nr": "40001234567",
      "vat_no": "LV40001234567"
    }
  }
}
POST/api/v1/invoicesIzveidot rēķinu, pēc izvēles arī izsūtīt to nekavējoties (auto_send)

Pieprasījuma saturs

json
{
  "external_id": "order-12345",
  "client_id": "uuid-client",
  "due_date": "2026-02-10",
  "currency": "EUR",
  "items": [
    {
      "description": "Konsultācijas pakalpojumi",
      "quantity": 5,
      "unit_price": 150.00,
      "vat_rate": 21
    }
  ],
  "notes": "Apmaksa 15 dienu laikā",
  "auto_send": true,
  "delivery": "email"
}

Atbilde

json
{
  "data": {
    "id": "uuid-new",
    "number": "INV-2026-0002",
    "status": "sent",
    "external_id": "order-12345",
    "total": 907.50
  },
  "delivery": {
    "success": true,
    "recipient_email": "client@example.com"
  },
  "message": "Invoice created successfully"
}
POST/api/v1/invoices/:id/sendIzsūtīt rēķinu pa e-pastu (statuss draft → sent)

Pieprasījuma saturs

json
{
  "recipient_email": "billing@klients.lv"
}

Atbilde

json
{
  "message": "Invoice sent",
  "recipient_email": "billing@klients.lv"
}
POST/api/v1/invoices/:id/peppolPeppol nosūtīšana. Pašlaik nav pieejama: erekini.eu nav pieslēgts Peppol piekļuves punktam, tāpēc pieprasījums atgriež 400. Peppol XML failu erekini.eu izveido un pārbauda, bet iesniedzat to jūs.

Atbilde

json
{
  "error": "Bad Request",
  "message": "No Peppol Access Point is configured (PEPPOL_AP_PROVIDER is unset)"
}
GET/api/v1/invoices/:id/pdfLejupielādēt rēķina PDF (application/pdf)

Atbilde

json
<binary PDF data>
PUT/api/v1/invoices/:idAtjaunināt rēķinu (tikai melnraksti)

Pieprasījuma saturs

json
{
  "due_date": "2026-02-15",
  "notes": "Jauns piezīmju teksts"
}

Atbilde

json
{
  "data": { ... },
  "message": "Invoice updated successfully"
}
DELETE/api/v1/invoices/:idDzēst rēķinu (tikai melnraksti)

Atbilde

json
{
  "message": "Invoice deleted successfully"
}

Klienti

GET/api/v1/clientsIegūt visu klientu sarakstu

Vaicājuma parametri

page number
Lapas numurs (noklusējums: 1)
limit number
Ieraksti uz lapu (noklusējums: 20, ne vairāk kā 100)
search string
Meklēt pēc vārda, e-pasta vai reģ. nr.

Atbilde

json
{
  "data": [
    {
      "id": "uuid-client",
      "name": "SIA Piemērs",
      "reg_nr": "40001234567",
      "vat_no": "LV40001234567",
      "email": "info@piemers.lv",
      "phone": "+371 20000000",
      "address": "Brīvības iela 1, Rīga",
      "country": "LV",
      "created_at": "2026-01-01T10:00:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 12,
    "totalPages": 1
  }
}
GET/api/v1/clients/:idIegūt konkrētu klientu

Atbilde

json
{
  "data": {
    "id": "uuid-client",
    "name": "SIA Piemērs",
    "reg_nr": "40001234567",
    "vat_no": "LV40001234567",
    "email": "info@piemers.lv",
    "phone": "+371 20000000",
    "address": "Brīvības iela 1, Rīga, LV-1001",
    "country": "LV",
    "created_at": "2026-01-01T10:00:00Z",
    "updated_at": "2026-01-05T14:30:00Z"
  }
}
POST/api/v1/clientsIzveidot jaunu klientu

Pieprasījuma saturs

json
{
  "name": "SIA Jaunais Klients",
  "reg_nr": "40009876543",
  "vat_no": "LV40009876543",
  "email": "info@jaunais.lv",
  "phone": "+371 29000000",
  "address": "Elizabetes iela 22, Rīga",
  "country": "LV"
}

Atbilde

json
{
  "data": {
    "id": "uuid-new-client",
    "name": "SIA Jaunais Klients",
    ...
  },
  "message": "Client created successfully"
}
PUT/api/v1/clients/:idAtjaunināt klientu

Pieprasījuma saturs

json
{
  "email": "jauns@piemers.lv",
  "phone": "+371 25000000"
}

Atbilde

json
{
  "data": { ... },
  "message": "Client updated successfully"
}
DELETE/api/v1/clients/:idDzēst klientu (tikai bez rēķiniem)

Atbilde

json
{
  "message": "Client deleted successfully"
}

Webhooki

Kā darbojas webhooki

  1. Reģistrējiet endpointu (URL) ar pasūtītajiem notikumiem.
  2. Atbildē saņemiet secret — tas tiks rādīts tikai vienu reizi.
  3. Erekini POST pieprasījumā ietver X-Erekini-Signature: sha256=<hmac> headeri, kur HMAC tiek aprēķināts ar jūsu secret virs }timestamp{.}body{.
  4. Pārbaudiet parakstu, pirms uzticieties datiem.
GET/api/v1/webhooksIegūt visus reģistrētos webhook endpointus (bez secret)

Atbilde

json
{
  "data": [
    {
      "id": "uuid-wh",
      "url": "https://store.example.com/erekini-webhook",
      "events": ["invoice.paid", "invoice.viewed"],
      "enabled": true,
      "description": "Production store",
      "created_at": "2026-05-15T12:00:00Z"
    }
  ]
}
POST/api/v1/webhooksReģistrēt jaunu webhook. Atbilde satur secret, saglabājiet to.

Pieprasījuma saturs

json
{
  "url": "https://store.example.com/erekini-webhook",
  "events": ["invoice.paid", "invoice.sent", "invoice.viewed"],
  "description": "Production store"
}

Atbilde

json
{
  "data": {
    "id": "uuid-wh",
    "url": "https://store.example.com/erekini-webhook",
    "events": ["invoice.paid", "invoice.sent", "invoice.viewed"],
    "secret": "whsec_a1b2c3d4..."
  },
  "message": "Webhook endpoint created. Store the secret now — it will not be shown again."
}
DELETE/api/v1/webhooks/:idDzēst webhook endpointu

Atbilde

json
{
  "message": "Webhook endpoint deleted"
}
GET/api/v1/webhooks/:id/deliveriesPēdējie 50 piegādes mēģinājumi (debug)

Atbilde

json
{
  "data": [
    {
      "id": "uuid-d",
      "event_type": "invoice.paid",
      "status": "sent",
      "attempts": 1,
      "response_status": 200,
      "delivered_at": "2026-05-15T12:00:05Z",
      "created_at": "2026-05-15T12:00:00Z"
    }
  ]
}

Pārbaudīt parakstu (Node.js)

verify.js
const crypto = require('crypto');

function verifySignature(secret, timestampHeader, signatureHeader, rawBody) {
  const sig = signatureHeader.replace(/^sha256=/, '');
  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${timestampHeader}.${rawBody}`)
    .digest('hex');
  return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(expected));
}

// In your Express handler:
app.post('/erekini-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const ok = verifySignature(
    process.env.WEBHOOK_SECRET,
    req.headers['x-erekini-timestamp'],
    req.headers['x-erekini-signature'],
    req.body.toString()
  );
  if (!ok) return res.status(401).end();
  const event = JSON.parse(req.body.toString());
  // event.event, event.data, event.created_at
  res.status(200).end();
});
  • Neizdevušos piegādi atkārtojam ik pēc 15 minūtēm, ar pieaugošu intervālu. Statusu redzat webhook_deliveries ierakstos.
  • Katrā piegādē ir X-Erekini-Event (notikuma nosaukums), X-Erekini-Delivery (unikāls piegādes ID atkārtojumu atpazīšanai) un X-Erekini-Signature (HMAC ar laikspiedolu).
  • Atkārtots izveides pieprasījums ar to pašu external_id atgriež pirmo rēķinu un lauku idempotent: true — jauns rēķins netiek izveidots.
  • Katrā atbildē ir RateLimit-Limit, RateLimit-Remaining un RateLimit-Reset.
  • Kļūdas atbilde vienmēr ir { error, message }: error ir HTTP statusa nosaukums, message — cilvēkam lasāms paskaidrojums.
  • Paraugā salīdziniet parakstus ar vienādu garumu (timingSafeEqual met kļūdu, ja garumi atšķiras) un noraidiet laikspiedolus, kas vecāki par 5 minūtēm.

Pieejamie notikumi

invoice.created
rēķins tika izveidots (arī caur dashboard)
invoice.sent
rēķins tika nosūtīts (e-pasts vai Peppol)
invoice.viewed
klients atvēra rēķina publisko linku
invoice.paid
rēķins atzīmēts kā apmaksāts
invoice.overdue
rēķins ir nokavēts
client.created
pievienots klients (arī caur dashboard)
client.updated
klienta dati tika mainīti
client.deleted
klients tika dzēsts (payload: tikai id)
*
visi notikumi (wildcard)
Kļūdas

Kļūdu kodi

400
Bad Request
Nepareizi pieprasījuma parametri
401
Unauthorized
Nederīga vai trūkstoša API atslēga
403
Forbidden
Nav atļaujas veikt šo darbību
404
Not Found
Resurss neeksistē
429
Too Many Requests
Pārsniegts pieprasījumu limits
500
Internal Server Error
Servera kļūda, mēģiniet vēlreiz
Piemēri

Koda piemēri

fetch-invoices.js · JavaScript / Node.js
const API_KEY = 'your-api-key';
const BASE_URL = 'https://www.erekini.eu/api/v1';

async function getInvoices() {
  const response = await fetch(`${BASE_URL}/invoices?status=issued`, {
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json'
    }
  });
  
  if (!response.ok) {
    throw new Error(`HTTP error! status: ${response.status}`);
  }
  
  return response.json();
}

async function createInvoice(clientId, items) {
  const response = await fetch(`${BASE_URL}/invoices`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${API_KEY}`,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      client_id: clientId,
      due_date: '2026-02-10',
      items: items
    })
  });
  
  return response.json();
}
invoices.py · Python
import requests

API_KEY = 'your-api-key'
BASE_URL = 'https://www.erekini.eu/api/v1'

headers = {
    'Authorization': f'Bearer {API_KEY}',
    'Content-Type': 'application/json'
}

# Get all invoices
def get_invoices(status=None):
    params = {'status': status} if status else {}
    response = requests.get(f'{BASE_URL}/invoices', headers=headers, params=params)
    response.raise_for_status()
    return response.json()

# Create invoice
def create_invoice(client_id, items, due_date):
    data = {
        'client_id': client_id,
        'due_date': due_date,
        'items': items
    }
    response = requests.post(f'{BASE_URL}/invoices', headers=headers, json=data)
    response.raise_for_status()
    return response.json()
MCP

MCP serveris

Bezmaksas MCP serveris, ko var pievienot jebkuram AI asistentam, kas atbalsta attālinātus MCP serverus. Tas nolasa strukturētu e-rēķinu (UBL 2.1, Peppol BIS Billing 3.0, EN 16931) un atdod to salasāmā veidā vai kā PDF. Nav vajadzīga atslēga un nav vajadzīgs konts.

Servera adrese

https://www.erekini.eu/api/public/mcp

Kā pievienot

  1. 1.Nokopējiet adresi augstāk.
  2. 2.Ielīmējiet to sava asistenta MCP serveru konfigurācijā.
  3. 3.Palūdziet asistentam nolasīt e-rēķina XML failu.

Pieejamie rīki

read_einvoice
Nolasa XML un atdod piegādātāju, saņēmēju, pozīcijas, PVN un summas. Ja dokumenta norādītā kopsumma nesakrīt ar to, ko dod paša dokumenta rindas, tas tiek pateikts atsevišķi.
einvoice_to_pdf
Pārvērš to pašu XML par PDF, ko var izdrukāt vai pārsūtīt cilvēkam, kurš XML nelasa.
latvian_vat
Aprēķina PVN abos virzienos pēc Latvijas likmēm (21%, 12%, 5%, 0%) un pēc izvēles pārbauda 50 000 eiro reģistrācijas slieksni. Likme ārpus šī saraksta tiek atteikta, nevis aprēķināta: to pašu kopu erekini.eu piemēro reāliem rēķiniem.
latvian_late_payment_interest
Aprēķina līgumsodu pēc dienas likmes, ierobežotu līdz 10% no pamatparāda, un blakus likumiskos procentus: uzņēmumam ECB atsauces likme plus 8 punkti, patērētājam 6% gadā. Asistents saņem aprēķinu, nevis aptuvenu skaitli.

Drošība

Serveris tikai lasa. Tas neko neraksta, nesaglabā dokumentu un neseko nevienai saitei dokumentā. Faili ar DOCTYPE vai ENTITY tiek atteikti, un lielākais pieļaujamais izmērs ir 5 MB.

Atbalsts

Nepieciešama palīdzība?

Jautājumus par API integrāciju lasa un uz tiem atbild tas pats cilvēks, kas API uzrakstīja.