SVOYAGER ID Photo API
Verwandeln Sie jedes Foto in ein konformes Ausweis-, Reisepass- oder Visumfoto.
Übersicht
Funktionsweise
Die SVOYAGER ID Photo API verwandelt ein gewöhnliches Porträtfoto in ein normkonformes Passfoto. ID Photo ist ein einziges Produkt: Reisepass, Visum, Aufenthaltsgenehmigung und Personalausweis werden als Dokumentenspezifikationen dargestellt, nicht als separate Produkte. Sie laden ein Foto hoch, generieren eine Vorschau mit Wasserzeichen gemäß einer Spezifikation und finalisieren den Vorgang, um das Ergebnis ohne Wasserzeichen zu erhalten.
Vorschau → endgültiger Workflow
- 1Laden Sie ein Foto hoch. Erstellen Sie ein Upload-Ziel und senden Sie die Bildbytes dorthin.
- 2Erstellen Sie eine Sitzung. Erstellen Sie eine Vorschau mit Wasserzeichen anhand einer Spezifikation. Überprüfen Sie die zurückgemeldeten Probleme.
- 3Abschließen. Wandeln Sie die geprüfte Sitzung in einen Auftrag um und erhalten Sie die endgültige Version ohne Wasserzeichen.
Schnellstart
Jede Anfrage wird mit einem geheimen Bearer-Schlüssel authentifiziert. Starten Sie im Testmodus:
# 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 und Umgebungen
Alle Endpunkte werden unter einer einzigen Basis-URL bereitgestellt:
https://partner.svoyager.com/v1Es gibt keinen Umgebungspfad und keine Umgebungsparameter. Ob eine Anfrage im Test- oder Live-Modus ausgeführt wird, wird ausschließlich durch das Präfix Ihres API-Schlüssels bestimmt (svoy_sk_test_… vs. svoy_sk_live_…). Die Antworten geben dies als „livemode“ wieder.
Authentifizierung
API-Schlüssel
Authentifizieren Sie jede Anfrage mit einem „Authorization“-Header, der Ihren geheimen Schlüssel enthält. Die Schlüssel werden im Partner Center erstellt und regelmäßig aktualisiert.
Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxxDas Präfix gibt die Umgebung an: „svoy_sk_test_…“ für die Testumgebung, „svoy_sk_live_…“ für die Live-Umgebung. Ein Testschlüssel kann niemals auf Live-Daten zugreifen (und umgekehrt) – bei Nichtübereinstimmungen wird der Status 401 „wrong_environment“ zurückgegeben.
Gültigkeitsbereiche
Schlüssel sind mit expliziten, auf das Mindestmaß beschränkten Berechtigungsbereichen versehen. Eine Anfrage, bei der der erforderliche Berechtigungsbereich fehlt, führt zu dem Status 403 „insufficient_scope“.
| Gültigkeitsbereich | Berechtigungen |
|---|---|
| photo.specs.read | List and retrieve photo specifications. |
| photo.sessions.read | Retrieve sessions and their previews. |
| photo.sessions.write | Create uploads and photo sessions (previews). |
| photo.finalize.write | Finalize a session into a no-watermark order. |
| photo.orders.read | Retrieve orders and download finals. |
Sichere Aufbewahrung der Schlüssel
Geheime Schlüssel sind ausschließlich für die Kommunikation von Server zu Server bestimmt. Betten Sie einen geheimen Schlüssel niemals in Browser- oder Mobilcode, ein öffentliches Repository oder ein clientseitiges Bundle ein. Sollte ein Schlüssel offengelegt werden, ändern Sie ihn unverzüglich im Partner Center.
Endpunkte
Pflichtfelder sind mit * gekennzeichnet. In den Beispielen werden Platzhalter-Anmeldedaten verwendet – niemals echte Schlüssel.
/v1/uploadsUpload 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.
photo.sessions.write| Feld | Typ | Beschreibung |
|---|---|---|
| content_type* | string | MIME type of the image.image/jpegimage/pngimage/webpimage/heic |
- `upload_url` is single-use and expires; upload promptly and do not modify the URL.
# 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{
"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"
}| Status | Code | Wenn |
|---|---|---|
| 400 | missing_content_type | `content_type` was not provided. |
| 415 | unsupported_format | The content type is not an accepted image format. |
| 503 | temporarily_unavailable | Uploads are temporarily unavailable. |
| 502 | upload_init_failed | The upload could not be initialised — retry shortly. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/photo-sessionsCreate a photo session
Generate a watermarked preview from an upload against a specification. Spends one `preview` unit of your plan. Review `issues` before finalizing.
photo.sessions.write Idempotency-Key erforderlich| Feld | Typ | Beschreibung |
|---|---|---|
| upload_ref* | string | The `upload_ref` from Upload a photo. |
| spec_id* | string | The `photo_specification` id (`spc_…`) to render against. |
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"}'{
"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"
}| Status | Code | Wenn |
|---|---|---|
| 400 | missing_idempotency_key | The `Idempotency-Key` header is missing. |
| 400 | missing_upload_ref | `upload_ref` is missing. |
| 400 | missing_spec_id | `spec_id` is missing. |
| 400 | invalid_upload_ref | The referenced upload could not be read. |
| 413 | file_too_large | The uploaded file exceeds 10 MB. |
| 415 | unsupported_format | The uploaded file is not an accepted image format. |
| 404 | spec_not_found | No active specification matches `spec_id`. |
| 402 | no_active_plan | No active plan is assigned for this environment. |
| 402 | quota_exceeded | Included preview quota for the period is exhausted. |
| 402 | plan_inactive | The plan is not active for this environment. |
| 409 | idempotency_key_reuse | The key was reused with a different body. |
| 409 | request_in_progress | A request with this key is still processing. |
| 422 | unprocessable_image | The image could not be processed. |
| 502 | provider_error | The preview could not be generated upstream — retry shortly. |
| 503 | provider_busy | The processing service is busy — retry shortly. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/photo-sessions/{id}Retrieve a photo session
Fetch a session by id, including its current status, `preview_url`, and any `issues`.
photo.sessions.read| Feld | Typ | Beschreibung |
|---|---|---|
| id* | string | Session id. |
curl "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10" \
-H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx"{
"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"
}| Status | Code | Wenn |
|---|---|---|
| 404 | session_not_found | No session matches the id for this account/environment. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/photo-sessions/{id}/previewDownload 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.
photo.sessions.readGibt Bildbytes zurück| Feld | Typ | Beschreibung |
|---|---|---|
| id* | string | Session id. |
- Returns raw `image/*` bytes on success (not JSON).
curl "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10/preview" \
-H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx" \
--output preview.jpgBei Erfolg überträgt der Endpunkt die Rohdaten des Bildes (kein JSON). Speichern Sie den Antworttext in einer Datei.
| Status | Code | Wenn |
|---|---|---|
| 404 | preview_not_found | The session or its preview does not exist. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/photo-sessions/{id}/finalizeFinalize 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.
photo.finalize.write Idempotency-Key erforderlich| Feld | Typ | Beschreibung |
|---|---|---|
| id* | string | Session id to finalize. |
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"{
"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"
}| Status | Code | Wenn |
|---|---|---|
| 400 | missing_idempotency_key | The `Idempotency-Key` header is missing. |
| 404 | session_not_found | No session matches the id for this account/environment. |
| 422 | session_not_finalizable | The session is not in a finalizable state. |
| 402 | no_active_plan | No active plan is assigned for this environment. |
| 402 | quota_exceeded | Included final quota for the period is exhausted. |
| 402 | plan_inactive | The plan is not active for this environment. |
| 409 | idempotency_key_reuse | The key was reused with a different request. |
| 409 | request_in_progress | A request with this key is still processing. |
| 502 | provider_error | The final could not be produced upstream — retry shortly. |
| 503 | provider_busy | The processing service is busy — retry shortly. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/orders/{id}Retrieve an order
Fetch a finalized order by id, including its status and `final_url` once ready.
photo.orders.read| Feld | Typ | Beschreibung |
|---|---|---|
| id* | string | Order id. |
curl "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284" \
-H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx"{
"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"
}| Status | Code | Wenn |
|---|---|---|
| 404 | order_not_found | No order matches the id for this account/environment. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/orders/{id}/finalDownload 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.
photo.orders.readGibt Bildbytes zurück| Feld | Typ | Beschreibung |
|---|---|---|
| id* | string | Order id. |
- Returns raw `image/*` bytes on success (not JSON).
curl "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284/final" \
-H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx" \
--output final.jpgBei Erfolg überträgt der Endpunkt die Rohdaten des Bildes (kein JSON). Speichern Sie den Antworttext in einer Datei.
| Status | Code | Wenn |
|---|---|---|
| 404 | final_not_found | The order or its final does not exist. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/photo-specificationsList photo specifications
Return a cursor-paginated list of available photo specifications. Filter by country or document type to find the `spec_id` you need.
photo.specs.read| Feld | Typ | Beschreibung |
|---|---|---|
| limit | integer | Page size, 1–100 (default 20). |
| starting_after | string | A specification id (`spc_…`) to page after. |
| country | string | ISO-3166 alpha-2 filter, e.g. `US`. |
| document_type | string | Filter by document type, e.g. `passport`. |
curl -G "https://partner.svoyager.com/v1/photo-specifications" \
-H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx" \
--data-urlencode "country=US" \
--data-urlencode "limit=20"{
"object": "list",
"data": [
{
"object": "photo_specification",
"id": "spc_9wTv2c1Kd8Qe",
"name": "United States Passport"
}
],
"has_more": false,
"next_cursor": null
}Dieser Endpunkt gibt ausschließlich die unten aufgeführten Standardfehler zurück.
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
/v1/photo-specifications/{id}Retrieve a photo specification
Fetch a single specification by its stable `spec_id`, including its full requirements.
photo.specs.read| Feld | Typ | Beschreibung |
|---|---|---|
| id* | string | Specification id (`spc_…`). |
curl "https://partner.svoyager.com/v1/photo-specifications/spc_9wTv2c1Kd8Qe" \
-H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx"{
"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"
}| Status | Code | Wenn |
|---|---|---|
| 404 | spec_not_found | No active specification matches the id. |
Hinzu kommen die üblichen Fehlermeldungen zu Authentifizierung, Berechtigungen und Ratenbegrenzung – siehe Fehler & Wiederholungsversuche.
Senden Sie einen „Idempotency-Key“-Header (einen eindeutigen Wert, z. B. eine UUID), damit eine erneut gesendete Anfrage niemals doppelt abgerechnet oder doppelt verarbeitet wird. Dies ist erforderlich bei:
POST /v1/photo-sessionsPOST /v1/photo-sessions/{id}/finalize
- • Gleicher Schlüssel + gleicher Body → das ursprüngliche Ergebnis wird wiedergegeben (keine zweite Abrechnung, kein zweites Rendern).
- • Gleicher Schlüssel + anderer Body → 409 idempotency_key_reuse.
- • Bei einem wiederholbaren Fehler können Sie den Vorgang mit demselben Schlüssel, Body und „upload_ref“ erneut versuchen.
- • Gleichzeitige Abschlussanfragen für eine Sitzung dürfen niemals zwei Bestellungen erstellen oder belasten.
Eine Sitzung durchläuft verschiedene Vorschau-Zustände; eine Bestellung verschiedene Abschluss-Zustände.
preview_ready— Vorschau erstellt, keine Probleme.preview_has_issues— Vorschau mit Fehlern generiert.preview_failed— Die Vorschau konnte nicht erstellt werden.finalized— Die Sitzung wurde beendet.
final_ready— Die endgültige Version ist verfügbar.processing— Die Abschlussprüfung wird derzeit vorbereitet.failed— Finalisierung fehlgeschlagen.
Die Umgebung wird durch Ihr Schlüsselpräfix bestimmt – Clients können dieses niemals übergeben. Im Testmodus wird die echte Vorschau mit Wasserzeichen angezeigt, sodass Sie den tatsächlichen Ablauf testen können, jedoch wird die endgültige Version emuliert, sodass keine Live-Kontingente oder Produktionsrenderings verwendet werden.
| Aspekt | Test | Live |
|---|---|---|
| livemode | false | true |
| Vorschau | Echt, mit Wasserzeichen | Echt, mit Wasserzeichen |
| Abschließend | Sandbox-Emulation aus der Vorschau | Echt, ohne Wasserzeichen |
| sandbox_emulated | true | false |
| watermarked | true | false |
| Verbrauchte Quote | Nur Testkontingent | Nur Live-Kontingent |
Ihr Tarif umfasst eine bestimmte Anzahl an Vorschauen und Endversionen pro Zeitraum, die separat gezählt werden. Das Erstellen einer Sitzung verbraucht eine Vorschau; das Finalisieren verbraucht eine Endversion. Das Kontingent wird vor der Verarbeitung atomar reserviert.
- Wenn die enthaltene Vorschau oder das endgültige Kontingent aufgebraucht ist, gibt die Anfrage den Status 402 „quota_exceeded“ zurück.
- 402 ist ein endgültiger Stopp – ein erneuter Versuch wird erst ab dem nächsten Zeitraum oder nach einer Planänderung erfolgreich sein.
- Test- und Live-Kontingente sind vollständig voneinander unabhängig.
Jeder Fehler verwendet einen Envelope. Die `request_id` erscheint auch im Antwort-Header `X-Request-Id` – fügen Sie diese in Support-Anfragen ein.
{
"error": {
"type": "invalid_request_error",
"code": "quota_exceeded",
"message": "Your included final quota for this period is exhausted.",
"request_id": "req_9wTv2c1Kd8QeR7"
}
}Standardfehler (alle Endpunkte)
| Status | Code | Wenn |
|---|---|---|
| 401 | invalid_api_key | Missing, malformed, or unknown API key. |
| 401 | revoked_api_key | The key was revoked. |
| 401 | expired_api_key | The key passed its rotation grace period. |
| 401 | wrong_environment | A test key was used on live traffic (or vice versa). |
| 403 | client_disabled | The API client is disabled. |
| 403 | api_access_revoked | API access for the account is not active. |
| 403 | insufficient_scope | The key lacks the required scope for this endpoint. |
| 429 | rate_limited | Per-key rate limit exceeded. Honour `Retry-After`. |
422 wird nur bei einem bestätigten Bildproblem zurückgegeben. 402 bedeutet, dass das Kontingent ausgeschöpft ist. 409 steht für einen Idempotenz- oder Ressourcenkonflikt.
429 bedeutet, dass Sie das Ratenlimit pro Schlüssel erreicht haben – beachten Sie den „Retry-After“-Header. Bei 502/503 und anderen 5xx-Fehlern versuchen Sie es erneut mit Backoff und demselben „Idempotency-Key“.
Eine Vorschau kann null oder mehr Fehler zurückgeben, jeweils bestehend aus einem stabilen Code und einer Meldung. Zeigen Sie diese dem Endnutzer an, damit er das Foto erneut aufnehmen kann. Ein nicht erkanntes Upstream-Signal wird als „other“ klassifiziert.
| Code | Nachricht |
|---|---|
| face_not_found | No face was detected in the photo. |
| uneven_lighting | Lighting on the face is uneven. |
| poor_brightness | Face brightness is too dark, too bright, or the photo is low quality. |
| low_sharpness | The photo is blurry or not sharp enough. |
| eyeglasses_not_allowed | Eyeglasses are not allowed. |
| sunglasses_not_allowed | Sunglasses are not allowed. |
| headwear_not_allowed | Hats or head coverings are not allowed. |
| face_mask_not_allowed | A face mask is not allowed. |
| face_covering_found | A face covering was detected. |
| expression_not_neutral | The expression is not neutral. |
| crop_bottom | Not enough space is visible below the shoulders. |
| crop_left | Not enough of the left shoulder is visible. |
| crop_right | Not enough of the right shoulder is visible. |
| head_turned | The head is turned too far to the side. |
| head_tilted | The head is tilted too far up or down. |
| not_in_color | The photo must be in color. |
| other | The photo did not meet a requirement. |
- • Vorschauen und endgültige Versionen werden ausschließlich über von SVOYAGER gehostete, authentifizierte URLs bereitgestellt. Für den Zugriff sind Ihr API-Schlüssel und der richtige Geltungsbereich erforderlich – der zugrunde liegende Speicher wird niemals öffentlich zugänglich gemacht.
- • Hochgeladene Bilder sind privat und auf Ihr Konto und Ihre Umgebung beschränkt; Upload-Ziele sind kurzlebig und nur einmal verwendbar.
- • Fotos aus Dokumenten werden zur Erstellung Ihres Ergebnisses verarbeitet und nicht zwischen Konten weitergegeben.
Siehe die Bestimmungen von SVOYAGER zur Datenverarbeitung, -aufbewahrung und -löschung:Datenschutzerklärung ·Partnervereinbarung und Nutzungsbedingungen