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 -X GET "https://www.erekini.eu/api/v1/invoices" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json"Ā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
Pieejamība
GET/api/v1/healthPārbaudīt API pieejamību
Atbilde
{
"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
{
"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
{
"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
{
"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
{
"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
{
"recipient_email": "billing@klients.lv"
}Atbilde
{
"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
{
"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
<binary PDF data>PUT/api/v1/invoices/:idAtjaunināt rēķinu (tikai melnraksti)
Pieprasījuma saturs
{
"due_date": "2026-02-15",
"notes": "Jauns piezīmju teksts"
}Atbilde
{
"data": { ... },
"message": "Invoice updated successfully"
}DELETE/api/v1/invoices/:idDzēst rēķinu (tikai melnraksti)
Atbilde
{
"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
{
"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
{
"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
{
"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
{
"data": {
"id": "uuid-new-client",
"name": "SIA Jaunais Klients",
...
},
"message": "Client created successfully"
}PUT/api/v1/clients/:idAtjaunināt klientu
Pieprasījuma saturs
{
"email": "jauns@piemers.lv",
"phone": "+371 25000000"
}Atbilde
{
"data": { ... },
"message": "Client updated successfully"
}DELETE/api/v1/clients/:idDzēst klientu (tikai bez rēķiniem)
Atbilde
{
"message": "Client deleted successfully"
}Webhooki
Kā darbojas webhooki
- Reģistrējiet endpointu (URL) ar pasūtītajiem notikumiem.
- Atbildē saņemiet
secret— tas tiks rādīts tikai vienu reizi. - Erekini POST pieprasījumā ietver
X-Erekini-Signature: sha256=<hmac>headeri, kur HMAC tiek aprēķināts ar jūsu secret virs}timestamp{.}body{. - Pārbaudiet parakstu, pirms uzticieties datiem.
GET/api/v1/webhooksIegūt visus reģistrētos webhook endpointus (bez secret)
Atbilde
{
"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
{
"url": "https://store.example.com/erekini-webhook",
"events": ["invoice.paid", "invoice.sent", "invoice.viewed"],
"description": "Production store"
}Atbilde
{
"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
{
"message": "Webhook endpoint deleted"
}GET/api/v1/webhooks/:id/deliveriesPēdējie 50 piegādes mēģinājumi (debug)
Atbilde
{
"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)
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ļū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
Koda piemēri
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();
}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 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/mcpKā pievienot
- 1.Nokopējiet adresi augstāk.
- 2.Ielīmējiet to sava asistenta MCP serveru konfigurācijā.
- 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.
Nepieciešama palīdzība?
Jautājumus par API integrāciju lasa un uz tiem atbild tas pats cilvēks, kas API uzrakstīja.