ID PhotoREST · JSONOpenAPI 3.1

SVOYAGER ID Photo API

הפכו כל תמונה לתמונת זיהוי / דרכון / ויזה תואמת.

סקירה כללית

מה זה עושה

SVOYAGER ID Photo API הופך תמונת פורטרט רגילה לתמונת מסמך תואמת. ID Photo הוא מוצר יחיד: דרכון, ויזה, היתר שהייה ותעודת זהות לאומית מיוצגים כמפרטי מסמכים, ולא כמוצרים נפרדים. אתם מעלים תמונה, מייצרים תצוגה מקדימה עם סימן מים בהתאם למפרט, ולאחר מכן משלימים את התהליך כדי לקבל את התוצאה ללא סימן מים.

תצוגה מקדימה → זרימת עבודה סופית

  1. 1העלו תמונה. צרו יעד העלאה ושלחו אליו את בתים התמונה.
  2. 2יצירת סשן. הציגו תצוגה מקדימה עם סימן מים בהתאם למפרט. בדקו את הבעיות שהוחזרו.
  3. 3סיום. הפכו את ההקלטת שנבדקה להזמנה וקבלו את הגרסה הסופית ללא סימן מים.

התחלה מהירה

כל בקשה מאומתת באמצעות מפתח סודי מסוג Bearer. התחילו במצב בדיקה:

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"

URL בסיסי וסביבות

כל נקודות הקצה מוגשות תחת כתובת URL בסיסית אחת:

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

אין נתיב או פרמטר סביבה. השאלה אם בקשה פועלת בסביבת בדיקה או בסביבת ייצור נקבעת אך ורק על פי קידומת מפתח ה-API שלכם (svoy_sk_test_… לעומת svoy_sk_live_…). התגובות משקפות זאת כ-livemode.

אימות

מפתחות API

אמת כל בקשה באמצעות כותרת Authorization המכילה את המפתח הסודי שלך. המפתחות נוצרים ומחליפים ביניהם במרכז השותפים.

Header
Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx

הקידומת בוחרת את הסביבה: svoy_sk_test_… עבור סביבת בדיקה, svoy_sk_live_… עבור סביבת ייצור. מפתח בדיקה לעולם לא יכול לפעול על נתוני ייצור (ולהפך) — אי-התאמות מחזירות את השגיאה 401 wrong_environment.

היקפים

למפתחות יש תחומי הרשאה מפורשים של "הרשאה מינימלית". בקשה שחסר בה תחום ההרשאה הנדרש מחזירה שגיאה 403 insufficient_scope.

היקףהרשאות
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.

שמירה על אבטחת המפתחות

מפתחות סודיים מיועדים לתקשורת בין שרתים בלבד. לעולם אל תשלב מפתח סודי בקוד דפדפן או נייד, במאגר ציבורי או בחבילה בצד הלקוח. אם מפתח נחשף, החלף אותו מיד במרכז השותפים.

API ליבה

נקודות קצה

שדות חובה מסומנים ב-*. בדוגמאות נעשה שימוש בפרטי הזדהות דמה — לעולם לא במפתחות אמיתיים.

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
בקשה
גוף ההודעה (application/json)
שדהסוגתיאור
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.
דוגמה לבקשה
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
תגובה · 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"
}
שגיאות
סטטוסקודכאשר
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.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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 נדרש
בקשה
גוף ההודעה (application/json)
שדהסוגתיאור
upload_ref*stringThe `upload_ref` from Upload a photo.
spec_id*stringThe `photo_specification` id (`spc_…`) to render against.
דוגמה לבקשה
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"}'
תגובה · 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"
}
שגיאות
סטטוסקודכאשר
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.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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
בקשה
פרמטרי נתיב
שדהסוגתיאור
id*stringSession id.
דוגמה לבקשה
curl
curl "https://partner.svoyager.com/v1/photo-sessions/3f9c1e77-2b8a-4a1e-9d2c-6b5a4c3d2e10" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx"
תגובה · 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"
}
שגיאות
סטטוסקודכאשר
404session_not_foundNo session matches the id for this account/environment.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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.readמחזיר את בתים של התמונה
בקשה
פרמטרי נתיב
שדהסוגתיאור
id*stringSession id.
  • Returns raw `image/*` bytes on success (not JSON).
