ID PhotoREST · JSONOpenAPI 3.1

SVOYAGER ID Photo API

Maak van elke foto een foto die voldoet aan de eisen voor een identiteitsbewijs, paspoort of visum.

Overzicht

Wat het doet

De SVOYAGER ID Photo API verandert een gewoon portret in een conform documentfoto. ID Photo is één enkel product: paspoort, visum, verblijfsvergunning en nationale identiteitskaart worden weergegeven als documentspecificaties, niet als afzonderlijke producten. U uploadt een foto, genereert een voorbeeld met watermerk op basis van een specificatie en rondt vervolgens het proces af om het resultaat zonder watermerk te verkrijgen.

Voorbeeld → definitieve workflow

  1. 1Upload een foto. Maak een uploadbestemming aan en stuur de afbeeldingsbytes daarheen.
  2. 2Maak een sessie aan. Maak een voorbeeldweergave met watermerk op basis van een specificatie. Controleer de gerapporteerde problemen.
  3. 3Afronden. Zet de beoordeelde sessie om in een bestelling en ontvang het definitieve bestand zonder watermerk.

Snelstart

Elk verzoek wordt geauthenticeerd met een Bearer-geheime sleutel. Begin in de testmodus:

curl
# List specifications to find a spec_id
curl -G "https://partner.svoyager.com/v1/photo-specifications" \
  -H "Authorization: Bearer svoy_sk_test_YOUR_KEY" \
  --data-urlencode "country=US"

Basis-URL en omgevingen

Alle eindpunten worden aangeboden onder één basis-URL:

Base URL
https://partner.svoyager.com/v1

Er is geen omgevingspad of -parameter. Of een verzoek in de test- of live-omgeving wordt uitgevoerd, wordt volledig bepaald door het voorvoegsel van je API-sleutel (svoy_sk_test_… versus svoy_sk_live_…). Reacties geven dit weer als livemode.

Authenticatie

API-sleutels

Verifieer elk verzoek met een Authorization-header die uw geheime sleutel bevat. Sleutels worden aangemaakt en vernieuwd in het Partner Center.

Header
Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx

Het voorvoegsel geeft de omgeving aan: svoy_sk_test_… voor test, svoy_sk_live_… voor live. Een testsleutel kan nooit worden gebruikt voor live gegevens (en vice versa) — bij een verkeerde combinatie wordt de foutcode 401 wrong_environment geretourneerd.

Toepassingsgebieden

Sleutels hebben expliciete ‘least-privilege’-bereiken. Een verzoek waarbij het vereiste bereik ontbreekt, retourneert 403 insufficient_scope.

ToepassingsgebiedToestemmingen
photo.specs.readList and retrieve photo specifications.
photo.sessions.readRetrieve sessions and their previews.
photo.sessions.writeCreate uploads and photo sessions (previews).
photo.finalize.writeFinalize a session into a no-watermark order.
photo.orders.readRetrieve orders and download finals.

Sleutels veilig bewaren

Geheime sleutels zijn uitsluitend bedoeld voor server-naar-server-communicatie. Verwerk een geheime sleutel nooit in browser- of mobiele code, een openbare repository of een client-side bundel. Als een sleutel openbaar wordt gemaakt, vervang deze dan onmiddellijk in het Partner Center.

Core API

Eindpunten

Verplichte velden zijn gemarkeerd met *. In de voorbeelden worden plaatshouders voor inloggegevens gebruikt — nooit echte sleutels.

POST/v1/uploads

Upload a photo

Create a short-lived presigned upload target, then PUT the raw image bytes straight to `upload_url`. This bypasses request-body size limits (product cap 10 MB). No quota is spent.

scope photo.sessions.write
Verzoek
Body (application/json)
VeldTypeBeschrijving
content_type*stringMIME type of the image.image/jpegimage/pngimage/webpimage/heic
  • `upload_url` is single-use and expires; upload promptly and do not modify the URL.
Voorbeeldverzoek
curl
# 1) Create the upload target
curl -X POST "https://partner.svoyager.com/v1/uploads" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{"content_type":"image/jpeg"}'

