Julkinen Beta: Älykäs asiakirjojen OCR — rakennettu Suomessa, isännöity EU:ssa. Aloita ilmaiseksi → Haluamme palautettasi!

eScanX API-viite

Kaikki mitä tarvitset älykkään asiakirja-OCR-rajapintamme integroimiseen sovelluksiisi.

Perus-URL
https://api.escanx.com
API-versio
v1
Sisältötyyppi
Vastaukset ovat JSON-muodossa. Tiedostojen lataus käyttää multipart/form-data -muotoa.
Kaikki API-päätepisteet alkavat /api/v1. Esimerkki: https://api.escanx.com/api/v1/extract/receipt

Tunnistautuminen

Tunnista API-pyyntösi X-API-Key-otsikolla. Hanki API-avaimesi hallintapaneelista rekisteröitymisen jälkeen.

Hanki API-avaimesi
Rekisteröi ilmainen tili ja luo API-avain hallintapaneelista.

Sisällytä API-avaimesi jokaiseen pyyntöön:

# Sample: list async jobs (any authenticated endpoint works the same way)
curl https://api.escanx.com/api/v1/jobs \
  -H "X-API-Key: YOUR_API_KEY"
Pidä API-avaimesi salassa. Älä paljasta sitä asiakaspuolen koodissa tai julkisissa arkistoissa.

API-leikkikenttä

Kokeile poimintapäätepistettä livenä. Valitse asiakirjatyyppi, liitä API-avaimesi, lataa tiedosto ja suorita oikea pyyntö.

Tämä suorittaa oikean poiminnan tililläsi ja kuluttaa krediittejä. API-avaimesi lähetetään suoraan rajapintaan HTTPS:n yli, eikä tämä sivu tallenna sitä.
Asiakirjatyyppi
Asiakirjatiedosto

Vedä ja pudota tiedosto tai napsauta selataksesi

JPEG, PNG, WebP, HEIC tai PDF · enintään 5 Mt

Asiakirjojen poiminta

Poimi rakenteellista dataa asiakirjoista (kuitit, laskut jne.) älykkään OCR-moottorimme avulla.

POST/api/v1/extract/{document_type}
Vaatii API-avain-tunnistautumisenOdotusikkuna: 90 sekuntia
Asiakirjatyyppi

Pyyntö

Lähetä yksi asiakirja multipart/form-data -muodossa. Voit lisätä Idempotency-Key-otsakkeen, jolloin uudelleenyritys hakee saman poiminnan eikä veloita kahdesti.

ParametriTyyppiKuvaus
document_type*stringAsiakirjatyyppi (polkuparametri): receipt, invoice, bank_statement, purchase_order, sales_order
file*fileAsiakirjatiedosto (JPEG, PNG, WebP, HEIC tai PDF). Maks. 5 Mt.
Idempotency-KeyheaderValinnainen. Enintään 256 merkkiä. Uudelleenyritys jatkaa tai hakee SAMAN poiminnan, eikä sitä veloiteta kahdesti.

Tiukka tyypitys: polku kertoo odottamasi asiakirjatyypin. Toisen tyyppinen asiakirja hylätään virheellä 422 — sitä ei koskaan muunneta. Käytä asynkronisia töitä, jos haluat parhaan yrityksen muunnoksen.

curl -X POST https://api.escanx.com/api/v1/extract/receipt \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F "file=@receipt.jpg"

Vastaus

Extraction-objekti on sisäkkäinen ja asiakirjatyyppikohtainen — vaihda asiakirjatyyppiä yltä nähdäksesi kunkin rakenteen.

