4invoices publika API skickar faktureringsdata från ditt system till 4invoices och för fakturan hela vägen genom det nationella e-fakturasystemet (i Rumänien: ANAF:s SPV). En produktionsvärd, ett client_credentials-flöde, idempotenta fiskala skrivningar och ett enhetligt felformat på varje endpoint.
https://api.4invoices.net/v1 · OpenAPI-specifikation (ingen nyckel behövs)
Vad 4invoices API är
- 4invoices publika API är REST över HTTPS, med JSON in och JSON ut.
- En produktionsvärd: https://api.4invoices.net/v1. Det finns ingen separat sandbox-värd.
- OpenAPI 3.1-specifikationen är publik och kräver ingen nyckel — importera den direkt i Postman eller en klientgenerator.
- Varje svar bär en X-Request-Id-header; ange den när du begär support.
- Varje fiskal skrivning är idempotent: ett återförsök efter timeout utfärdar aldrig ett andra dokument.
- Hela ANAF e-Factura-flödet (Rumänien) över API:t: förhandskontroll, inlämning, uppföljning, signerat svar och den inkommande inkorgen. Ingen rumänsk konkurrent exponerar detta.
- SmartBill har ingen endpoint för inlämning i det nationella e-fakturasystemet (ANAF, i Rumänien) — sändningen är en enbart UI-kontoinställning — och över huvud taget ingen endpoint för att lista fakturor.
- Oblio kan skapa kunder och produkter endast som en bieffekt av att utfärda ett dokument, inte som förstklassiga resurser.
- UBL-XML-generering (CIUS-RO för Rumänien) utan inlämning: du får det juridiska dokumentet som fil utan att röra det nationella e-fakturasystemet.
- Idempotens på fiskala skrivningar: ett återförsök efter timeout skapar inte en andra faktura och förbrukar inte ett andra nummer.
- En programmatiskt läsbar inkorg med leverantörsfakturor — grunden för automatiserad avstämning.
Din första faktura i 6 steg
- Skapa inloggningsuppgifter i panelen under Fakturering → Inställningar → API-åtkomst och kopiera client_secret — det visas bara en gång.
- Fyll i företagsprofilen och aktivera minst en serie av typen fiscale, annars returnerar utfärdandet issuer_profile_incomplete eller no_series_configured.
- Skapa inloggningsuppgifter i panelen under Fakturering → Inställningar → API-åtkomst och kopiera client_secret — det visas bara en gång.
- Fyll i företagsprofilen och aktivera minst en serie av typen fiscale, annars returnerar utfärdandet issuer_profile_incomplete eller no_series_configured.
- Byt inloggningsuppgifterna mot en token: POST /v1/auth/token med grant_type client_credentials. Token gäller en timme — cacha den och skapa inte en ny per anrop.
- Utfärda fakturan: POST /v1/invoices med en Idempotency-Key-header och vat_rate som procent (21, inte 0.21).
- Kör förhandskontrollen (CIUS-RO för Rumänien) med POST /v1/invoices/{id}/efactura/validate och skicka sedan till det nationella e-fakturasystemet med POST /v1/invoices/{id}/efactura/submit.
- Följ statusen med GET /v1/efactura/submissions/{id} tills den når accepted eller rejected.
bash
# 1 — token (1 timme, cacha den)
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 — utfärda fakturan (Idempotency-Key krävs)
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}",
# En nyckel per LOGISK operation — återanvänd den vid återförsök, generera 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, inte 0.21
"currency": "RON",
}, timeout=60).json()
print(invoice["number"], invoice["totals"])Autentisering
- Flödet är client_credentials: du byter client_id + client_secret mot en Bearer access_token.
- Token går ut efter 3600 sekunder. Förnya den före utgång, inte vid varje anrop — POST /auth/token har en egen hastighetsgräns per IP.
- client_secret lagras endast som hash och kan inte återställas. Förlorar du den skapar du nya inloggningsuppgifter och återkallar de gamla.
- Enbart server-till-server. Inget webbläsarursprung släpps igenom av CORS: från sidans JavaScript skulle secret läcka till besökaren.
- Scopes beviljas per uppgift. Skapa separata uppgifter för varje system och ge var och en minsta nödvändiga scopes.
Fakturering → Inställningar → API-åtkomst
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
// Cacha token; skapa inte en ny per anrop.
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 är procent
vat_rate: 21 ✓ · vat_rate: 0.19 ✗ · vat_rate: 1 ✗- vat_rate är en PROCENT: 21 betyder 21 %.
- Värden i (0, 1] avvisas — 0,19 är en bråkdel, och 1 är tvetydigt mellan 1 % och 100 %.
- 0 är giltigt och betyder momsfritt eller omvänd skattskyldighet; skriv den lagstadgade texten i notes.
- unit_price är det NETTO styckpriset när utfärdaren är momspliktig.
- Behöver du summorna innan du genomför? POST /v1/invoices/preview-totals kör samma beräkning utan att förbruka ett fiskalt nummer.
Idempotens för fiskala skrivningar
- Headern Idempotency-Key krävs på POST /invoices, POST /invoices/{id}/storno och POST /invoices/{id}/efactura/submit.
- Nycklar kommer ihåg i 24 timmar. Att upprepa samma nyckel med samma innehåll returnerar det ursprungliga resultatet och sätter Idempotency-Replayed: true.
- Samma nyckel med ett annat innehåll returnerar 409 idempotency_key_reuse — ett redan utfärdat fiskalt dokument skrivs aldrig över.
- En nyckel per LOGISK operation, inte per HTTP-försök: order-10457-invoice, inte ett nytt UUID vid varje återförsök.
- Skälet är juridiskt, inte tekniskt: ett förbrukat fiskalt nummer och en faktura inlämnad i det nationella e-fakturasystemet (i Rumänien: SPV) kan inte dras tillbaka.
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" }
}'Alla endpoints
| Metod | Endpoint | Scope | Idempotency-Key | Förfrågningar / minut |
|---|---|---|---|---|
| POST | /auth/token Byt inloggningsuppgifter mot en åtkomsttoken | — | — | 120 |
| GET | /me Tenant, scopes och aktuella gränser | invoices:read | — | 120 |
| POST | /invoices Utfärda en faktura eller proformafaktura | invoices:write | krävs | 30 |
| GET | /invoices Lista fakturor (cursorpaginering) | invoices:read | — | 120 |
| POST | /invoices/preview-totals Beräkna summor utan att skapa något | invoices:read | — | 120 |
| GET | /invoices/{invoice_id} Hämta en faktura | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/pdf Ladda ned fakturans PDF | invoices:read | — | 120 |
| GET | /invoices/{invoice_id}/xml Ladda ned UBL-XML (CIUS-RO för Rumänien) | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/storno Utfärda en kreditfaktura som makulerar denna faktura | invoices:write | krävs | 30 |
| POST | /invoices/{invoice_id}/payments Markera fakturan som betald | invoices:write | — | 30 |
| DELETE | /invoices/{invoice_id}/payments Markera fakturan som obetald | invoices:write | — | 30 |
| GET | /clients Lista kunder | clients:read | — | 120 |
| POST | /clients Skapa eller uppdatera en kund | clients:write | — | 30 |
| GET | /lookup/company/{tax_id} Validera ett CUI mot ANAF-registret (Rumänien) | clients:read | — | 120 |
| GET | /series Lista nummerserier | invoices:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/validate Förhandskontroll (CIUS-RO för Rumänien) — validera utan att skicka | efactura:read | — | 120 |
| POST | /invoices/{invoice_id}/efactura/submit Lämna in fakturan till det nationella e-fakturasystemet (i Rumänien: SPV) | efactura:submit | krävs | 10 |
| GET | /efactura/submissions Lista inlämningar till det nationella e-fakturasystemet | efactura:read | — | 120 |
| GET | /efactura/submissions/{submission_id} Hämta en inlämning | efactura:read | — | 120 |
| POST | /efactura/submissions/{submission_id}/refresh Fråga det nationella e-fakturasystemet om det aktuella läget | efactura:read | — | 10 |
| GET | /efactura/submissions/{submission_id}/download Ladda ned arkivet med det signerade svaret | efactura:read | — | 120 |
| GET | /efactura/inbox Leverantörsfakturor mottagna via det nationella e-fakturasystemet | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id} Hämta en inkommande faktura | efactura:read | — | 120 |
| GET | /efactura/inbox/{inbound_id}/download Ladda ned arkivet för den inkommande fakturan | efactura:read | — | 120 |
| POST | /efactura/inbox/sync Hämta nya meddelanden från det nationella e-fakturasystemet till inkorgen | 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
Flödet mot det nationella e-fakturasystemet
- Den verkliga skillnaden: hela flödet mot det nationella e-fakturasystemet (i Rumänien: ANAF e-Factura) körs via API:t, inte bara dokumentgenerering.
- POST /invoices/{id}/efactura/validate kör förhandskontrollen (CIUS-RO för Rumänien) och returnerar de exakta fält det nationella e-fakturasystemet skulle avvisa, utan att skicka något.
- GET /invoices/{id}/xml genererar UBL-XML (CIUS-RO för Rumänien) utan inlämning — användbart för ditt eget arkiv eller en intern granskning.
- POST /invoices/{id}/efactura/submit lämnar in den i det nationella e-fakturasystemet (i Rumänien: SPV). Det är oåterkalleligt: en andra kopia av samma faktura kan inte dras tillbaka från systemet.
- Livscykeln är normaliserad: not_sent → validating → queued → sent → processing → accepted | rejected | error. accepted betyder lagligen överförd; error är ett transportfel på vår sida och det är säkert att försöka igen.
- GET /efactura/submissions/{id}/download hämtar arkivet med det nationella e-fakturasystemets signerade svar (i Rumänien: ANAF).
- Det finns även den inkommande sidan: POST /efactura/inbox/sync hämtar nya meddelanden från det nationella e-fakturasystemet (i Rumänien: SPV), och GET /efactura/inbox listar de fakturor dina leverantörer har skickat till 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)Fel
- Varje 4xx- och 5xx-fel använder samma kuvert: { "error": { type, code, message, param?, doc_url, request_id, errors? } }.
- type är den grova klassen du förgrenar på ("kan jag försöka igen?"), och code är den stabila orsaken du mappar in i ditt eget system.
- param är den punktseparerade sökvägen till det felaktiga fältet, till exempel lines.0.vat_rate.
- errors[] visas när ett enda anrop har problem i fler än ett fält.
- request_id loggas på vår sida. Ange den i varje supportärende — den pekar ut exakt vilket anrop det gäller.
- Ett 404 returneras även för ett id som tillhör en annan tenant: vi bekräftar aldrig att någon annans data finns.
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 | Typ | Kod |
|---|---|---|
| 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 |
Hastighetsgränser
| Gruppgräns | Förfrågningar / minut | Betydelse |
|---|---|---|
| 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änserna gäller per uppgift, per minut: 120 för läsningar, 30 för skrivningar och 10 för operationerna mot det nationella e-fakturasystemet (submit, refresh, inbox/sync).
- X-RateLimit-Limit, X-RateLimit-Remaining och X-RateLimit-Reset finns på VARJE svar, inklusive 429.
- Ett 429 bär också Retry-After i sekunder. Respektera det; försök inte igen i en tät loop.
- Gruppen på 10/min finns för att ANAF i Rumänien själv tillåter ungefär ett anrop för meddelandelistan per minut per CIF.
- Lägg /efactura/inbox/sync i en cron, inte i aggressiv polling.
- Behöver du högre tak? Fråga via Kontakt med din förväntade dagliga volym.
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
// Respektera Retry-After; försök aldrig igen vid ett 4xx annat än 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;
}
// Ett återförsök av en skrivning MÅSTE använda SAMMA Idempotency-Key, annars utfärdar du
// ett andra fiskalt dokument.Guider efter ämne
Varje ämne har en egen sida med relevanta endpoints, exempel och fel.
- Autentisering i 4invoices APIByt client_id och client_secret mot en Bearer-token som gäller en timme, enbart server-till-server.
- Att utfärda fakturor via APIPOST /invoices med en Idempotency-Key, moms som procent, plus listning, storno och markering som betald.
- Kunder och uppslag i ANAF-registret (Rumänien)En infogning eller uppdatering deduplicerad på tax_id plus ett uppslag i ANAF-registret (Rumänien), så att e-fakturan inte avvisas.
- Nationell e-fakturering via APIFörhandskontroll (CIUS-RO för Rumänien), inlämning i det nationella e-fakturasystemet, normaliserad status, signerat svar och den inkommande leverantörsinkorgen.
- Nummerserier i API:tUtan en aktiv serie av typen fiscale returnerar utfärdandet 409 no_series_configured.
- Felkoder och felkuvertetEn form på varje endpoint: type, code, message, param, doc_url, request_id och errors.
- Hastighetsgränser och återförsök120 läsningar, 30 skrivningar och 10 operationer mot det nationella e-fakturasystemet per minut per uppgift, med X-RateLimit-*-headers.
Vanliga misstag
- Att skicka moms som bråkdel (0.19) eller som 1. Båda avvisas; skicka 19 eller 21.
- Att skapa en token per anrop. Token gäller en timme; cacha den, annars träffar du token-endpointens gräns per IP.
- Att generera en ny idempotensnyckel vid varje återförsök — exakt det scenario som ger dubbletter av fakturor.
- Att anropa från webbläsarens JavaScript. CORS blockerar alla ursprung, och secret skulle ändå exponeras.
- Att lämna in i det nationella e-fakturasystemet utan förhandskontrollen (CIUS-RO för Rumänien). En felaktig inlämning kan inte dras tillbaka.
- Att polla /efactura/submissions/{id}/refresh fler än 10 gånger per minut — den gruppen delas med submit.
- Att utfärda innan företagsprofilen är komplett och en aktiv fiskal serie finns.
Frågor och svar för utvecklare
Hur får jag API-uppgifter för 4invoices?
I panelen under Fakturering → Inställningar → API-åtkomst. Du får ett client_id och ett client_secret; secret visas bara en gång och lagras endast som hash.
Hur länge är access_token giltig?
3600 sekunder, alltså en timme. Cacha den och förnya före utgång — token-endpointen har en egen hastighetsgräns per IP.
Hur skickar jag momssatsen?
Som procent: 21 för 21 %. Värden i (0, 1] avvisas, så både 0,19 och 1 misslyckas med validering.
Vilka anrop kräver en Idempotency-Key?
POST /invoices, POST /invoices/{id}/storno och POST /invoices/{id}/efactura/submit. Nycklar kommer ihåg i 24 timmar, och ett återspel returnerar det ursprungliga dokumentet med Idempotency-Replayed: true.
Kan jag skicka en faktura till det nationella e-fakturasystemet direkt från API:t?
Ja. Kör förhandskontrollen (CIUS-RO för Rumänien) med /efactura/validate, skicka med /efactura/submit, följ den normaliserade statusen på /efactura/submissions/{id} och ladda ned systemets signerade svar (i Rumänien: ANAF).
Vilka är hastighetsgränserna?
Per uppgift, per minut: 120 läsningar, 30 skrivningar och 10 operationer mot det nationella e-fakturasystemet. Varje svar bär X-RateLimit-*-rubriker, och ett 429 lägger till Retry-After.
Kan jag anropa API:t från min frontend?
Nej. Det är enbart server-till-server: inget webbläsarursprung går igenom CORS, och ett client_secret hör inte hemma i kod som når besökaren.
Varför får jag issuer_profile_incomplete på min första faktura?
Företagsprofilen är ofullständig eller så finns ingen aktiv serie av typen fiscale. Fyll i båda i panelen; API:t vägrar skapa ett ogiltigt fiskalt dokument.