# 2) PUT the bytes to the returned upload_url (exactly as returned)
curl -X PUT "$UPLOAD_URL" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg
Antwoord · 201
201 · application/json
{
  "object": "upload",
  "upload_url": "https://upload.svoyager.com/v1/EXAMPLE?signature=…",
  "upload_ref": "up_ref_tXk3W2b8Qe7Ra1Nc0",
  "max_bytes": 10485760,
  "expires_at": "2026-07-24T18: 20: 00Z"
}
Fouten
StatusCodeWanneer
400missing_content_type`content_type` was not provided.
415unsupported_formatThe content type is not an accepted image format.
503temporarily_unavailableUploads are temporarily unavailable.
502upload_init_failedThe upload could not be initialised — retry shortly.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

POST/v1/photo-sessions

Create a photo session

Generate a watermarked preview from an upload against a specification. Spends one `preview` unit of your plan. Review `issues` before finalizing.

scope photo.sessions.write Idempotency-Key vereist
Verzoek
Body (application/json)
VeldTypeBeschrijving
upload_ref*stringThe `upload_ref` from Upload a photo.
spec_id*stringThe `photo_specification` id (`spc_…`) to render against.
Voorbeeldverzoek
curl
curl -X POST "https://partner.svoyager.com/v1/photo-sessions" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx" \
  -H "Idempotency-Key: a7f3c9e1-2b4d-4c8a-9f10-3e5d6b7a8c9d" \
  -H "Content-Type: application/json" \
  -d '{"upload_ref":"up_ref_tXk3W2b8Qe7Ra1Nc0","spec_id":"spc_9wTv2c1Kd8Qe"}'
Antwoord · 201
201 · application/json
{
  "object": "photo_session",
  "id": "3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10",
  "livemode": false,
  "status": "preview_ready",
  "spec_id": "spc_9wTv2c1Kd8Qe",
  "preview_url": "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10/preview",
  "watermarked": true,
  "issues": [],
  "created_at": "2026-07-24T18: 30: 00Z"
}
Fouten
StatusCodeWanneer
400missing_idempotency_keyThe `Idempotency-Key` header is missing.
400missing_upload_ref`upload_ref` is missing.
400missing_spec_id`spec_id` is missing.
400invalid_upload_refThe referenced upload could not be read.
413file_too_largeThe uploaded file exceeds 10 MB.
415unsupported_formatThe uploaded file is not an accepted image format.
404spec_not_foundNo active specification matches `spec_id`.
402no_active_planNo active plan is assigned for this environment.
402quota_exceededIncluded preview quota for the period is exhausted.
402plan_inactiveThe plan is not active for this environment.
409idempotency_key_reuseThe key was reused with a different body.
409request_in_progressA request with this key is still processing.
422unprocessable_imageThe image could not be processed.
502provider_errorThe preview could not be generated upstream — retry shortly.
503provider_busyThe processing service is busy — retry shortly.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

GET/v1/photo-sessions/{id}

Retrieve a photo session

Fetch a session by id, including its current status, `preview_url`, and any `issues`.

scope photo.sessions.read
Verzoek
Padparameters
VeldTypeBeschrijving
id*stringSession id.
Voorbeeldverzoek
curl
curl "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx"
Antwoord · 200
200 · application/json
{
  "object": "photo_session",
  "id": "3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10",
  "livemode": false,
  "status": "preview_ready",
  "spec_id": "spc_9wTv2c1Kd8Qe",
  "preview_url": "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10/preview",
  "watermarked": true,
  "issues": [],
  "created_at": "2026-07-24T18: 30: 00Z"
}
Fouten
StatusCodeWanneer
404session_not_foundNo session matches the id for this account/environment.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

GET/v1/photo-sessions/{id}/preview

Download the preview image

Stream the watermarked preview image bytes for a session (SVOYAGER-hosted; the upstream URL is never exposed). This is the resource `preview_url` points to.