{
  "success": true,
  "request_id": "req_abc123def456",
  "extraction_id": "ext_9f3c1a7b2d84",
  "processing_time_ms": 1250,
  "document_type": "receipt",
  "extraction": {
    "merchant": {
      "name": "Helsinki Market",
      "address": {
        "city": "Helsinki",
        "country_code": "FI"
      },
      "business_id": "1234567-8"
    },
    "buyer": {
      "name": "Aurora Digital Oy",
      "business_id": "7788990-1"
    },
    "transaction": {
      "date": "2025-01-15",
      "time": "14:30",
      "receipt_number": "A-4471"
    },
    "items": [
      {
        "line_number": 1,
        "description": "Coffee 250g",
        "quantity": 1,
        "unit_price": 4.9,
        "item_total": 4.9
      }
    ],
    "financial": {
      "subtotal": 43.1,
      "tax": [
        {
          "rate": 25.5,
          "amount": 4.75
        }
      ],
      "tax_total": 4.75,
      "total": 47.85,
      "currency": "EUR"
    },
    "payments": [
      {
        "method": "card",
        "card_type": "Visa",
        "card_last4": "4242",
        "amount": 47.85
      }
    ],
    "loyalty": {
      "card_number": "9012345678",
      "points_earned": 12,
      "points_balance": 340
    },
    "metadata": {
      "sub_type": "grocery",
      "confidence": {
        "overall": 0.97
      }
    }
  },
  "error": null,
  "credit_cost": 1,
  "item_count": 1
}
ParametriTyyppiKuvaus
successbooleanOnnistuiko poiminta
request_idstringYksilöllinen pyynnön tunniste
processing_time_msnumberKäsittelyaika millisekunteina
document_typestringKäsitelty asiakirjatyyppi
extraction_idstring | nullTämän poiminnan historiatunnus. Hae tulos uudelleen osoitteesta GET /extractions/{extraction_id} säilytysajan puitteissa.
extractionobject | nullPoimittu data — sisäkkäinen objekti, jonka rakenne riippuu document_type-arvosta (esim. receipt: merchant, transaction, items, financial, metadata; invoice: seller, invoice_details, …)
errorstring | nullVirheviesti jos poiminta epäonnistui
credit_costnumber | nullTästä poiminnasta veloitetut krediitit. Null virhetilanteessa.
item_countnumber | nullVeloitettavien kohteiden määrä asiakirjatyypin laskutusyksikön mukaan (sivut tai kuitit yhdessä kuvassa). Null virhetilanteessa.

Tämän päätepisteen virheet

400Virheellinen tiedostotyyppi tai virheellinen pyyntö
402Krediitit eivät riitä
413Tiedosto ylittää suurimman sallitun koon
422Asiakirja hylättiin — ei kelvollinen asiakirja tai väärä tyyppi tälle polulle
429Samanaikaisuusbudjetti täynnä (SYNC_EXTRACT_CAPACITY) — organisaatiosi samanaikaisten poimintojen raja tai jaettu synkroninen pooli. Retry-After on asetettu; mitään ei tallenneta eikä veloiteta.
503Poimintamoottorin jono on täynnä. Retry-After on asetettu; mitään ei tallenneta eikä veloiteta.
50490 sekunnin odotusikkuna umpeutui poiminnan ollessa yhä käynnissä. Vastauksen runko ja Location-otsake sisältävät extraction_id:n — kysele GET /extractions/{extraction_id} tai yritä uudelleen samalla Idempotency-Key-arvolla.

Poimintahistoria

Jokainen synkroninen poiminta tallennetaan. Näillä päätepisteillä haet tuloksen myöhemmin uudelleen, palaudut 504-virheestä ja tarkastelet ajamiasi poimintoja.

Vaatii API-avaintunnistautumisen

Listaa poiminnat

GET/api/v1/extractions

Listaa synkroniset poimintasi. Samat suodattimet ja vastausrakenne kuin GET /jobs.

ParametriTyyppiKuvaus
statusstringSuodata tilan mukaan: processing, completed, failed, cancelled
document_typestringSuodata asiakirjatyypin mukaan (esim. receipt, invoice)
date_fromstringVain poiminnat, jotka on luotu tänä päivänä tai sen jälkeen (ISO 8601)
date_tostringVain poiminnat, jotka on luotu tänä päivänä tai sitä ennen (ISO 8601)
pageintegerSivunumero (oletus: 1)
page_sizeintegerKohteita sivulla (oletus: 20, enintään: 100)
Tila-arvot
processingTyötä käsitellään
completedPoiminta onnistui — tulokset extraction-kentässä
failedPoiminta epäonnistui — virhetiedot error-kentässä
cancelledTyö peruttiin