דוגמה לבקשה
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
תגובה · 200

במקרה של הצלחה, נקודת הקצה מעבירה בתים גולמיים של תמונה (לא ב-JSON). שמרו את גוף התגובה בקובץ.

שגיאות
סטטוסקודכאשר
404preview_not_foundThe session or its preview does not exist.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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 נדרש
בקשה
פרמטרי נתיב
שדהסוגתיאור
id*stringSession id to finalize.
דוגמה לבקשה
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"
תגובה · 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"
}
שגיאות
סטטוסקודכאשר
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.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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
בקשה
פרמטרי נתיב
שדהסוגתיאור
id*stringOrder id.
דוגמה לבקשה
curl
curl "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284" \
  -H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx"
תגובה · 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"
}
שגיאות
סטטוסקודכאשר
404order_not_foundNo order matches the id for this account/environment.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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.readמחזיר את בתים של התמונה
בקשה
פרמטרי נתיב
שדהסוגתיאור
id*stringOrder id.
  • Returns raw `image/*` bytes on success (not JSON).
דוגמה לבקשה
curl
curl "https://partner.svoyager.com/v1/orders/8a2d5b40-71c6-4f0e-b3a9-1e7c9d05f284/final" \
  -H "Authorization: Bearer svoy_sk_live_A8m4Qz1YOURKEYHERExxxxxxx" \
  --output final.jpg
תגובה · 200

במקרה של הצלחה, נקודת הקצה מעבירה בתים גולמיים של תמונה (לא ב-JSON). שמרו את גוף התגובה בקובץ.