scope photo.sessions.readGeeft afbeeldingsbytes terug
Verzoek
Padparameters
VeldTypeBeschrijving
id*stringSession id.
  • Returns raw `image/*` bytes on success (not JSON).
Voorbeeldverzoek
curl
curl "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10/preview" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx" \
  --output preview.jpg
Antwoord · 200

Bij succes stuurt het eindpunt ruwe afbeeldingsbytes (geen JSON). Sla de responsbody op in een bestand.

Fouten
StatusCodeWanneer
404preview_not_foundThe session or its preview does not exist.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

POST/v1/photo-sessions/{id}/finalize

Finalize a photo

Turn a reviewed session into a deliverable order. In live mode this produces the no-watermark final and spends one `final` unit; in test mode it emulates the final from the preview.

scope photo.finalize.write Idempotency-Key vereist
Verzoek
Padparameters
VeldTypeBeschrijving
id*stringSession id to finalize.
Voorbeeldverzoek
curl
curl -X POST "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10/finalize" \
  -H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx" \
  -H "Idempotency-Key: a7f3c9e1-2b4d-4c8a-9f10-3e5d6b7a8c9d"
Antwoord · 201Returns 200 with the existing order if the session was already finalized (never double-charged).
201 · application/json
{
  "object": "photo_order",
  "id": "8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284",
  "livemode": true,
  "sandbox_emulated": false,
  "status": "final_ready",
  "session_id": "3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10",
  "spec_id": "spc_9wTv2c1Kd8Qe",
  "final_url": "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284/final",
  "watermarked": false,
  "created_at": "2026-07-24T18: 31: 00Z"
}
Fouten
StatusCodeWanneer
400missing_idempotency_keyThe `Idempotency-Key` header is missing.
404session_not_foundNo session matches the id for this account/environment.
422session_not_finalizableThe session is not in a finalizable state.
402no_active_planNo active plan is assigned for this environment.
402quota_exceededIncluded final quota for the period is exhausted.
402plan_inactiveThe plan is not active for this environment.
409idempotency_key_reuseThe key was reused with a different request.
409request_in_progressA request with this key is still processing.
502provider_errorThe final could not be produced upstream — retry shortly.
503provider_busyThe processing service is busy — retry shortly.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

GET/v1/orders/{id}

Retrieve an order

Fetch a finalized order by id, including its status and `final_url` once ready.

scope photo.orders.read
Verzoek
Padparameters
VeldTypeBeschrijving
id*stringOrder id.
Voorbeeldverzoek
curl
curl "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284" \
  -H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx"
Antwoord · 200
200 · application/json
{
  "object": "photo_order",
  "id": "8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284",
  "livemode": true,
  "sandbox_emulated": false,
  "status": "final_ready",
  "session_id": "3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10",
  "spec_id": "spc_9wTv2c1Kd8Qe",
  "final_url": "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284/final",
  "watermarked": false,
  "created_at": "2026-07-24T18: 31: 00Z"
}
Fouten
StatusCodeWanneer
404order_not_foundNo order matches the id for this account/environment.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

GET/v1/orders/{id}/final

Download the final image

Stream the final image bytes for an order (SVOYAGER-hosted). In live mode this is the no-watermark deliverable; in test mode it is the sandbox-emulated copy. This is the resource `final_url` points to.

scope photo.orders.readGeeft afbeeldingsbytes terug
Verzoek
Padparameters
VeldTypeBeschrijving
id*stringOrder id.
  • Returns raw `image/*` bytes on success (not JSON).
Voorbeeldverzoek
curl
curl "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284/final" \
  -H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx" \
  --output final.jpg
Antwoord · 200

Bij succes stuurt het eindpunt ruwe afbeeldingsbytes (geen JSON). Sla de responsbody op in een bestand.

Fouten
StatusCodeWanneer
404final_not_foundThe order or its final does not exist.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

GET/v1/photo-specifications

List photo specifications

Return a cursor-paginated list of available photo specifications. Filter by country or document type to find the `spec_id` you need.