Kohteen kentät

ParametriTyyppiKuvaus
extraction_idstringHistoriatunnus — välitä se yksittäisen poiminnan päätepisteeseen
statusstringPoiminnan nykyinen tila
document_typestringPyydetty asiakirjatyyppi
original_filenamestringLähetetyn tiedoston nimi
created_atstringMilloin pyyntö hyväksyttiin
completed_atstring | nullMilloin poiminta saavutti lopputilan
confidencenumber | nullPoiminnan kokonaisluottamus, kun saatavilla
credit_costnumber | nullVeloitetut krediitit. Null suorituksen aikana tai virhetilanteessa.
item_countnumber | nullVeloitettavien kohteiden määrä. Null suorituksen aikana tai virhetilanteessa.
processing_time_msnumber | nullKäsittelyaika millisekunteina
expires_atstringMilloin tietue ja tallennettu tiedosto poistetaan. Sen jälkeen tämä päätepiste palauttaa 404.
curl "https://api.escanx.com/api/v1/extractions?status=completed&page_size=20" \
  -H "X-API-Key: YOUR_API_KEY"

Hae poiminta

GET/api/v1/extractions/{extraction_id}

Yksi poiminta tuloksineen, haettavissa koko säilytysajan. Näin haet tuloksen POST /extract -kutsun 504-virheen jälkeen. Yhä käynnissä oleva poiminta selvitetään lukuhetkellä; lopputilaa edeltävät vastaukset sisältävät Retry-After: 3 -vihjeen kyselytahdista.

curl https://api.escanx.com/api/v1/extractions/EXTRACTION_ID \
  -H "X-API-Key: YOUR_API_KEY"

Poimintatilastot

GET/api/v1/extractions/stats

Synkronisten poimintojesi koontimäärät. Vastaa GET /jobs/stats -päätepistettä.

ParametriTyyppiKuvaus
totalnumberPoimintojen kokonaismäärä
by_statusobjectPoimintojen määrät tilan mukaan

Peruuta poiminta

POST/api/v1/extractions/{extraction_id}/cancel

Peruuta vain kun poiminta on vielä jonossa moottorilla. Yhteyden katkaiseminen ei ole peruutus — ajo suoritetaan loppuun historiaan ja veloitetaan normaalisti.

200Peruutettu. Tulos hylätään eikä mitään veloiteta.
409EXTRACTION_NOT_CANCELLABLE — moottori on jo aloittanut tai poiminta on jo lopputilassa.

Säilytys

Tulokset ja lähetetyt tiedostot säilytetään API-säilytysajan verran, muokattavissa organisaation asetuksissa ja rajattuna pakettisi mukaan. expires_at lasketaan lukuhetkellä, joten asetuksen muutos vaikuttaa olemassa oleviin tietueisiin heti molempiin suuntiin. Poistetut resurssit vastaavat 404.

Asynkroniset työt

Lähetä asiakirjoja asynkroniseen poimintaan. Ihanteellinen suurille tiedostoille tai erätyönkuluille, joissa välitöntä tulosta ei tarvita.

Vaatii API-avain-tunnistautumisen

Lähetä työ

POST/api/v1/jobs/{document_type}

Lähetä 1–20 asiakirjaa taustakäsittelyyn yhdellä pyynnöllä. Palauttaa 202-vastauksen, jossa on yksi jonossa oleva työ per tiedosto.

ParametriTyyppiKuvaus
document_type*stringAsiakirjatyyppi (polkuparametri): receipt, invoice, bank_statement, purchase_order, sales_order
files*file[]Asiakirjatiedostot (JPEG, PNG, WebP, HEIC tai PDF). Toistuva multipart-kenttä, 1–20 per pyyntö; jokaisesta tiedostosta luodaan oma työ.
webhook_urlstringHTTPS-URL valmistumisilmoitusten vastaanottamiseen, sovelletaan erän jokaiseen työhön. Lähetetään kyselymerkkijonoparametrina, ei lomakekenttänä.
Idempotency-KeyheaderValinnainen. Saman avaimen toisto palauttaa alkuperäisen vastauksen sen sijaan, että loisi toisen erän.