שגיאות
סטטוסקודכאשר
404final_not_foundThe order or its final does not exist.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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
בקשה
פרמטרי שאילתה
שדהסוגתיאור
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`.
דוגמה לבקשה
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"
תגובה · 200
200 · application/json
{
  "object": "list",
  "data": [
    {
      "object": "photo_specification",
      "id": "spc_9wTv2c1Kd8Qe",
      "name": "United States Passport"
    }
  ],
  "has_more": false,
  "next_cursor": null
}
שגיאות

נקודת קצה זו מחזירה רק את השגיאות הסטנדרטיות המפורטות להלן.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

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
בקשה
פרמטרי נתיב
שדהסוגתיאור
id*stringSpecification id (`spc_…`).
דוגמה לבקשה
curl
curl "https://partner.svoyager.com/v1/photo-specifications/spc_9wTv2c1Kd8Qe" \
  -H "Authorization: Bearer svoy_sk_test_R2p9Kx7YOURKEYHERExxxxxxx"
תגובה · 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"
}
שגיאות
סטטוסקודכאשר
404spec_not_foundNo active specification matches the id.

בנוסף, שגיאות אימות, הרשאה והגבלת קצב סטנדרטיות — ראו שגיאות וניסיונות חוזרים.

יש לשלוח כותרת Idempotency-Key (ערך ייחודי, למשל UUID) כדי שבקשת ניסיון חוזר לעולם לא תחויב או תעובד פעמיים. הדבר נדרש ב:

  • POST /v1/photo-sessions
  • POST /v1/photo-sessions/{id}/finalize
  • אותו מפתח + אותו גוף הבקשה → התוצאה המקורית משוחזרת (ללא חיוב נוסף, ללא טעינה נוספת).
  • אותו מפתח + גוף בקשה שונה → 409 idempotency_key_reuse.
  • שגיאה הניתנת לניסיון חוזר מאפשרת לך לנסות שוב עם אותו מפתח, גוף בקשה ו-upload_ref.
  • בקשות סיום מקבילות עבור סשן אחד לעולם אינן יכולות ליצור או לחייב שתי הזמנות.

הפעלה עוברת בין מצבי תצוגה מקדימה; הזמנה עוברת בין מצבי השלמה.

סטטוס הפעלה
  • preview_readyתצוגה מקדימה נוצרה, ללא בעיות.
  • preview_has_issuesתצוגה מקדימה שנוצרה עם בעיות.
  • preview_failedלא ניתן היה להציג את התצוגה המקדימה.
  • finalizedהפעלה הסתיימה.
סטטוס ההזמנה
  • final_readyהגרסה הסופית זמינה.
  • processingהגרסה הסופית נמצאת בהכנה.
  • failedהשלמת התהליך נכשלה.

הסביבה נקבעת על פי קידומת המפתח שלכם — לקוחות לעולם אינם יכולים להעביר אותה. מצב הבדיקה מריץ את התצוגה המקדימה האמיתית עם סימן המים, כך שתוכלו לתרגל את הזרימה האמיתית, אך מדמה את התוצאה הסופית, כך שלא נעשה שימוש במכסת זמן אמת או בעיבוד סופי.

היבטבדיקהבזמן אמת
livemodefalsetrue
תצוגה מקדימהאמיתי, עם סימן מיםאמיתי, עם סימן מים
סופימדומה בסביבת Sandbox מתוך התצוגה המקדימהאמיתי, ללא סימן מים
sandbox_emulatedtruefalse
watermarkedtruefalse
מכסה שנוצלהמכסת בדיקה בלבדרק מכסת זמן אמת

התוכנית שלכם כוללת מספר תצוגות מקדימות וגרסאות סופיות לכל תקופה, הנספרים בנפרד. יצירת סשן צורכת תצוגה מקדימה אחת; השלמת הסשן צורכת גרסה סופית אחת. המכסה נשמרת באופן אטומי לפני העיבוד.

  • כאשר מכסת התצוגה המקדימה או המכסה הסופית כלולה מנוצלת במלואה, הבקשה מחזירה 402 quota_exceeded.
  • 402 הוא עצירה מוחלטת — ניסיון חוזר לא יצליח עד לתקופה הבאה או עד לשינוי התוכנית.
  • מכסות הבדיקה והמכסות בפועל הן בלתי תלויות לחלוטין.

כל שגיאה משתמשת במעטפה אחת. ה-request_id מופיע גם בכותרת התגובה X-Request-Id — יש לכלול אותו בבקשות לתמיכה.

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

שגיאות סטנדרטיות (כל נקודות הקצה)

סטטוסקודכאשר
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 מוחזר רק במקרה של בעיה מאושרת בתמונה. 402 פירושו שהמכסה נוצלה במלואה. 409 הוא קונפליקט של אידמפוטנטיות או משאבים.

429 פירושו שהגעת למגבלת הקצב לכל מפתח — יש לכבד את הכותרת Retry-After. עבור 502/503 ושאר שגיאות 5xx, נסה שוב עם מרווח זמן (backoff) ואותו Idempotency-Key.

תצוגה מקדימה עשויה להחזיר אפס או יותר בעיות, שכל אחת מהן כוללת קוד יציב + הודעה. הציגו אותן למשתמש הקצה כדי שיוכל לצלם את התמונה מחדש. אות לא מזוהה במעלה הזרם יירד לדרגת "אחר".

קודהודעה
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.
  • תצוגות מקדימות וגרסאות סופיות מוצגות אך ורק מכתובות URL מאומתות המארחות על ידי SVOYAGER. הגישה דורשת את מפתח ה-API שלכם ואת ההיקף הנכון — האחסון הבסיסי לעולם אינו נחשף בפומבי.
  • תמונות שהועלו הן פרטיות ומוגבלות לחשבונך ולסביבתך; יעדי ההעלאה הם זמניים ומיועדים לשימוש חד-פעמי.
  • תמונות המסמכים מעובדות כדי להפיק את התוצאה שלך ואינן משותפות בין חשבונות.

ראו את תנאי עיבוד הנתונים, שמירתם ומחיקתם של SVOYAGER:מדיניות פרטיות ·הסכם שותפות ותנאים