Kansallinen sähkölaskujärjestelmä API:n kautta

Esitarkistus (Romaniassa CIUS-RO), lähetys järjestelmään, normalisoitu tila, allekirjoitettu vastaus ja saapuva toimittajapostilaatikko.

Esitarkistus (Romaniassa CIUS-RO), lähetys järjestelmään, normalisoitu tila, allekirjoitettu vastaus ja saapuva toimittajapostilaatikko.

← Takaisin API-dokumentaatioon

Ensimmäinen lasku 6 vaiheessa

  1. Suorita POST /v1/invoices/{id}/efactura/validate. Esitarkistus (Romaniassa CIUS-RO) ei lähetä mitään kansalliseen sähkölaskujärjestelmään ja kertoo tarkalleen, mitä hylättäisiin.
  2. Lähetä POST /v1/invoices/{id}/efactura/submit aina Idempotency-Keyllä. Saat submission_id:n ja tilan.
  3. Kysele GET /v1/efactura/submissions/{id}, kunnes tila on accepted tai rejected.
  4. Pakota tuore tilakysely kansallisesta sähkölaskujärjestelmästä kutsulla POST /v1/efactura/submissions/{id}/refresh — se kuluttaa 10 kertaa minuutissa -ryhmää.
  5. Lataa kansallisen sähkölaskujärjestelmän allekirjoitettu vastausarkisto kutsulla GET /v1/efactura/submissions/{id}/download.

Kaikki päätepisteet

MetodiPäätepisteScopeIdempotency-KeyPyyntöjä / minuutti
GET/invoices/{invoice_id}/xml
Lataa UBL-XML (Romaniassa CIUS-RO)
invoices:read—120
POST/invoices/{invoice_id}/efactura/validate
Esitarkistus (Romaniassa CIUS-RO) — validoi lähettämättä
efactura:read—120
POST/invoices/{invoice_id}/efactura/submit
Lähetä lasku kansalliseen sähkölaskujärjestelmään
efactura:submitpakollinen10
GET/efactura/submissions
Listaa sähkölaskujärjestelmän lähetykset
efactura:read—120
GET/efactura/submissions/{submission_id}
Hae yksi lähetys
efactura:read—120
POST/efactura/submissions/{submission_id}/refresh
Kysy nykyinen tila sähkölaskujärjestelmästä
efactura:read—10
GET/efactura/submissions/{submission_id}/download
Lataa allekirjoitettu vastausarkisto
efactura:read—120
GET/efactura/inbox
Kansallisen sähkölaskujärjestelmän kautta vastaanotetut toimittajalaskut
efactura:read—120
GET/efactura/inbox/{inbound_id}
Hae yksi saapuva lasku
efactura:read—120
GET/efactura/inbox/{inbound_id}/download
Lataa saapuvan laskun arkisto
efactura:read—120
POST/efactura/inbox/sync
Hae uudet viestit kansallisesta sähkölaskujärjestelmästä postilaatikkoon
efactura:read—10

Mitä 4invoices-API on

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)
bash
# Pull new SPV messages, then read the inbound supplier invoices.
curl -sS -X POST https://api.4invoices.net/v1/efactura/inbox/sync \
  -H "Authorization: Bearer $ACCESS_TOKEN"

curl -sS "https://api.4invoices.net/v1/efactura/inbox?limit=50" \
  -H "Authorization: Bearer $ACCESS_TOKEN"

# ANAF allows roughly ONE message-list call per minute per CIF,
# joten /inbox/sync kuluttaa 10/min lähetysryhmää. Aja se cronilla, älä kysele jatkuvasti.

https://api.4invoices.net/v1 · https://api.4invoices.net/v1/openapi.json

Kansallinen sähkölaskujärjestelmä

not_sentvalidatingqueuedsentprocessingacceptedrejectederror

Virheet

TilaTyyppiKoodi
422invalid_request_errorcius_ro_incomplete

Yleiset virheet

  • Normalisoitu elinkaari: not_sent → validating → queued → sent → processing → accepted | rejected | error.
  • accepted tarkoittaa laillisesti lähetetty. rejected tarkoittaa, että kansallinen sähkölaskujärjestelmä hylkäsi sen: korjaa ja lähetä uudelleen. error on siirtovirhe meidän puolellamme ja sen voi turvallisesti yrittää uudelleen.
  • Lähetys on peruuttamaton: saman laskun toista kopiota ei voi vetää pois kansallisesta sähkölaskujärjestelmästä. Siksi Idempotency-Key on pakollinen.
  • GET /v1/invoices/{id}/xml antaa UBL-XML:n (Romaniassa CIUS-RO) ilman lähetystä lainkaan — omaan arkistoon tai tarkastukseen.
  • Postilaatikko: POST /v1/efactura/inbox/sync hakee uudet viestit, GET /v1/efactura/inbox listaa ne ja /download hakee kunkin saapuvan laskun arkiston.
  • e-Factura-päätepisteet toimivat vain romanialaisille tenanteille; muuten saat 404.

Kehittäjien kysymykset ja vastaukset

Kauanko kestää, että kansallinen sähkölaskujärjestelmä hyväksyy laskun?

Vaihtelee sekunneista tuntiin. Älä estä myyntiprosessia: lähetä asynkronisesti ja käsittele accepted ja rejected tapahtumina.

Voinko saada XML:n (Romaniassa CIUS-RO) lähettämättä mitään kansalliseen sähkölaskujärjestelmään?

Kyllä. GET /v1/invoices/{id}/xml luo asiakirjan ilman lähetystä, ja /efactura/validate palauttaa sen base64-koodattuna, kun include_xml=true.

Kuinka usein voin ajaa inbox/sync-kutsun?

Enintään 10 kutsua minuutissa, mutta käytännössä Romanian ANAF sallii noin yhden viestilistauskutsun minuutissa verotunnistetta (CIF) kohden. Aja se cronista muutaman minuutin välein.

Mitä teen, jos tila jää error-tilaan?

error on meidän puolen siirto- tai todennusvirhe, joten sen voi turvallisesti yrittää uudelleen. Jos se jatkuu, lähetä request_id tukeen.