Kaikki tai ei mitään: jokainen tiedosto validoidaan ja koko erän jonokapasiteetti tarkistetaan ennen kuin mitään luodaan. Mikä tahansa rikkomus hylkää koko pyynnön ja nimeää virheellisen tiedoston.

Työt muuntavat aina: document_type on pyytämäsi tulosmuoto, ja toisen tyyppinen asiakirja luetaan sellaisena kuin se on ja palautetaan siinä muodossa. Tiukka tyypitys koskee vain synkronista /extract-päätepistettä.

curl -X POST https://api.escanx.com/api/v1/jobs/invoice \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "files=@invoice-1.pdf" \
  -F "files=@invoice-2.pdf"

202-vastaus

ParametriTyyppiKuvaus
acceptednumberLuotujen töiden määrä — aina sama kuin lähetettyjen tiedostojen määrä
itemsobject[]Yksi merkintä per lähetetty tiedosto, tiedostojen lähetysjärjestyksessä
items[].job_idstringKysele tällä tunnuksella tulosta
items[].statusstringLähetettäessä aina queued
items[].document_typestringTulosmuoto, jonka tämä työ tuottaa
items[].estimated_wait_secondsnumber | nullKarkea jonotusaika sekunteina, kun se voidaan arvioida
items[].poll_urlstringValmis URL tilapäätepisteeseen
items[].webhook_secretstring | nullTyökohtainen allekirjoitussalaisuus, palautetaan vain jos webhook_url annettiin. Näytetään kerran.

Lähetyksen virheet

400Virheellinen tiedosto tai erä 1–20 rajan ulkopuolella. Vastaus nimeää virheellisen tiedoston; mitään ei luoda.
413Tiedosto ylittää suurimman sallitun koon
422Virheellinen webhook-URL
429Jono täynnä — TOO_MANY_QUEUED_JOBS (100 jonossa per käyttäjä) tai JOB_QUEUE_FULL (500 per organisaatio). Molemmat lähettävät Retry-After.

Tarkista työn tila

GET/api/v1/jobs/{job_id}

Pollaa työn tilaa kunnes se saavuttaa lopullisen tilan.

Status Values
queuedTyö on jonossa odottamassa poimintapaikkaa
processingTyötä käsitellään
completedPoiminta onnistui — tulokset extraction-kentässä
failedPoiminta epäonnistui — virhetiedot error-kentässä
cancelledTyö peruttiin
curl https://api.escanx.com/api/v1/jobs/JOB_ID \
  -H "X-API-Key: YOUR_API_KEY"

Lopputilan vastaukset sisältävät expires_at-kentän. Sen jälkeen tietue ja tallennettu tiedosto poistetaan ja tämä päätepiste palauttaa 404. Ikkuna on API-säilytysasetuksesi, muokattavissa organisaation asetuksissa.

Webhookit

Pollauksen sijaan anna webhook_url työtä lähettäessäsi. Päätepisteesi vastaanottaa POST-pyynnön kun työ valmistuu tai epäonnistuu. Vastaus sisältää webhook_secret-avaimen pyyntöjen allekirjoitusten vahvistamiseen.

Vaatimukset
URL:n on käytettävä HTTPS:ää
URL:n on oltava julkisesti saavutettavissa (ei yksityisiä IP-osoitteita)
Päätepisteen on vastattava 2xx-koodilla 10 sekunnin kuluessa
# Submit with webhook notification (webhook_url is a query parameter,
# applied to every job in the batch)
curl -X POST "https://api.escanx.com/api/v1/jobs/invoice?webhook_url=https://your-app.com/webhooks/escanx" \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "files=@invoice-1.pdf" \
  -F "files=@invoice-2.pdf"

Tallenna työn lähetysvastauksessa palautettu webhook_secret. Käytä sitä vahvistaaksesi, että saapuvat webhook-pyynnöt ovat eScanX:ltä.

Listaa työt

GET/api/v1/jobs

Listaa poimintatyösi valinnaisilla suodattimilla.

