- エラーを検出する方法
- FORBIDDEN エラー
- BAD_USER_INPUT エラー
- 必須フィールドの不足
- 無効な日時
- 無効な国コード
- 無効な通貨コード
- 無効な電話番号
- 文字列長の上限超過
- GRAPHQL_PARSE_FAILED エラー
- HTTP 429 Too Many Requests
- フィードタイプのエラー
- このフィード上のすべての求人で
seatsが必要です - このフィード上のどの求人でも
seatsを含めることはできません - 連絡先の検証エラー
"contact"タイプの連絡先が見つかりません"contact"タイプの連絡先が複数見つかりました- 給与の検証エラー
- 最大額を最小額より小さくすることはできません
- 重複エントリのエラー
- リ クエストに重複する求人エントリが含まれています
- リクエストに重複する勤務地エントリが含まれています
- 複数勤務地の検証エラー
- すべての勤務地情報は同じ国に配置する必要があります
- 勤務地の検証エラー
remoteTypeが"Fully Remote"ではない場合、cityRegionPostalをnullにすることはできません- 求人ライフサイクルの問題
- 作成した求人が Indeed に表示されません
- 求人を再開できません
- 求人は自動では掲載終了しません
- 再試行戦略
- 再試行可能なエラー
- ベストプラクティス
- サポートを受ける
Job Sync API エラーのトラブルシューティング
よくある Job Sync API エラーと、その解決方法を説明します。
エラーを検出する方法
Job Sync API は、次の方法でエラーを返します。
- HTTP ステータスコード: レート制限(HTTP
429)とネットワークレベルの障害の場合のみ返されます。 - GraphQL の
errors配列: ほとんどのエラーは HTTP200を返し、レスポンスボディ内のエラー詳細を返します。
HTTP 200 の場合でも、レスポンスボディの errors 配列を必ず確認してください。
{ "data": null, "errors": [{ "message": "Error description", "extensions": { "code": "BAD_USER_INPUT", "classification": "ValidationError" } }]}extensions.code フィールドには、エラーの種類(FORBIDDEN、BAD_USER_INPUT、GRAPHQL_PARSE_FAILED など)が含まれます。
FORBIDDEN エラー
message | Client is not authorized |
|---|---|
code | FORBIDDEN |
| 概要 | アクセストークンがない、無効である、有効期限が切れている、または必要な権限がありません。 |
FORBIDDEN コードとともに返される Client is not authorized メッセージは、OAuth クライアントに Job Sync API の認可がないことを示します。
{ "data": null, "errors": [{ "extensions": { "code": "FORBIDDEN" }, "message": "Client is not authorized." }]}解決方法:
Authorizationヘッダーの形式がAuthorization: Bearer <YOUR_ACCESS_TOKEN>であることを確認します。- トークンの有効期限が切れていないことを確認します。トークンの有効期間は 1 時間です。
- API へのアクセス権を確認するため、Indeed 担当者に連絡します。
- OAuth アプリケーションに Job Sync API の権限があることを確認します。
sourceNameが登録済みのフィードと一致していることを確認します。
BAD_USER_INPUT エラー
message | Exception while fetching data |
|---|---|
code | BAD_USER_INPUT |
| 概要 | クライアントから送信されたデータが無効です。 |
BAD_USER_INPUT の検証エラーは、リクエストに無効なデータが含まれている場合に発生します。
無効な電話番号の例:
{ "errors": [{ "extensions": { "code": "BAD_USER_INPUT", "classification": "ValidationError" }, "message": "Validation error (WrongType@[jobsIngest/createSourcedJobPostings]) : argument 'input.jobPostings[0].metadata.contacts[0].contactInfo.contactPhone' with value 'StringValue{value='5551234567'}' is not a valid 'PhoneNumber' - String value `5551234567` is not a valid E.164 phone number" }]}BAD_USER_INPUT エラーの一般的な原因:
必須フィールドの不足
エラーメッセージには、不足しているフィールドが示されます。必須フィールドは次のとおりです。
| セクション | 必須フィールド |
|---|---|
body | title、description、benefits(空の配列でも可)、location.country |
metadata | jobPostingId、jobSource.sourceName、datePublished、contacts(少なくとも 1 つ) |
無効な日時
DateTime の値では、タイムゾーン付きの RFC 3339 形式を使用する必要があります。
| 形式 | 有効か |
|---|---|
2024-01-15T10:30:00-05:00 | はい |
2024-01-15T15:30:00Z | はい |
2024-01-15 | いいえ(時刻がありません) |
01/15/2024 10:30 | いいえ(形式が正しくありません) |
無効な国コード
国コードでは、ISO-3166-1 alpha-2 形式(大文字 2 文字)を使用する必要があります。
| 形式 | 有効か |
|---|---|
US | はい |
USA | いいえ(2 文字のコードを使用してください) |
us | いいえ(大文字である必要があります) |
無効な通貨コード
通貨コードでは、ISO-4217 形式(大文字 3 文字)を使用する必要があります。
| 形式 | 有効か |
|---|---|
USD | はい |
$ | いいえ(ISO コードを使用してください) |
usd | いいえ(大文字である必要があります) |
無効な電話番号
電話番号では、E.164 形式を使用する必要があります。
| 形式 | 有効か |
|---|---|
+15125551234 | はい |
512-555-1234 | いいえ(国コードがなく、ダッシュを含めることはできません) |
(512) 555-1234 | いいえ(書式指定文字は使用できません) |
文字列長の上限超過
| フィールド | 最大長 |
|---|---|
title | 255 文字 |
description | 65,000 バイト |
seatPostingId | 250 文字 |
sourceName | 250 文字 |
GRAPHQL_PARSE_FAILED エラー
message | Syntax Error: Invalid number, expected digit but got: "a". |
|---|---|
code | GRAPHQL_PARSE_FAILED |
| 概要 | GraphQL のオペレーション文字列に構文エラーが含まれています。このエラーは通常、 |
GRAPHQL_PARSE_FAILED エラーは、クエリまたはミューテーションに構文エラーがあることを示します。
{ "errors": [{ "message": "Syntax Error: Invalid number, expected digit but got: \"a\".", "locations": [{ "line": 7, "column": 33 }], "extensions": { "code": "GRAPHQL_PARSE_FAILED" } }]}一般的な原因:
- 文字列値内の特殊文字(引用符、バックスラッシュ)がエスケープされていません。
- GraphQL の構文が正しくありません。
- 変数内の JSON が無効です。
descriptionFormatting: RICH_FORMATTING を使用する場合、description フィールドは生の HTML をサポートします。HTML タグをエスケープする必要はありません。
HTTP 429 Too Many Requests
レート制限を超過しています。API が HTTP 200 以外の HTTP ステータスコードを返すのは、このような一部のケースに限られます。
解決方法:
- 再試行する前に待機する秒数について、
Retry-Afterレスポンスヘッダーを確認します。 - 大きなバッチを送信するのではなく、時間を分散してリクエストを送信します。
- 1 回のリクエストで 1 件の求人を送信し、1 時間ごとのバッチではなくリアルタイムで API を呼び出します。
フィードタイプのエラー
このフィード上のすべての求人で seats が必要です
複数勤務地フィードを使用していますが、seats を含めていません。
少なくとも 1 件の勤務地情報を含む seats 配列を追加してください。
body: { title: "Software Engineer" location: { country: "US" } seats: [{ seatPostingId: "SEAT-001" seatLocation: { country: "US" cityRegionPostal: "Dallas, TX 75201" } }]}このフィード上のどの求人でも seats を含めることはできません
標準フィードを使用していますが、seats を含めています。
seats 配列を削除し、求人レベルで勤務地を指定してください。
body: { title: "Software Engineer" location: { country: "US" cityRegionPostal: "Austin, TX 78701" streetAddress: "100 Congress Ave" }}フィードタイプが不明な場合は、まず seats を含めずに求人を送信してください。
連絡先の検証エラー
"contact" タイプの連絡先が見つかりません
リクエストに、contactType に "contact" を含む連絡先がありません。
contactType 配列に "contact" を含む連絡先をちょうど 1 つ含めてください。
contacts: [{ contactType: ["contact", "hiring manager"] contactInfo: { email: "hr@example.com" }}]"contact" タイプの連絡先が複数見つかりました
複数の連絡先の contactType 配列に contact が含まれています。contact タイプを持てる連絡先は 1 つだけです。他の連絡先には recruiter や hiring manager などのタイプを使用してください。
給与の検証エラー
最大額を最小額より小さくすることはできません
maximumMinor の値が minimumMinor より小さくなっています。
maximumMinor が minimumMinor 以上であることを確認するか、最小額のみの給与の場合は maximumMinor を省略してください。
salary: { currency: "USD" minimumMinor: 5000000 # $50000 maximumMinor: 7500000 # $75000 period: "YEAR"}給与の値は通貨の最小単位(USD の場合はセント)で指定します。$50,000 は 5000000 であり、50000 ではありません。
重複エントリのエラー
リクエストに重複する求人エントリが含まれています
各求人では、sourceName と jobPostingId の組み合わせが一意である必要があります。同じ組み合わせがリクエスト内に複数回含まれています。
リクエストに重複する勤務地エントリが含まれています
各求人では、sourceName と seatPostingId の組み合わせが一意である必要があります。同じ組み合わせがリクエスト内に複数回含まれています。
複数勤務地の検証エラー
すべての勤務地情報は同じ国に配置する必要があります
勤務地情報の国が、最上位レベルの求人勤務地の国と異なっています。
すべての勤務地情報では、求人の最上位レベルの勤務地と同じ国コードを使用する必要があります。
body: { location: { country: "US" } seats: [{ seatPostingId: "SEAT-001" seatLocation: { country: "US" # Must match top - level cityRegionPostal: "Dallas, TX 75201" } }, { seatPostingId: "SEAT-002" seatLocation: { country: "US" # Must match top - level cityRegionPostal: "Austin, TX 78701" } }]}勤務地の検証エラー
remoteType が "Fully Remote" ではない場合、cityRegionPostal を null にすることはできません
リモートではない求人では、cityRegionPostal が必要です。
cityRegionPostal を指定するか、求人を完全リモートとして設定してください。
# Option 1: Provide locationlocation: { country: "US" cityRegionPostal: "Austin, TX 78701"}# Option 2: Set as fully remotelocation: { country: "US"}taxonomyClassification: { remoteType: "Fully Remote"}求人ライフサイクルの問題
作成した求人が Indeed に表示されません
考えられる原因:
- 求人はまだ処理中です。1 時間から 2 時間待ってください。
- Indeed が処理中に求人を却下しました。
sourceNameが正しくありません。
解決方法:
- 求人が検索可能になるまで 1 時間から 2 時間待ちます。
employerJobIdで求人ステータスをクエリします。lifecycleStatusフィールドとisRejectedフィールドを確認します。sourceNameが登録済みのフィードと一致していることを確認します。
求人を再開できません
求人を再開できるのは、掲載終了から 30 日以内に限られます。
-
30 日以内: 元の
jobPostingIdとsourceNameを使用してcreateSourcedJobPostingsを呼び出し、datePublishedを更新します。 -
30 日を超える場合: 新しい求人掲載として求人を作成します。Indeed により、新しい
sourcedPostingIdが割り当てられることがあります。
求人は自動では掲載終了しません
求人は自動では掲載終了しません。掲載を終了するには、expireSourcedJobsBySourcedPostingId を明示的に呼び出す必要があります。
再試行戦略
Job Sync API では、同じ sourceName と jobPostingId を送信した場合に求人を更新する方式を使用しているため、再試行しても安全です。同じ sourceName と jobPostingId を持つ求人を送信すると、重複を作成するのではなく、その求人が更新されます。
再試行可能なエラー
| エラー | 再試行可能か | 対処方法 |
|---|---|---|
| HTTP 429 Too Many Requests | はい | Retry-After ヘッダーの値を待機します |
| ネットワークタイムアウト | はい | 指数バックオフ |
| 接続拒否 | はい | 指数バックオフ |
FORBIDDEN(期限切れのトークン) | はい | トークンを更新してから 1 回だけ再試行します |
BAD_USER_INPUT | いいえ | リクエストを修正します |
GRAPHQL_PARSE_FAILED | いいえ | クエリ構文を修正します |
ベストプラクティス
- 再試行には、ジッター付きの指数バックオフを使用します。
- 1 秒の遅延から開始し、再試行のたびに 2 倍にします。
- スタンピードを防ぐために、0 秒から 1 秒のランダムなジッターを追加します。
- 再試行回数は 3 回から 5 回を上限とします。
サポートを受ける
このガイドで扱っていない問題については、次を確認してください。
- GraphQL エラーの
messageとextensionsオブジェクトを確認します。 - すべての必須フィールドが存在し、正しい形式であることを確認します。
- まず最小限の入力でテストし、その後でフィールドを段階的に追加します。
- フィード固有の問題については、Indeed 担当者に連絡します。
関連情報: