ID PhotoREST · JSONOpenAPI 3.1

SVOYAGER ID Photo API

あらゆる写真を、規定に準拠したID写真・パスポート写真・ビザ用写真に変換します。

概要

機能の説明

SVOYAGERのID Photo APIは、通常のポートレート写真を規格に準拠した証明写真に変換します。ID Photoは単一の製品であり、パスポート、ビザ、居住許可証、国民IDは、個別の製品ではなく、証明書類の仕様として扱われます。 写真をアップロードし、仕様に基づいて透かし入りのプレビューを生成した後、確定処理を行って透かしのない結果を取得します。

プレビュー → 最終ワークフロー

  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"
}
エラー
ステータスコードWhen
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"
}
エラー
ステータスコードWhen
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"
}
エラー
ステータスコードWhen
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ではない)をストリームで返します。レスポンス本文をファイルに保存してください。

エラー
ステータスコードWhen
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"
}
エラー
ステータスコードWhen
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"
}
エラー
ステータスコードWhen
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ではない)をストリームで返します。レスポンス本文をファイルに保存してください。

エラー
ステータスコードWhen
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"
}
エラー
ステータスコードWhen
404spec_not_foundNo active specification matches the id.

さらに、標準的な認証、権限、レート制限に関するエラーも含まれます — 詳細は エラーと再試行.

再試行されたリクエストで二重課金や二重処理が発生しないよう、Idempotency-Keyヘッダー(一意の値、例:UUID)を送信してください。これは以下の場合に必須です:

  • POST /v1/photo-sessions
  • POST /v1/photo-sessions/{id}/finalize
  • 同じキー + 同じボディ → 元の結果が再再生されます(2回目の課金や2回目のレンダリングは発生しません)。
  • 同じキー+異なるボディ → 409 idempotency_key_reuse。
  • 再試行可能なエラーの場合、同じキー、ボディ、および upload_ref を使用して再試行できます。
  • 1つのセッションにおける同時処理中のリクエストの完了によって、2つの注文が作成されたり課金されたりすることは決してありません。

セッションはプレビュー状態を順次通過し、注文は確定状態を順次通過します。

セッションステータス
  • preview_readyプレビューが生成されました。問題はありません。
  • preview_has_issues課題に基づいて生成されたプレビュー。
  • preview_failedプレビューを生成できませんでした。
  • finalizedセッションが終了しました。
注文状況
  • final_ready最終版が利用可能です。
  • processing最終版は現在準備中です。
  • failed確定に失敗しました。

環境はキーのプレフィックスによって決定されます。クライアントがこれを渡すことは決してありません。テストモードでは、実際の透かし入りプレビューが実行されるため、実際のフローを検証できますが、最終的な処理をエミュレートするため、本番環境のクォータや本番レンダリングは使用されません。

アスペクトテストライブ
livemodefalsetrue
プレビュー実データ、透かし入り実データ、透かし入り
最終版プレビュー版からサンドボックスでエミュレート本物、透かしなし
sandbox_emulatedtruefalse
watermarkedtruefalse
消費されたクォータクォータのテストのみライブクォータのみ

ご契約プランには、期間ごとにプレビューとファイナルの各割り当て数が含まれており、これらは別々にカウントされます。セッションの作成にはプレビューが1回、確定にはファイナルが1回消費されます。割り当ては処理前にアトミックに予約されます。

  • 含まれるプレビューまたは最終クォータが使い切られた場合、リクエストは 402 quota_exceeded を返します。
  • 402は完全な停止状態です。次の期間が始まるか、プランが変更されるまで、再試行しても成功しません。
  • テスト環境と本番環境のクォータは完全に独立しています。

エラーごとに1つのエンベロープが使用されます。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"
  }
}

標準エラー(すべてのエンドポイント)

ステータスコードWhen
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エラーの場合は、バックオフを行い、同じIdempotency-Keyを使用して再試行してください。

プレビューでは、0件以上の問題が返される可能性があります。各問題は、安定したコードとメッセージで構成されます。エンドユーザーにこれらを表示し、写真を再撮影できるようにしてください。認識されないアップストリーム信号は、「other」として扱われます。

コードメッセージ
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.
  • プレビューおよび最終版は、SVOYAGERがホストする認証済みURLからのみ提供されます。アクセスにはAPIキーと正しいスコープが必要です。基盤となるストレージが一般に公開されることは決してありません。
  • アップロードされた画像は非公開であり、アカウントおよび環境に限定されます。アップロード先の一時的なリソースは短期間しか存続せず、1回限りの使用となります。
  • ドキュメントの写真は、結果を生成するために処理されるものであり、アカウント間で共有されることはありません。

SVOYAGERのデータ処理、保存、および削除に関する規約を参照してください:プライバシーポリシー ·パートナー契約および利用規約