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.

curl
# 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+ (fetch)
// 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.

GET/api/public/v1/invoicesINVOICES

List invoices

Returns mandant-scoped invoices in receipt order (newest first). Cursor-paginated.

ParamInTypeNotes
cursorquerystringOpaque cursor from a previous response's `next_cursor`.
limitqueryinteger
statusqueryvalid | invalid | pdf_only
workflow_statusquerynew | reviewed | approved | paused | rejected | in_progress | exported | paid
supplier_idquerystring<uuid>
fromquerystring<date-time>
toquerystring<date-time>
has_iban_changequerybooleanFilter to invoices with a flagged IBAN change.

200OK

POST/api/public/v1/invoicesINVOICES

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

ParamInTypeNotes
Idempotency-Key*headerstringStable 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.

200OK

GET/api/public/v1/invoices/{id}INVOICES

Get a single invoice

ParamInTypeNotes
id*pathstring<uuid>
includequerystringComma-separated extras. `pdf_url` adds a 5-minute signed PDF URL.

200OK

PATCH/api/public/v1/invoices/{id}INVOICES

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

ParamInTypeNotes
id*pathstring<uuid>
Idempotency-Key*headerstringStable 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.

200Updated invoice.

POST/api/public/v1/mcpMCP

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

200JSON-RPC result for `tools/list` or `tools/call`.

GET/api/public/v1/suppliersSUPPLIERS

List suppliers

Returns mandant-scoped suppliers in name-ascending order. Cursor-paginated.

ParamInTypeNotes
cursorquerystring
limitqueryinteger
has_open_invoicesqueryboolean
vat_idquerystring

200OK

Kod örnekleri

Faturaları listelemek için en basit çağrılar:

Python
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"])
curl (upload with idempotency)
# 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"
curl (workflow decision)
# 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.created
  • invoice.validated
  • invoice.flagged
  • invoice.workflow_status_changed
  • invoice.exported
  • supplier.created
  • supplier.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.

invoice.created
{
  "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"
  }
}
supplier.iban_changed
{
  "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):

JavaScript / Node
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'),
  );
}
Python
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 / saatWebhook abonelik limiti
Starter305001
Standard6010003
Premium120300010
Platinum3001000025
Kanzlei3001000025

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.

HTTPKodAçıklama
400INVALID_INPUTParametreler veya JSON gövdesi geçersiz.
401AUTH_UNAUTHORIZEDAPI anahtarı eksik, geçersiz veya iptal edilmiş.
403AUTH_FORBIDDENAPI anahtarı bu kaynak için gerekli izne sahip değil.
404NOT_FOUNDKaynak mevcut müşteri hesabında yok veya görünür değil.
429rate_limit_exceededPakete duyarlı hız limiti aşıldı. Kısa bir beklemeden sonra tekrar deneyin.
503rate_limit_backend_unavailableHı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)

Bu web sitesi deneyiminizi geliştirmek ve trafiği analiz etmek için çerez kullanır. Kategorileri istediğiniz zaman tek tek reddedebilirsiniz. Gizlilik Politikası