SVOYAGER ID Photo API
הפכו כל תמונה לתמונת זיהוי / דרכון / ויזה תואמת.
סקירה כללית
מה זה עושה
SVOYAGER ID Photo API הופך תמונת פורטרט רגילה לתמונת מסמך תואמת. ID Photo הוא מוצר יחיד: דרכון, ויזה, היתר שהייה ותעודת זהות לאומית מיוצגים כמפרטי מסמכים, ולא כמוצרים נפרדים. אתם מעלים תמונה, מייצרים תצוגה מקדימה עם סימן מים בהתאם למפרט, ולאחר מכן משלימים את התהליך כדי לקבל את התוצאה ללא סימן מים.
תצוגה מקדימה → זרימת עבודה סופית
- 1העלו תמונה. צרו יעד העלאה ושלחו אליו את בתים התמונה.
- 2יצירת סשן. הציגו תצוגה מקדימה עם סימן מים בהתאם למפרט. בדקו את הבעיות שהוחזרו.
- 3סיום. הפכו את ההקלטת שנבדקה להזמנה וקבלו את הגרסה הסופית ללא סימן מים.
התחלה מהירה
כל בקשה מאומתת באמצעות מפתח סודי מסוג Bearer. התחילו במצב בדיקה:
# 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"URL בסיסי וסביבות
כל נקודות הקצה מוגשות תחת כתובת URL בסיסית אחת:
https://partner.svoyager.com/v1אין נתיב או פרמטר סביבה. השאלה אם בקשה פועלת בסביבת בדיקה או בסביבת ייצור נקבעת אך ורק על פי קידומת מפתח ה-API שלכם (svoy_sk_test_… לעומת svoy_sk_live_…). התגובות משקפות זאת כ-livemode.
אימות
מפתחות API
אמת כל בקשה באמצעות כותרת Authorization המכילה את המפתח הסודי שלך. המפתחות נוצרים ומחליפים ביניהם במרכז השותפים.
Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxxהקידומת בוחרת את הסביבה: svoy_sk_test_… עבור סביבת בדיקה, svoy_sk_live_… עבור סביבת ייצור. מפתח בדיקה לעולם לא יכול לפעול על נתוני ייצור (ולהפך) — אי-התאמות מחזירות את השגיאה 401 wrong_environment.
היקפים
למפתחות יש תחומי הרשאה מפורשים של "הרשאה מינימלית". בקשה שחסר בה תחום ההרשאה הנדרש מחזירה שגיאה 403 insufficient_scope.
| היקף | הרשאות |
|---|---|
| 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. |
שמירה על אבטחת המפתחות
מפתחות סודיים מיועדים לתקשורת בין שרתים בלבד. לעולם אל תשלב מפתח סודי בקוד דפדפן או נייד, במאגר ציבורי או בחבילה בצד הלקוח. אם מפתח נחשף, החלף אותו מיד במרכז השותפים.
נקודות קצה
שדות חובה מסומנים ב-*. בדוגמאות נעשה שימוש בפרטי הזדהות דמה — לעולם לא במפתחות אמיתיים.
/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| שדה | סוג | תיאור |
|---|---|---|
| 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"
}| סטטוס | קוד | כאשר |
|---|---|---|
| 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. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/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 נדרש| שדה | סוג | תיאור |
|---|---|---|
| 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"
}| סטטוס | קוד | כאשר |
|---|---|---|
| 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. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/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| שדה | סוג | תיאור |
|---|---|---|
| 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"
}| סטטוס | קוד | כאשר |
|---|---|---|
| 404 | session_not_found | No session matches the id for this account/environment. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/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.readמחזיר את בתים של התמונה| שדה | סוג | תיאור |
|---|---|---|
| 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.jpgבמקרה של הצלחה, נקודת הקצה מעבירה בתים גולמיים של תמונה (לא ב-JSON). שמרו את גוף התגובה בקובץ.
| סטטוס | קוד | כאשר |
|---|---|---|
| 404 | preview_not_found | The session or its preview does not exist. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/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 נדרש| שדה | סוג | תיאור |
|---|---|---|
| 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"
}| סטטוס | קוד | כאשר |
|---|---|---|
| 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. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/v1/orders/{id}Retrieve an order
Fetch a finalized order by id, including its status and `final_url` once ready.
photo.orders.read| שדה | סוג | תיאור |
|---|---|---|
| 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"
}| סטטוס | קוד | כאשר |
|---|---|---|
| 404 | order_not_found | No order matches the id for this account/environment. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/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.readמחזיר את בתים של התמונה| שדה | סוג | תיאור |
|---|---|---|
| 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.jpgבמקרה של הצלחה, נקודת הקצה מעבירה בתים גולמיים של תמונה (לא ב-JSON). שמרו את גוף התגובה בקובץ.
| סטטוס | קוד | כאשר |
|---|---|---|
| 404 | final_not_found | The order or its final does not exist. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/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| שדה | סוג | תיאור |
|---|---|---|
| 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
}נקודת קצה זו מחזירה רק את השגיאות הסטנדרטיות המפורטות להלן.
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
/v1/photo-specifications/{id}Retrieve a photo specification
Fetch a single specification by its stable `spec_id`, including its full requirements.
photo.specs.read| שדה | סוג | תיאור |
|---|---|---|
| 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"
}| סטטוס | קוד | כאשר |
|---|---|---|
| 404 | spec_not_found | No active specification matches the id. |
בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.
יש לשלוח כותרת Idempotency-Key (ערך ייחודי, למשל UUID) כדי שבקשת ניסיון חוזר לעולם לא תחויב או תעובד פעמיים. הדבר נדרש ב:
POST /v1/photo-sessionsPOST /v1/photo-sessions/{id}/finalize
- • אותו מפתח + אותו גוף הבקשה → התוצאה המקורית משוחזרת (ללא חיוב נוסף, ללא טעינה נוספת).
- • אותו מפתח + גוף בקשה שונה → 409 idempotency_key_reuse.
- • שגיאה הניתנת לניסיון חוזר מאפשרת לך לנסות שוב עם אותו מפתח, גוף בקשה ו-upload_ref.
- • בקשות סיום מקבילות עבור סשן אחד לעולם אינן יכולות ליצור או לחייב שתי הזמנות.
הפעלה עוברת בין מצבי תצוגה מקדימה; הזמנה עוברת בין מצבי השלמה.
preview_ready— תצוגה מקדימה נוצרה, ללא בעיות.preview_has_issues— תצוגה מקדימה שנוצרה עם בעיות.preview_failed— לא ניתן היה להציג את התצוגה המקדימה.finalized— הפעלה הסתיימה.
final_ready— הגרסה הסופית זמינה.processing— הגרסה הסופית נמצאת בהכנה.failed— השלמת התהליך נכשלה.
הסביבה נקבעת על פי קידומת המפתח שלכם — לקוחות לעולם אינם יכולים להעביר אותה. מצב הבדיקה מריץ את התצוגה המקדימה האמיתית עם סימן המים, כך שתוכלו לתרגל את הזרימה האמיתית, אך מדמה את התוצאה הסופית, כך שלא נעשה שימוש במכסת זמן אמת או בעיבוד סופי.
| היבט | בדיקה | בזמן אמת |
|---|---|---|
| livemode | false | true |
| תצוגה מקדימה | אמיתי, עם סימן מים | אמיתי, עם סימן מים |
| סופי | מדומה בסביבת Sandbox מתוך התצוגה המקדימה | אמיתי, ללא סימן מים |
| sandbox_emulated | true | false |
| watermarked | true | false |
| מכסה שנוצלה | מכסת בדיקה בלבד | רק מכסת זמן אמת |
התוכנית שלכם כוללת מספר תצוגות מקדימות וגרסאות סופיות לכל תקופה, הנספרים בנפרד. יצירת סשן צורכת תצוגה מקדימה אחת; השלמת הסשן צורכת גרסה סופית אחת. המכסה נשמרת באופן אטומי לפני העיבוד.
- כאשר מכסת התצוגה המקדימה או המכסה הסופית כלולה מנוצלת במלואה, הבקשה מחזירה 402 quota_exceeded.
- 402 הוא עצירה מוחלטת — ניסיון חוזר לא יצליח עד לתקופה הבאה או עד לשינוי התוכנית.
- מכסות הבדיקה והמכסות בפועל הן בלתי תלויות לחלוטין.
כל שגיאה משתמשת במעטפה אחת. ה-request_id מופיע גם בכותרת התגובה X-Request-Id — יש לכלול אותו בבקשות לתמיכה.
{
"error": {
"type": "invalid_request_error",
"code": "quota_exceeded",
"message": "Your included final quota for this period is exhausted.",
"request_id": "req_9wTv2c1Kd8QeR7"
}
}שגיאות סטנדרטיות (כל נקודות הקצה)
| סטטוס | קוד | כאשר |
|---|---|---|
| 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 מוחזר רק במקרה של בעיה מאושרת בתמונה. 402 פירושו שהמכסה נוצלה במלואה. 409 הוא קונפליקט של אידמפוטנטיות או משאבים.
429 פירושו שהגעת למגבלת הקצב לכל מפתח — יש לכבד את הכותרת Retry-After. עבור 502/503 ושאר שגיאות 5xx, נסה שוב עם מרווח זמן (backoff) ואותו Idempotency-Key.
תצוגה מקדימה עשויה להחזיר אפס או יותר בעיות, שכל אחת מהן כוללת קוד יציב + הודעה. הציגו אותן למשתמש הקצה כדי שיוכל לצלם את התמונה מחדש. אות לא מזוהה במעלה הזרם יירד לדרגת "אחר".
| קוד | הודעה |
|---|---|
| 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. |
- • תצוגות מקדימות וגרסאות סופיות מוצגות אך ורק מכתובות URL מאומתות המארחות על ידי SVOYAGER. הגישה דורשת את מפתח ה-API שלכם ואת ההיקף הנכון — האחסון הבסיסי לעולם אינו נחשף בפומבי.
- • תמונות שהועלו הן פרטיות ומוגבלות לחשבונך ולסביבתך; יעדי ההעלאה הם זמניים ומיועדים לשימוש חד-פעמי.
- • תמונות המסמכים מעובדות כדי להפיק את התוצאה שלך ואינן משותפות בין חשבונות.
ראו את תנאי עיבוד הנתונים, שמירתם ומחיקתם של SVOYAGER:מדיניות פרטיות ·הסכם שותפות ותנאים