Public REST API v1
API dokümantasyonu
E-fatura verileri için salt okunur, müşteri hesabı kapsamlı REST API. Stabil URL, cursor tabanlı sayfalama, imzalı webhook’lar.
Hızlı başlangıç
Çalışma alanı ayarlarınızdan bir API anahtarı oluşturun, ardından herhangi bir endpoint’i Authorization header ile çağırın.
# 1. Issue an API key in workspace settings → API keys.
# 2. Export it locally so curl can read it:
export ERI_API_KEY='eri_live_…'
# 3. List the 10 most recent invoices:
curl -s 'https://www.e-rechnung-inbox.de/api/public/v1/invoices?limit=10' \
-H "Authorization: Bearer $ERI_API_KEY"
// Node 18+ (built-in fetch). No SDK required.
const res = await fetch(
'https://www.e-rechnung-inbox.de/api/public/v1/invoices?limit=10',
{ headers: { Authorization: `Bearer ${process.env.ERI_API_KEY}` } },
);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const { data, next_cursor } = await res.json();
console.log(data.length, 'invoices,', next_cursor ? 'more available' : 'end of list');
Tüm endpoint’ler salt okunurdur ve müşteri hesabı kapsamındadır. Aşağıdaki liste /invoices kullanır; aynı desen /invoices/:id ve /suppliers için de geçerlidir.
Kimlik doğrulama
/api/public/v1/* yoluna yapılan her istek bir API anahtarı gerektirir — Authorization Bearer header’ı veya X-API-Key header’ı kullanılabilir. İkisi eşdeğerdir.
Authorization: Bearer eri_live_…X-API-Key: eri_live_…
Anahtarları çalışma alanı ayarlarında “API anahtarları” altında oluşturun. Anahtarlar müşteri hesabı kapsamındadır — birden çok müşteri hesabına erişimi olan mali müşavir her müşteri hesabı için ayrı anahtar oluşturur.
Düz metin anahtarlar yalnızca oluşturma sırasında bir kez gösterilir. Bunları bir gizli bilgi kasasında saklayın.
Endpoint’ler
Tam OpenAPI 3.1 spesifikasyonu: /api/public/v1/openapi.json.
/api/public/v1/invoicesINVOICESList invoices
Returns mandant-scoped invoices in receipt order (newest first). Cursor-paginated.
| Param | In | Type | Notes |
|---|---|---|---|
| cursor | query | string | Opaque cursor from a previous response's `next_cursor`. |
| limit | query | integer | |
| status | query | valid | invalid | pdf_only | |
| workflow_status | query | new | reviewed | approved | paused | rejected | in_progress | exported | paid | |
| supplier_id | query | string<uuid> | |
| from | query | string<date-time> | |
| to | query | string<date-time> | |
| has_iban_change | query | boolean | Filter to invoices with a flagged IBAN change. |
200 — OK
/api/public/v1/invoicesINVOICESUpload an invoice
Accepts a PDF/XML invoice file for asynchronous processing. Requires an API key with write scope, an `Idempotency-Key` header, and that public API write endpoints are enabled for the workspace/environment. CSV+ZIP export remains the supported fallback for downstream accounting.
| Param | In | Type | Notes |
|---|---|---|---|
| Idempotency-Key* | header | string | Stable client-generated retry key for this write. Reuse only for the same method, route, and request body/file; use a new key for any different upload or workflow decision. The service stores only a scoped SHA-256 reservation key, never the raw header value. |
200 — OK
/api/public/v1/invoices/{id}INVOICESGet a single invoice
| Param | In | Type | Notes |
|---|---|---|---|
| id* | path | string<uuid> | |
| include | query | string | Comma-separated extras. `pdf_url` adds a 5-minute signed PDF URL. |
200 — OK
/api/public/v1/invoices/{id}INVOICESUpdate invoice workflow status
Narrow write endpoint for workflow_status changes only. Requires an API key with `write` scope and an `Idempotency-Key` header; all writes are mandant-scoped and audit-stamped. Optional decision_note values are normalized, redacted, and stored as bounded audit evidence.
| Param | In | Type | Notes |
|---|---|---|---|
| id* | path | string<uuid> | |
| Idempotency-Key* | header | string | Stable client-generated retry key for this write. Reuse only for the same method, route, and request body/file; use a new key for any different upload or workflow decision. The service stores only a scoped SHA-256 reservation key, never the raw header value. |
200 — Updated invoice.
/api/public/v1/mcpMCPInvoke Hosted MCP tools
Hosted MCP endpoint using JSON-RPC 2.0 over `application/json`. Supports `tools/list` for discovery and `tools/call` for the `validate_xrechnung` and `parse_xrechnung` tools. Requires a Public API key and shares Public API rate limits and payload-size limits.
200 — JSON-RPC result for `tools/list` or `tools/call`.
/api/public/v1/suppliersSUPPLIERSList suppliers
Returns mandant-scoped suppliers in name-ascending order. Cursor-paginated.
| Param | In | Type | Notes |
|---|---|---|---|
| cursor | query | string | |
| limit | query | integer | |
| has_open_invoices | query | boolean | |
| vat_id | query | string |
200 — OK
Kod örnekleri
Faturaları listelemek için en basit çağrılar:
import os, requests
res = requests.get(
"https://www.e-rechnung-inbox.de/api/public/v1/invoices",
params={"limit": 10},
headers={"Authorization": f"Bearer {os.environ['ERI_API_KEY']}"},
timeout=10,
)
res.raise_for_status()
print(res.json()["data"])
# Requires a write-scope API key. Reuse the same Idempotency-Key for retries
# of the same upload; use a new key for a different file/body.
export ERI_IDEMPOTENCY_KEY='upload-RE-2026-0142-001'
curl -sS -X POST 'https://www.e-rechnung-inbox.de/api/public/v1/invoices' \
-H "Authorization: Bearer $ERI_API_KEY" \
-H "Idempotency-Key: $ERI_IDEMPOTENCY_KEY" \
-F "file=@./rechnung.xml;type=application/xml"
# Workflow writes are audit-stamped and require their own stable retry key.
export ERI_WORKFLOW_IDEMPOTENCY_KEY='workflow-RE-2026-0142-approve-001'
curl -sS -X PATCH 'https://www.e-rechnung-inbox.de/api/public/v1/invoices/$INVOICE_ID' \
-H "Authorization: Bearer $ERI_API_KEY" \
-H "Idempotency-Key: $ERI_WORKFLOW_IDEMPOTENCY_KEY" \
-H "Content-Type: application/json" \
--data '{"workflow_status":"approved","decision_note":"Approved after supplier and IBAN check"}'
Hosted MCP
Public API anahtarını Claude Desktop, Cursor veya Smithery ile barındırılan MCP uç noktası üzerinden kullanın. Nasıl bağlanılır.
Webhook’lar
Çalışma alanı ayarlarından bir abonelik oluşturun. İmzalı JSON payload’unu HTTPS üzerinden POST ederiz. Desteklenen olay türleri:
invoice.createdinvoice.validatedinvoice.flaggedinvoice.workflow_status_changedinvoice.exportedsupplier.createdsupplier.iban_changed
Payload örnekleri
Her olay aynı zarfı kullanır: id, type, created_at ve data. data içindeki alanlar olaya bağlıdır; hassas banka verileri en aza indirilir.
{
"id": "evt_01HV0CK7M5W9XGZN2Y9EGZ7T9R",
"type": "invoice.created",
"created_at": "2026-05-08T11:42:18.317Z",
"data": {
"invoice_id": "f3a3c5e0-3d3a-4f6e-9e9c-2d2dabec3d31",
"invoice_number": "RE-2026-0142",
"supplier": { "id": "8a2…", "name": "ACME GmbH" },
"gross_total": 1428.0,
"currency": "EUR"
}
}{
"id": "evt_01HV0CK7M5W9XGZN2Y9EGZ7T9S",
"type": "supplier.iban_changed",
"created_at": "2026-05-08T11:42:18.317Z",
"data": {
"supplier_id": "8a2…",
"supplier_name": "ACME GmbH",
"previous_iban_last4": "0145",
"new_iban_last4": "9921",
"first_seen_in_invoice_id": "f3a3c5e0-3d3a-4f6e-9e9c-2d2dabec3d31"
}
}İmzaları doğrula
İmza doğrulama (X-ERI-Signature header’ı, format: t=UNIX_SECONDS,v1=HMAC_HEX):
import crypto from 'node:crypto';
export function verifyEriWebhook(payload, signatureHeader, signingSecret) {
// signatureHeader format: "t=<unix>,v1=<hex>"
const parts = Object.fromEntries(
signatureHeader.split(',').map((p) => p.split('=')),
);
const t = Number(parts.t);
if (!Number.isFinite(t) || Math.abs(Date.now() / 1000 - t) > 300) return false;
const expected = crypto.createHmac('sha256', signingSecret)
.update(`${t}.${payload}`)
.digest('hex');
const actual = parts.v1 ?? '';
return actual.length === expected.length && crypto.timingSafeEqual(
Buffer.from(expected, 'utf8'),
Buffer.from(actual, 'utf8'),
);
}
import hashlib, hmac, time
def verify_eri_webhook(payload: bytes, header: str, secret: str) -> bool:
parts = dict(p.split("=", 1) for p in header.split(","))
t = int(parts.get("t", "0"))
if abs(int(time.time()) - t) > 300:
return False
signed = f"{t}.{payload.decode('utf-8')}"
expected = hmac.new(secret.encode("utf-8"), signed.encode("utf-8"),
hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, parts.get("v1", ""))
Yeniden denemeler ve otomatik devre dışı bırakma
Hata durumunda kademeli bekleme uygularız: 1 dk, 5 dk, 30 dk, 2 saat, 12 saat — en fazla 5 deneme. Arka arkaya 5 hatadan sonra abonelik otomatik devre dışı kalır.
- Başarısız teslimatlar üstel backoff ile tekrar denenir: 1 dakika, 5 dakika, 30 dakika, 2 saat, 12 saat.
- Arka arkaya 5 başarısız teslimattan sonra abonelik otomatik olarak devre dışı bırakılır.
- Otomatik devre dışı bırakmadan sonra endpoint’i düzeltin, yeni abonelik oluşturun ve yeni imzalama gizli anahtarını güvenli şekilde saklayın.
Hız limitleri (pakete duyarlı)
Her API anahtarı için iki kova kontrol edilir (dakika + saat). Limitler paketinize bağlıdır:
| Paket | İstek / dakika | İstek / saat | Webhook abonelik limiti |
|---|---|---|---|
| Starter | 30 | 500 | 1 |
| Standard | 60 | 1000 | 3 |
| Premium | 120 | 3000 | 10 |
| Platinum | 300 | 10000 | 25 |
| Kanzlei | 300 | 10000 | 25 |
Hız limiti backend’i kullanılamıyorsa API HTTP 503 + Retry-After ile yanıt verir (fail-closed). Paket sorgulama hatası Starter limitine düşer.
Başarılı yanıtlar X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset (Unix zaman damgası) ve X-RateLimit-Tier (aktif paket) içerir.
Hatalar
Hata yanıtları JSON formatındadır; sabit bir kod ve kullanıcı tarafından okunabilir bir mesaj içerir.
| HTTP | Kod | Açıklama |
|---|---|---|
| 400 | INVALID_INPUT | Parametreler veya JSON gövdesi geçersiz. |
| 401 | AUTH_UNAUTHORIZED | API anahtarı eksik, geçersiz veya iptal edilmiş. |
| 403 | AUTH_FORBIDDEN | API anahtarı bu kaynak için gerekli izne sahip değil. |
| 404 | NOT_FOUND | Kaynak mevcut müşteri hesabında yok veya görünür değil. |
| 429 | rate_limit_exceeded | Pakete duyarlı hız limiti aşıldı. Kısa bir beklemeden sonra tekrar deneyin. |
| 503 | rate_limit_backend_unavailable | Hız limiti backend’i kullanılamıyor; API güvenli tarafta kalmak için isteği reddeder. |
Tipik format: error, message ve request_id alanlarını içeren JSON.
Değişiklik günlüğü
Genel API değişiklikleri burada sürüm bazında belgelenir.
2026-05-08
v1: faturalar ve tedarikçiler için salt okunur endpoint’ler, müşteri hesabı kapsamlı API anahtarları ve imzalı webhook’lar.
v1’de yok
Aşağıdaki özellikler v1 kapsamı dışında bilinçli olarak tutuldu:
- Yazma endpoint’leri (POST/PATCH/DELETE)
- Mali müşavirin müşteri hesapları arası erişimi (gerçek partner talebi oluşunca v2 için planlanır)
- Kullanım bazlı faturalama (barındırılan MCP ticari paketiyle birlikte gelir)
- Ayrı sandbox ortamı (eri_test_ öneki rezerve edildi)