scope photo.specs.read
Verzoek
Queryparameters
VeldTypeBeschrijving
limitintegerPage size, 1–100 (default 20).
starting_afterstringA specification id (`spc_…`) to page after.
countrystringISO-3166 alpha-2 filter, e.g. `US`.
document_typestringFilter by document type, e.g. `passport`.
Voorbeeldverzoek
curl
curl -G "https://partner.svoyager.com/v1/photo-specifications" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx" \
  --data-urlencode "country=US" \
  --data-urlencode "limit=20"
Antwoord · 200
200 · application/json
{
  "object": "list",
  "data": [
    {
      "object": "photo_specification",
      "id": "spc_9wTv2c1Kd8Qe",
      "name": "United States Passport"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
Fouten

Dit eindpunt retourneert uitsluitend de onderstaande standaardfouten.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

GET/v1/photo-specifications/{id}

Retrieve a photo specification

Fetch a single specification by its stable `spec_id`, including its full requirements.

scope photo.specs.read
Verzoek
Padparameters
VeldTypeBeschrijving
id*stringSpecification id (`spc_…`).
Voorbeeldverzoek
curl
curl "https://partner.svoyager.com/v1/photo-specifications/spc_9wTv2c1Kd8Qe" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx"
Antwoord · 200
200 · application/json
{
  "object": "photo_specification",
  "id": "spc_9wTv2c1Kd8Qe",
  "name": "United States Passport",
  "country_code": "US",
  "document_type": "passport",
  "physical_size": {
    "width": 51,
    "height": 51,
    "unit": "mm"
  },
  "pixel_size": {
    "width": 600,
    "height": 600
  },
  "dpi": 300,
  "background": {
    "color": "#FFFFFF",
    "name": "white"
  },
  "requirements": {
    "head_height": "25–35 mm (1–1⅜ in)",
    "eye_to_bottom": "28–35 mm (1⅛–1⅜ in)",
    "recency_months": 6,
    "expression": "neutral",
    "color": true,
    "glasses": "not allowed",
    "eyes_and_ears": "both eyes open"
  },
  "updated_at": "2026-07-01T12: 00: 00Z"
}
Fouten
StatusCodeWanneer
404spec_not_foundNo active specification matches the id.

Plus de standaardfouten op het gebied van authenticatie, machtigingen en rate-limits — zie Fouten en herpogingen.

Verzend een Idempotency-Key-header (een unieke waarde, bijvoorbeeld een UUID) zodat een herhaald verzoek nooit dubbel in rekening wordt gebracht of dubbel wordt verwerkt. Dit is vereist bij:

  • POST /v1/photo-sessions
  • POST /v1/photo-sessions/{id}/finalize
  • Dezelfde sleutel + dezelfde body → het oorspronkelijke resultaat wordt opnieuw weergegeven (geen tweede verwerking, geen tweede weergave).
  • Dezelfde sleutel + een andere body → 409 idempotency_key_reuse.
  • Bij een herhaalbare fout kun je het opnieuw proberen met dezelfde sleutel, body en upload_ref.
  • Gelijktijdige afrondingsverzoeken voor één sessie kunnen nooit twee orders aanmaken of in rekening brengen.

Een sessie doorloopt verschillende preview-statussen; een bestelling doorloopt verschillende afrondingsstatussen.

Sessiestatus
  • preview_readyVoorbeeld gegenereerd, geen problemen.
  • preview_has_issuesVoorbeeld gegenereerd met issues.
  • preview_failedHet voorbeeld kon niet worden gegenereerd.
  • finalizedde sessie is beëindigd.
Bestelstatus
  • final_readyDe definitieve versie is beschikbaar.
  • processingDe definitieve versie wordt momenteel voorbereid.
  • failedFinalisatie is mislukt.

De omgeving wordt bepaald door het voorvoegsel van je sleutel — clients kunnen dit nooit doorgeven. In de testmodus wordt het echte voorbeeld met watermerk weergegeven, zodat je de daadwerkelijke workflow kunt oefenen, maar de uiteindelijke weergave wordt gesimuleerd, zodat er geen live quota of productierendering wordt gebruikt.

AspectTestLive
livemodefalsetrue
VoorbeeldEcht, met watermerkEcht, met watermerk
EindversieSandbox-emulatie vanuit de previewEcht, zonder watermerk
sandbox_emulatedtruefalse
watermarkedtruefalse
Verbruikt quotumAlleen testquotaAlleen voor live quota

Je abonnement omvat een aantal previews en finals per periode, die apart worden geteld. Het aanmaken van een sessie kost één preview; het afronden kost één final. De quota wordt vóór de verwerking in één keer gereserveerd.

  • Wanneer het inbegrepen voorbeeld of de definitieve quota is opgebruikt, retourneert het verzoek 402 quota_exceeded.
  • 402 is een harde stop — herhalen zal pas slagen in de volgende periode of na een wijziging van het abonnement.
  • Test- en live-quota’s staan volledig los van elkaar.

Elke fout maakt gebruik van één envelope. De request_id komt ook voor in de X-Request-Id-responsheader — vermeld deze in supportverzoeken.

Error envelope
{
  "error": {
    "type": "invalid_request_error",
    "code": "quota_exceeded",
    "message": "Your included final quota for this period is exhausted.",
    "request_id": "req_9wTv2c1Kd8QeR7"
  }
}

Standaardfouten (alle eindpunten)

StatusCodeWanneer
401invalid_api_keyMissing, malformed, or unknown API key.
401revoked_api_keyThe key was revoked.
401expired_api_keyThe key passed its rotation grace period.
401wrong_environmentA test key was used on live traffic (or vice versa).
403client_disabledThe API client is disabled.
403api_access_revokedAPI access for the account is not active.
403insufficient_scopeThe key lacks the required scope for this endpoint.
429rate_limitedPer-key rate limit exceeded. Honour `Retry-After`.

422 wordt alleen geretourneerd bij een bevestigd beeldprobleem. 402 betekent dat de quota is opgebruikt. 409 duidt op een idempotentie- of resource-conflict.

429 betekent dat je de limiet per sleutel hebt bereikt — houd je aan de Retry-After-header. Bij 502/503 en andere 5xx-codes: probeer het opnieuw met backoff en dezelfde Idempotency-Key.

Een preview kan nul of meer problemen opleveren, elk bestaande uit een stable-code + bericht. Geef deze weer aan de eindgebruiker, zodat deze de foto opnieuw kan maken. Een niet-herkend upstream-signaal wordt gedegradeerd naar ‘other’.

CodeBericht
face_not_foundNo face was detected in the photo.
uneven_lightingLighting on the face is uneven.
poor_brightnessFace brightness is too dark, too bright, or the photo is low quality.
low_sharpnessThe photo is blurry or not sharp enough.
eyeglasses_not_allowedEyeglasses are not allowed.
sunglasses_not_allowedSunglasses are not allowed.
headwear_not_allowedHats or head coverings are not allowed.
face_mask_not_allowedA face mask is not allowed.
face_covering_foundA face covering was detected.
expression_not_neutralThe expression is not neutral.
crop_bottomNot enough space is visible below the shoulders.
crop_leftNot enough of the left shoulder is visible.
crop_rightNot enough of the right shoulder is visible.
head_turnedThe head is turned too far to the side.
head_tiltedThe head is tilted too far up or down.
not_in_colorThe photo must be in color.
otherThe photo did not meet a requirement.
  • Voorbeelden en definitieve versies worden uitsluitend aangeboden via door SVOYAGER gehoste, geauthenticeerde URL’s. Voor toegang zijn je API-sleutel en de juiste scope vereist — de onderliggende opslag wordt nooit openbaar gemaakt.
  • Geüploade afbeeldingen zijn privé en beperkt tot uw account en omgeving; uploaddoelen zijn van korte duur en voor eenmalig gebruik.
  • Foto’s uit documenten worden verwerkt om uw resultaat te genereren en worden niet gedeeld tussen accounts.

Zie de voorwaarden van SVOYAGER inzake gegevensverwerking, bewaring en verwijdering:Privacybeleid ·Partnerovereenkomst en voorwaarden