ParametriTyyppiKuvaus
statusstringSuodata työn tilan mukaan: queued, processing, completed, failed, cancelled
document_typestringSuodata asiakirjatyypin mukaan (esim. receipt, invoice)
date_fromstringVain työt, jotka on luotu tänä päivänä tai sen jälkeen (ISO 8601)
date_tostringVain työt, jotka on luotu tänä päivänä tai sitä ennen (ISO 8601)
pageintegerSivunumero (oletus: 1)
page_sizeintegerKohteita sivulla (oletus: 20, enintään: 100)

Peruuta työ

POST/api/v1/jobs/{job_id}/cancel

Peruuta työ, joka on vielä jonossa. Kun käsittely alkaa, työ suoritetaan loppuun, ja myöhäinen peruutus palauttaa 400 JOB_CANCELLATION_FAILED.

Yritä työ uudelleen

POST/api/v1/jobs/{job_id}/retry

Yritä epäonnistunutta työtä uudelleen. Kasvattaa poimintayritystä ja palauttaa työn jonoon. Väärä tila tai loppuun käytetyt yritykset palauttavat 400 JOB_RETRY_FAILED.

Työtilastot

GET/api/v1/jobs/stats

Töidesi koontimäärät ja jäljellä oleva jonokapasiteetti.

ParametriTyyppiKuvaus
totalnumberTöiden kokonaismäärä
by_statusobjectTöiden määrät tilan mukaan
queued_limitnumberSuurin määrä töitä, joita voi olla jonossa yhtä aikaa
queued_remainingnumberJäljellä olevat jonopaikat
curl https://api.escanx.com/api/v1/jobs/stats \
  -H "X-API-Key: YOUR_API_KEY"

Käyttötilastot

Tarkista API-käyttösi, kiintiösi ja jäljellä olevat kutsut nykyisellä laskutusjaksolla.

GET/api/v1/usage
Vaatii API-avain-tunnistautumisen
ParametriTyyppiKuvaus
daysintegerTilastoikkunaan sisällytettävien päivien määrä (oletus: nykyinen laskutusjakso)
curl "https://api.escanx.com/api/v1/usage?days=30" \
  -H "X-API-Key: YOUR_API_KEY"

Vastaus

ParametriTyyppiKuvaus
api_key_idnumberAPI-avaimen tunniste, jota tilastot koskevat
api_key_namestring | nullAPI-avaimen nimi (null jos nimetön)
period_startstringRaportointijakson alku (ISO 8601)
period_endstringRaportointijakson loppu (ISO 8601)
total_requestsnumberAPI-pyyntöjen kokonaismäärä jaksolla
successful_requestsnumberOnnistuneiden poimintojen määrä
failed_requestsnumberEpäonnistuneiden poimintojen määrä
success_ratenumberOnnistumisprosentti
avg_processing_time_msnumber | nullKeskimääräinen käsittelyaika millisekunteina (null jos ei pyyntöjä)
quota_limitnumber | nullJakson kiintiöraja, jos sovellettavissa
quota_usednumber | nullNykyisellä jaksolla käytetty kiintiö
quota_remainingnumber | nullNykyisellä jaksolla jäljellä oleva kiintiö

Terveystarkistukset

Seuraa API:n tilaa elävyys- ja valmiuspäätepisteillä. Tunnistautumista ei vaadita.

Elävyystarkistus

GET/health
Tunnistautumista ei vaadita

Palauttaa OK jos API-palvelin on käynnissä.

curl https://api.escanx.com/health

Valmiustarkistus

GET/health/ready
Tunnistautumista ei vaadita

Palauttaa OK jos API ja kaikki riippuvuudet (tietokanta) ovat valmiita palvelemaan pyyntöjä.

curl https://api.escanx.com/health/ready

Virheiden käsittely

API käyttää standardeja HTTP-tilakoodeja. Virhevastaukset noudattavat RFC 7807 problem+json -muotoa litteillä kentillä.

Virhevastauksen muoto

