Det offentlige 4invoices API sender faktureringsdata fra dit system til 4invoices og fører fakturaen hele vejen igennem det nationale e-fakturasystem (i Rumænien: ANAF's SPV). Én produktionsvært, ét client_credentials-flow, idempotente fiskale skrivninger og én fejlkuvert på alle ruter.
https://api.4invoices.net/v1 · OpenAPI-specifikation (ingen nøgle nødvendig)
Hvad 4invoices API'et er
- Det offentlige 4invoices API er REST over HTTPS, med JSON ind og JSON ud.
- Én produktionsvært: https://api.4invoices.net/v1. Der findes ingen separat sandbox-vært.
- OpenAPI 3.1-specifikationen er offentlig og kræver ingen nøgle — importér den direkte i Postman eller en klientgenerator.
- Hvert svar bærer en X-Request-Id-header; angiv den, når du beder om support.
- Alle fiskale skrivninger er idempotente: et nyt forsøg efter timeout udsteder aldrig et andet dokument.
- Hele ANAF e-Factura-forløbet (Rumænien) over API'et: forhåndskontrol, indsendelse, opfølgning, signeret svar og den indgående indbakke. Ingen rumænsk konkurrent eksponerer dette.
- SmartBill har intet endpoint til indsendelse i det nationale e-fakturasystem (ANAF, i Rumænien) — afsendelse er kun en kontoindstilling i brugerfladen — og slet intet endpoint til at liste fakturaer.
- Oblio kan kun oprette kunder og produkter som en bivirkning af at udstede et dokument, ikke som førsteklasses ressourcer.
- UBL-XML-generering (CIUS-RO for Rumænien) uden indsendelse: du får det juridiske dokument som en fil, uden at røre det nationale e-fakturasystem.
- Idempotens på fiskale skrivninger: et nyt forsøg efter timeout producerer ikke en ekstra faktura og forbruger ikke et ekstra nummer.
- En programmatisk læsbar indbakke med leverandørfakturaer — grundlaget for automatiseret afstemning.
Din første faktura i 6 trin
- Opret legitimationsoplysninger i panelet under Fakturering → Indstillinger → API-adgang, og kopiér client_secret — det vises kun én gang.
- Udfyld virksomhedsprofilen og aktivér mindst én serie af typen fiscale, ellers returnerer udstedelse issuer_profile_incomplete eller no_series_configured.
- Opret legitimationsoplysninger i panelet under Fakturering → Indstillinger → API-adgang, og kopiér client_secret — det vises kun én gang.
- Udfyld virksomhedsprofilen og aktivér mindst én serie af typen fiscale, ellers returnerer udstedelse issuer_profile_incomplete eller no_series_configured.
- Byt legitimationsoplysningerne til et token: POST /v1/auth/token med grant_type client_credentials. Tokenet varer én time — gem det i cache, og udsted ikke et nyt pr. anmodning.
- Udsted fakturaen: POST /v1/invoices med en Idempotency-Key-header og vat_rate som procent (21, ikke 0.21).
- Kør forhåndskontrollen (CIUS-RO for Rumænien) med POST /v1/invoices/{id}/efactura/validate, og send derefter fakturaen til det nationale e-fakturasystem med POST /v1/invoices/{id}/efactura/submit.
- Følg status med GET /v1/efactura/submissions/{id}, indtil den når accepted eller rejected.
bash
# 1 — token (1 time, gem i cache)
ACCESS_TOKEN=$(curl -sS -X POST https://api.4invoices.net/v1/auth/token \
-H 'Content-Type: application/json' \
-d '{"grant_type":"client_credentials","client_id":"cli_XXX","client_secret":"sec_XXX"}' \
| python3 -c 'import sys,json; print(json.load(sys.stdin)["access_token"])')
# 2 — udsted fakturaen (Idempotency-Key er PÅKRÆVET)
curl -sS -X POST https://api.4invoices.net/v1/invoices \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: order-10457-invoice' \
-d '{"buyer":{"name":"Exemplu Comert SRL","tax_id":"RO12345678","county":"Cluj","city":"Cluj-Napoca","country":"RO"},
"lines":[{"description":"Abonament SaaS","quantity":1,"unit_price":400,"vat_rate":21}]}'
# 3 — preflight CIUS-RO, then send to ANAF
curl -sS -X POST https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/validate \
-H "Authorization: Bearer $ACCESS_TOKEN"
curl -sS -X POST https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/submit \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Idempotency-Key: efactura-inv_01J7ABC-1'javascript
const BASE = "https://api.4invoices.net/v1";
const token = await fetch(`${BASE}/auth/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
grant_type: "client_credentials",
client_id: process.env.FOURINVOICES_CLIENT_ID,
client_secret: process.env.FOURINVOICES_CLIENT_SECRET,
}),
}).then((r) => r.json()).then((d) => d.access_token);
const invoice = await fetch(`${BASE}/invoices`, {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
"Idempotency-Key": `order-${orderId}-invoice`,
},
body: JSON.stringify({
buyer: { name: "Exemplu Comert SRL", tax_id: "RO12345678", county: "Cluj", city: "Cluj-Napoca", country: "RO" },
lines: [{ description: "Abonament SaaS", quantity: 1, unit_price: 400, vat_rate: 21 }],
currency: "RON",
metadata: { order_id: String(orderId) },
}),
}).then((r) => r.json());
console.log(invoice.number, invoice.totals); // "FCT-000123" { net, vat, gross }python
import os, uuid, requests
BASE = "https://api.4invoices.net/v1"
token = requests.post(f"{BASE}/auth/token", json={
"grant_type": "client_credentials",
"client_id": os.environ["FOURINVOICES_CLIENT_ID"],
"client_secret": os.environ["FOURINVOICES_CLIENT_SECRET"],
}, timeout=30).json()["access_token"]
headers = {
"Authorization": f"Bearer {token}",
# Én nøgle pr. LOGISK operation — genbrug den ved nyt forsøg, generér aldrig en ny.
"Idempotency-Key": f"order-{order_id}-invoice",
}
invoice = requests.post(f"{BASE}/invoices", headers=headers, json={
"buyer": {"name": "Exemplu Comert SRL", "tax_id": "RO12345678",
"county": "Cluj", "city": "Cluj-Napoca", "country": "RO"},
"lines": [{"description": "Abonament SaaS", "quantity": 1,
"unit_price": 400, "vat_rate": 21}], # procent, ikke 0.21
"currency": "RON",
}, timeout=60).json()
print(invoice["number"], invoice["totals"])Godkendelse
- Flowet er client_credentials: du bytter client_id + client_secret til et Bearer access_token.
- Tokenet udløber efter 3600 sekunder. Forny det før udløb, ikke ved hvert kald — POST /auth/token har sin egen hastighedsgrænse pr. IP.
- client_secret gemmes kun som hash og kan ikke genskabes. Mister du det, opretter du nye legitimationsoplysninger og tilbagekalder de gamle.
- Kun server-til-server. Ingen browser-origin tillades via CORS: fra sidens JavaScript ville secret lække til den besøgende.
- Scopes tildeles pr. legitimationsoplysning. Opret separate legitimationsoplysninger til hvert system, og giv hver især det mindste sæt scopes, den har brug for.
Fakturering → Indstillinger → API-adgang
bash
curl -sS -X POST https://api.4invoices.net/v1/auth/token \
-H 'Content-Type: application/json' \
-d '{
"grant_type": "client_credentials",
"client_id": "cli_XXXXXXXXXXXX",
"client_secret": "sec_XXXXXXXXXXXXXXXXXXXX"
}'
# → {"access_token":"eyJ...","token_type":"Bearer","expires_in":3600,
# "scope":"invoices:read invoices:write efactura:submit"}javascript
// Gem tokenet i cache; udsted ikke et nyt pr. anmodning.
let cached = { token: "", expiresAt: 0 };
async function getToken() {
if (cached.token && Date.now() < cached.expiresAt - 60_000) return cached.token;
const res = await fetch("https://api.4invoices.net/v1/auth/token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
grant_type: "client_credentials",
client_id: process.env.FOURINVOICES_CLIENT_ID,
client_secret: process.env.FOURINVOICES_CLIENT_SECRET,
}),
});
if (!res.ok) throw new Error(`token ${res.status}`);
const data = await res.json();
cached = { token: data.access_token, expiresAt: Date.now() + data.expires_in * 1000 };
return cached.token;
}Momssatser er procenter
vat_rate: 21 ✓ · vat_rate: 0.19 ✗ · vat_rate: 1 ✗- vat_rate er en PROCENT: 21 betyder 21 %.
- Værdier i (0, 1] afvises — 0,19 er en brøkdel, og 1 er tvetydig mellem 1 % og 100 %.
- 0 er gyldigt og betyder momsfritaget eller omvendt betalingspligt; skriv den lovmæssige angivelse i notes.
- unit_price er den NETTO enhedspris, når udstederen er momspligtig.
- Har du brug for totalerne, før du gennemfører? POST /v1/invoices/preview-totals kører den samme beregning uden at forbruge et fiskalt nummer.
Idempotens på fiskale skrivninger
- Headeren Idempotency-Key er PÅKRÆVET på POST /invoices, POST /invoices/{id}/storno og POST /invoices/{id}/efactura/submit.
- Nøgler huskes i 24 timer. Gentagelse af samme nøgle med samme krop returnerer det oprindelige resultat og sætter Idempotency-Replayed: true.
- Samme nøgle med en anden krop returnerer 409 idempotency_key_reuse — et allerede udstedt fiskalt dokument overskrives aldrig.
- Én nøgle pr. LOGISK operation, ikke pr. HTTP-forsøg: order-10457-invoice, ikke en ny UUID ved hvert nyt forsøg.
- Begrundelsen er juridisk, ikke teknisk: et forbrugt fiskalt nummer og en faktura indsendt i det nationale e-fakturasystem (i Rumænien: SPV) kan ikke trækkes tilbage.
bash
curl -sS -X POST https://api.4invoices.net/v1/invoices \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: order-10457-invoice' \
-d '{
"buyer": {
"name": "Exemplu Comert SRL",
"tax_id": "RO12345678",
"address": "Str. Fabricii 12",
"city": "Cluj-Napoca",
"county": "Cluj",
"country": "RO",
"email": "[email protected]"
},
"lines": [
{ "description": "Abonament SaaS, iulie", "quantity": 1, "unit_price": 400, "vat_rate": 21, "unit": "buc" },
{ "description": "Implementare", "quantity": 6, "unit_price": 250, "vat_rate": 21, "unit": "ora" }
],
"currency": "RON",
"document_kind": "factura",
"due_date": "2026-08-15",
"metadata": { "order_id": "10457" }
}'Alle endpoints
| Metode | Endpoint | Scope | Idempotency-Key | Anmodninger / minut |
|---|---|---|---|---|
| POST | /auth/token Byt legitimationsoplysninger til et adgangstoken | — | — | 120 |
| GET | /me Tenant, scopes og aktuelle grænser | invoices:read | — | 120 |
| POST | /invoices Udsted en faktura eller proformafaktura | invoices:write | påkrævet | 30 |
| GET | /invoices List fakturaer (cursor-paginering) | invoices:read | — | 120 |
| POST | /invoices/preview-totals Beregn totaler uden at oprette noget | invoices:read | — | 120 |
| GET | /invoices/{invoice_id} Hent én faktura | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/pdf Download fakturaens PDF | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/xml Download UBL-XML (CIUS-RO for Rumænien) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/storno Udsted en kreditnota, der annullerer denne faktura | invoices:write | påkrævet | 30 |
| POST | /invoices/{invoice_id}/payments Markér fakturaen som betalt | invoices:write | — | 30 |
| DELETE | /invoices/{invoice_id}/payments Markér fakturaen som ubetalt | invoices:write | — | 30 |
| GET | /clients List kunder | clients:read | — | 120 |
| POST | /clients Opret eller opdatér en kunde | clients:write | — | 30 |
| GET | /lookup/company/{tax_id} Validér et CUI mod ANAF-registret (Rumænien) | clients:read | — | 120 |
| GET | /series List nummerserier | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Forhåndskontrol (CIUS-RO for Rumænien) — validér uden at sende | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Indsend fakturaen til det nationale e-fakturasystem (i Rumænien: SPV) | efactura:submit | påkrævet | 10 |
| GET | /efactura/submissions List indsendelser til det nationale e-fakturasystem | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Hent én indsendelse | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Spørg det nationale e-fakturasystem om den aktuelle status | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Download arkivet med det signerede svar | efactura:read | — | 120 |
| GET | /efactura/inbox Leverandørfakturaer modtaget via det nationale e-fakturasystem | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Hent én indgående faktura | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Download arkivet for den indgående faktura | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Hent nye beskeder fra det nationale e-fakturasystem til indbakken | efactura:read | — | 10 |
25 endpoints · https://api.4invoices.net/v1/openapi.json
Scopes
- invoices:read
- invoices:write
- clients:read
- clients:write
- efactura:read
- efactura:submit
Forløbet med det nationale e-fakturasystem
- Den reelle forskel: hele forløbet med det nationale e-fakturasystem (i Rumænien: ANAF e-Factura) kører via API'et, ikke kun dokumentgenerering.
- POST /invoices/{id}/efactura/validate kører forhåndskontrollen (CIUS-RO for Rumænien) og returnerer de præcise felter, det nationale e-fakturasystem ville afvise, uden at sende noget.
- GET /invoices/{id}/xml genererer UBL-XML (CIUS-RO for Rumænien) uden indsendelse — nyttigt til dit eget arkiv eller en intern revision.
- POST /invoices/{id}/efactura/submit indsender den i det nationale e-fakturasystem (i Rumænien: SPV). Det kan ikke gøres om: en anden kopi af samme faktura kan ikke trækkes tilbage fra systemet.
- Livscyklussen er normaliseret: not_sent → validating → queued → sent → processing → accepted | rejected | error. accepted betyder lovligt transmitteret; error er en transportfejl på vores side, og den er sikker at forsøge igen.
- GET /efactura/submissions/{id}/download henter arkivet med det nationale e-fakturasystems signerede svar (i Rumænien: ANAF).
- Den indgående side findes også: POST /efactura/inbox/sync henter nye beskeder fra det nationale e-fakturasystem (i Rumænien: SPV), og GET /efactura/inbox lister de fakturaer, dine leverandører har sendt dig.
bash
# CIUS-RO preflight. Sends NOTHING to ANAF.
curl -sS -X POST "https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/validate?include_xml=true" \
-H "Authorization: Bearer $ACCESS_TOKEN"
# → {"invoice_id":"inv_01J7ABC","valid":false,
# "errors":["buyer.county is required for RO buyers"],
# "xml_base64":"PD94bWwg..."}bash
curl -sS -X POST https://api.4invoices.net/v1/invoices/inv_01J7ABC/efactura/submit \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Idempotency-Key: efactura-inv_01J7ABC-1'
# → {"submission_id":"sub_01J7XYZ","status":"queued"}python
import time, requests
BASE = "https://api.4invoices.net/v1"
TERMINAL = {"accepted", "rejected"}
H = {"Authorization": f"Bearer {token}"}
def wait_for_anaf(submission_id, timeout=900):
deadline = time.time() + timeout
delay = 15
while time.time() < deadline:
r = requests.get(f"{BASE}/efactura/submissions/{submission_id}", headers=H, timeout=30)
r.raise_for_status()
status = r.json()["status"]
if status in TERMINAL:
return r.json()
# /refresh asks ANAF directly and shares the 10/min submit bucket.
requests.post(f"{BASE}/efactura/submissions/{submission_id}/refresh", headers=H, timeout=30)
time.sleep(delay)
delay = min(delay * 2, 120)
raise TimeoutError(submission_id)Fejl
- Hver 4xx- og 5xx-fejl bruger samme kuvert: { "error": { type, code, message, param?, doc_url, request_id, errors? } }.
- type er den grove klasse, du forgrener på ("kan jeg forsøge igen?"), og code er den stabile årsag, du mapper ind i dit eget system.
- param er den punkterede sti til det fejlende felt, for eksempel lines.0.vat_rate.
- errors[] optræder, når en enkelt anmodning har problemer i mere end ét felt.
- request_id logges på vores side. Angiv den i enhver supportsag — den peger på den præcise anmodning.
- Et 404 returneres også for et id, der tilhører en anden tenant: vi bekræfter aldrig, at en andens data findes.
json
{
"error": {
"type": "invalid_request_error",
"code": "validation_failed",
"message": "Datele trimise nu sunt valide.",
"param": "lines.0.vat_rate",
"doc_url": "https://4invoices.net/ro/api-dezvoltatori#errors",
"request_id": "req_8a893f2f33d4472da8d6e144",
"errors": [
{ "param": "lines.0.vat_rate", "message": "VAT rate must be a percent (21), not a fraction", "type": "value_error" }
]
}
}| Status | Type | Kode |
|---|---|---|
| 401 | authentication_error | missing_bearer_token |
| 401 | authentication_error | invalid_client |
| 401 | authentication_error | token_expired |
| 401 | authentication_error | invalid_token |
| 401 | authentication_error | unauthorized |
| 403 | permission_error | insufficient_scope |
| 403 | permission_error | forbidden |
| 404 | not_found_error | not_found |
| 409 | conflict_error | idempotency_key_reuse |
| 409 | conflict_error | idempotency_in_progress |
| 409 | conflict_error | no_series_configured |
| 422 | invalid_request_error | validation_failed |
| 422 | invalid_request_error | issuer_profile_incomplete |
| 422 | invalid_request_error | cius_ro_incomplete |
| 422 | invalid_request_error | cannot_storno_draft |
| 422 | invalid_request_error | nothing_to_storno |
| 422 | invalid_request_error | invalid_json_number |
| 429 | rate_limit_error | rate_limit_exceeded |
| 502 | upstream_error | upstream_error |
| 503 | service_unavailable_error | service_unavailable |
Hastighedsgrænser
| Kvotegruppe | Anmodninger / minut | Betydning |
|---|---|---|
| read | 120 | GET *, POST /invoices/preview-totals, POST /invoices/{id}/efactura/validate |
| write | 30 | POST /invoices, POST /invoices/{id}/storno, POST|DELETE /invoices/{id}/payments, POST /clients |
| submit | 10 | POST /invoices/{id}/efactura/submit, POST /efactura/submissions/{id}/refresh, POST /efactura/inbox/sync |
- Grænserne gælder pr. legitimationsoplysning, pr. minut: 120 for læsninger, 30 for skrivninger og 10 for operationerne mod det nationale e-fakturasystem (submit, refresh, inbox/sync).
- X-RateLimit-Limit, X-RateLimit-Remaining og X-RateLimit-Reset optræder på ALLE svar, inklusive 429.
- Et 429 bærer også Retry-After i sekunder. Respektér det; forsøg ikke igen i en stram løkke.
- Kvoten på 10 pr. minut findes, fordi ANAF i Rumænien selv tillader cirka ét kald til beskedlisten pr. minut pr. CIF.
- Sæt /efactura/inbox/sync på en cron-job, ikke på aggressiv polling.
- Har du brug for højere lofter? Spørg via Kontakt med dit forventede daglige volumen.
X-RateLimit-Limit · X-RateLimit-Remaining · X-RateLimit-Reset · Retry-After
http
HTTP/2 429
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1785312000
Retry-After: 17
Content-Type: application/json
{"error":{"type":"rate_limit_error","code":"rate_limit_exceeded",
"message":"...","doc_url":"https://4invoices.net/ro/api-dezvoltatori#errors",
"request_id":"req_..."}}javascript
// Respektér Retry-After; forsøg aldrig igen ved en 4xx andet end 429.
async function call(url, init, attempt = 0) {
const res = await fetch(url, init);
if (res.status === 429 || res.status >= 500) {
if (attempt >= 5) return res;
const retryAfter = Number(res.headers.get("Retry-After")) || 2 ** attempt;
await new Promise((r) => setTimeout(r, retryAfter * 1000));
return call(url, init, attempt + 1);
}
return res;
}
// Et nyt forsøg af en skrivning SKAL genbruge DEN SAMME Idempotency-Key, ellers udsteder du
// et andet fiskalt dokument.Guides efter emne
Hvert emne har sin egen side med de relevante endpoints, eksempler og fejl.
- Godkendelse i 4invoices APIByt client_id og client_secret til et Bearer-token, der er gyldigt i én time, kun server-til-server.
- Udstedelse af fakturaer via APIPOST /invoices med en Idempotency-Key, moms som procenter, plus opslag, storno og markering som betalt.
- Kunder og opslag i ANAF-registret (Rumænien)En indsættelse eller opdatering deduplikeret på tax_id plus et opslag i ANAF-registret (Rumænien), så e-fakturaen ikke afvises.
- National e-fakturering via APIForhåndskontrol (CIUS-RO for Rumænien), indsendelse i det nationale e-fakturasystem, normaliseret status, signeret svar og den indgående leverandørindbakke.
- Nummerserier i API'etUden en aktiv serie af typen fiscale returnerer udstedelse 409 no_series_configured.
- Fejlkoder og fejlkuvertenÉn form på alle ruter: type, code, message, param, doc_url, request_id og errors.
- Hastighedsgrænser og nye forsøg120 læsninger, 30 skrivninger og 10 operationer mod det nationale e-fakturasystem pr. minut pr. legitimationsoplysning, med X-RateLimit-*-headere.
Almindelige fejl
- Sender moms som brøkdel (0.19) eller som 1. Begge afvises; send 19 eller 21.
- Udsteder et token pr. anmodning. Tokenet holder en time; gem det i cache, ellers rammer du token-endpointets grænse pr. IP.
- Genererer en ny idempotensnøgle ved hvert nyt forsøg — præcis det scenarie, der giver dublerede fakturaer.
- Kalder fra browser-JavaScript. CORS blokerer alle origins, og secret ville alligevel blive eksponeret.
- Indsender i det nationale e-fakturasystem uden forhåndskontrol (CIUS-RO for Rumænien). En forkert indsendelse kan ikke trækkes tilbage.
- Poller /efactura/submissions/{id}/refresh mere end 10 gange i minuttet — den kvote deles med submit.
- Udsteder, før virksomhedsprofilen er komplet, og før der findes en aktiv fiskal serie.
Spørgsmål og svar for udviklere
Hvordan får jeg API-legitimationsoplysninger til 4invoices?
I panelet under Fakturering → Indstillinger → API-adgang. Du får et client_id og et client_secret; secret vises kun én gang og gemmes kun som hash.
Hvor længe er access_token gyldigt?
3600 sekunder, altså én time. Gem det i cache og forny det før udløb — token-endpointet har sin egen hastighedsgrænse pr. IP.
Hvordan sender jeg momssatsen?
Som procent: 21 for 21 %. Værdier i (0, 1] afvises, så både 0,19 og 1 fejler validering.
Hvilke kald kræver en Idempotency-Key?
POST /invoices, POST /invoices/{id}/storno og POST /invoices/{id}/efactura/submit. Nøgler huskes i 24 timer, og en genafspilning returnerer det oprindelige dokument med Idempotency-Replayed: true.
Kan jeg indsende en faktura til det nationale e-fakturasystem direkte fra API'et?
Ja. Kør forhåndskontrollen (CIUS-RO for Rumænien) med /efactura/validate, indsend med /efactura/submit, følg den normaliserede status på /efactura/submissions/{id} og download systemets signerede svar (i Rumænien: ANAF).
Hvad er hastighedsgrænserne?
Pr. legitimationsoplysning, pr. minut: 120 læsninger, 30 skrivninger og 10 operationer mod det nationale e-fakturasystem. Hvert svar bærer X-RateLimit-*-headere, og et 429 tilføjer Retry-After.
Kan jeg kalde API'et fra mit frontend?
Nej. Det er kun server-til-server: ingen browser-origin passerer CORS, og et client_secret hører ikke hjemme i kode, som når de besøgende.
Hvorfor får jeg issuer_profile_incomplete på min første faktura?
Virksomhedsprofilen er ufuldstændig, eller der findes ingen aktiv serie af typen fiscale. Udfyld begge i panelet; API'et nægter at udstede et ugyldigt fiskalt dokument.