{
"type": "about:blank",
"title": "Bad Request",
"status": 400,
"detail": "The uploaded file type is not supported",
"error_code": "INVALID_FILE_TYPE",
"error_id": "err_abc123",
"instance": "/api/v1/extract/receipt",
"timestamp": "2026-01-15T12:00:00Z"
}
ParametriTyyppiKuvaus
detailstringIhmisluettava virhekuvaus
error_codestringKoneluettava virhekoodi
error_idstringYksilöllinen tunniste tälle virheelle (hyödyllinen tukipyynnöissä)

Validointivirheet (422)

Validointivirheet palauttavat 422-koodin ja detail-taulukon — yksi merkintä jokaista virheellistä kenttää kohti, kukin sisältäen sijainnin, viestin ja tyypin.

{
"detail": [{
"loc": ["body", "file"],
"msg": "field required",
"type": "value_error.missing"
}]
}

HTTP-tilakoodit

400Virheellinen pyyntö — Virheelliset parametrit tai puuttuvat pakolliset kentät
401Ei valtuutettu — Puuttuva tai virheellinen API-avain
403Kielletty — API-avaimeen liitettyä sähköpostiosoitetta ei ole vahvistettu
402Payment Required — krediitit eivät riitä tähän poimintaan
404Ei löytynyt — Pyydettyä resurssia ei ole olemassa
409Conflict — resurssi ei enää ole tilassa, joka sallii tämän toiminnon
413Liian suuri — Tiedosto ylittää sallitun enimmäiskoon
422Käsittelemätön entiteetti — Pyyntörungon validointi epäonnistui
429Liian monta pyyntöä — Pyyntörajoitus ylitetty. Tarkista Retry-After-otsikko
500Sisäinen palvelinvirhe — Jokin meni vikaan palvelimella
502Virheellinen yhdyskäytävä — Poimintapalvelu palautti virheen
503Palvelu ei saatavilla — Poimintapalvelu on väliaikaisesti poissa käytöstä
504Yhdyskäytävän aikakatkaisu — Poimintapalvelu ei vastannut ajoissa

Pyyntörajoitukset

API-pyynnöt ovat rajoitettuja API-avainkohtaisesti reilun käytön ja alustan vakauden varmistamiseksi.

Miten se toimii

Pyyntörajoitukset sovelletaan API-avainkohtaisesti. Rajoituksen ylittyessä pyynnöt palauttavat HTTP 429.

Vastaus sisältää Retry-After-otsikon, joka ilmoittaa kuinka monta sekuntia tulee odottaa ennen uudelleenyritystä.

Pyyntörajoitusten käsittely

Toteuta eksponentiaalinen odotus kun saat 429-vastauksen.

async function extractWithRetry(file, documentType, maxRetries = 3) {
  const formData = new FormData()
  formData.append('file', file)

  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(`https://api.escanx.com/api/v1/extract/${documentType}`, {
      method: 'POST',
      headers: { 'X-API-Key': 'YOUR_API_KEY' },
      body: formData
    })

    if (response.status === 429) {
      const retryAfter = response.headers.get('Retry-After') || '5'
      await new Promise(r => setTimeout(r, parseInt(retryAfter) * 1000))
      continue
    }

    return await response.json()
  }
  throw new Error('Max retries exceeded')
}

SDK:t ja kirjastot

Viralliset SDK:t suosituille ohjelmointikielille ovat tulossa pian. Käytä toistaiseksi REST API:amme suoraan millä tahansa HTTP-asiakkaalla.

Natiivit SDK:t JavaScriptille ja Pythonille ovat kehitteillä ja tulevat saataville pian.
Complete extraction example
# Upload an invoice and extract structured data
curl -X POST https://api.escanx.com/api/v1/extract/invoice \
  -H "X-API-Key: YOUR_API_KEY" \
  -F "file=@invoice.pdf"

# Check your API usage
curl https://api.escanx.com/api/v1/usage \
  -H "X-API-Key: YOUR_API_KEY"

Valmis aloittamaan?

Luo ilmainen tili ja aloita datan poiminta asiakirjoista minuuteissa.

Hanki ilmainen API-avain

Käytämme evästeitä parantaaksemme kokemustasi sivustollamme. Käyttämällä sivustoamme hyväksyt evästeet. Lue lisää