- 概要
- 連携の手順
- 1. アクセス権を取得する
- 2. 連携方法を選択する
- 方法 1: Apply with Indeed JavaScript
- 1. JavaScript を読み込む
- 2. Apply with Indeed ボタンを有効にする
- 3. コールバックメソッドを選択する
- 4. 属性の暗号化を処理する
- 5. ボタンのデザインを選択する
- 方法 2: createApplyUrlForEmployers ミューテーション
- 1. Apply with Indeed URL を作成する
- 2. ミューテーションとボタンのデザインを統合する
- 3. ボタンの言語を変更する
- 4. エラーをトラブルシューティングする
- 関連項目
- ガイド
- リファレンス
Apply with Indeed
パートナー ATS と採用企業向けに、求人ページに Apply with Indeed ボタンを追加します。
- この API とそのドキュメントを使用し、連携を構築することで、追加の API 利用規約およびガイドラインに同意したものとみなされます。
概要
#Apply with Indeed を使用すると、求人情報連携API または XML フィードで投稿した求人に Apply with Indeed ボタンを追加できます。採用企業の採用ページで、求職者はこのボタンを選択し、保存済みの Indeed profile を使用して応募できます。
連携の手順
#1. アクセス権を取得する
#- 1.
求人情報連携API または XML フィードで求人を投稿し、その求人で Indeed エントリーを有効にします。
求人情報連携API ガイドまたは XML フィードガイドをご覧ください。
- 2.
リクエストフォーム (新しいウィンドウで開きます)から Apply with Indeed の連携をリクエストします。
- 3.
Partner Console (新しいウィンドウで開きます) で、Apply with Indeed の認証情報を確認します。
- OAuth クライアント ID とシークレット: アクセストークンと交換して、GraphQL API を呼び出すために使用します。
- Apply with Indeed トークンとシークレット: Apply with Indeed ボタンに使用します。このトークンが
partnerApiTokenの値です。このトークンは、求人の投稿に使用する Indeed エントリー API トークンとは別のものです。
2. 連携方法を選択する
#ATS ページに Apply with Indeed ボタンを追加するには、次のいずれかの方法を使用します。
- 方法 1: Apply with Indeed JavaScript: ボタンのデザインとエラーを処理するスクリプトをページに追加します。フロントエンドのコードを簡単に変更できる場合は、これが最も早くセットアップできる方法です。
- 方法 2: createApplyUrlForEmployers ミューテーション: バックエンドから応募フォームの URL を取得し、ページ内の任意の場所に配置します。柔軟性の高い方法ですが、ボタンの作成とエラー処理はご自身で行います。
ボタンのパラメーターは、求人情報連携API で投稿した求人と XML フィードで投稿した求人で異なります。始める前に、どちらを使用しているかを確認してください。
方法 1: Apply with Indeed JavaScript
#Indeed のスクリプトが、ATS の求人ページに Apply with Indeed ボタンを追加して管理します。
1. JavaScript を読み込む
#Apply with Indeed JavaScript を読み込むには、次の <script> タグを ATS の求人ページに追加します。ページのエンコーディングで必要な場合は、<meta charset> タグも追加します。
<!DOCTYPE html><html> <head> ... <!-- Load the Apply with Indeed JavaScript --> <script src="https://apply.indeed.com/indeedapply/static/scripts/app/awi-bootstrap.js"></script> ... </head>...</html>2. Apply with Indeed ボタンを有効にする
#スクリプトを読み込んだら、必要な属性を持つ HTML 要素を追加します。求人の投稿方法に合ったサンプルを使用してください。
<!DOCTYPE html><html> <head> ... <!-- Step 1: Load the script --> <script src="https://apply.indeed.com/indeedapply/static/scripts/app/awi-bootstrap.js"></script> ... </head> <body> ... <!-- Step 2: Specify where to display the **Apply with Indeed** button --> <div data-indeed-apply-widget-type="<WIDGET-TYPE>" data-indeed-apply-sourceJobPostingId="<JobId>" data-indeed-apply-partnerApiToken="<PartnerApiToken>" data-indeed-apply-encryptedJobUrl="<Encrypted Job URL>" data-indeed-apply-encryptedContinueUrl="<ContinueURL>" data-indeed-apply-hl="en" data-indeed-apply-co="US" data-indeed-apply-newTab="true" ></div> ... </body></html><body> ... <!-- Step 2: Specify where to display the **Apply with Indeed** button --> <div data-indeed-apply-widget-type="<WIDGET-TYPE>" data-indeed-apply-encryptedSourceName="<SourceName>" data-indeed-apply-encryptedFeedUrl="<FeedUrl>" data-indeed-apply-encryptedReferenceId="<ReferenceId or ReferenceNumber>" data-indeed-apply-partnerApiToken="<PartnerApiToken>" data-indeed-apply-encryptedJobUrl="<Encrypted Job URL>" data-indeed-apply-encryptedContinueUrl="<ContinueURL>" data-indeed-apply-hl="en" data-indeed-apply-co="US" data-indeed-apply-newTab="true" ></div> ... </body>コードサンプルの山括弧(<>)内の値を、実際の値に置き換えてください。data-indeed-apply-* 属性は次のとおりです。
| 属性 | 必須 | 暗号化 | 説明 | 例 |
|---|---|---|---|---|
型: String | 必須 | いいえ | ボタンの種類です。サポートされる値は AWI のみです。 | AWI |
型: String | 求人情報連携API では必須 | いいえ | 求人を作成したときに求人情報連携API が返す採用企業の求人 ID です。求人情報連携API ガイドでは sourcedPostingId と呼ばれます。レスポンス – 求人を作成するをご覧ください。 | 57caad99-6441-46ec-913c-e018e5013689 |
型: String | XML フィードでは必須 | はい | XML フィードの暗号化されたソース名です。その職種の採用を行う親組織を表します。 | 1d76ab187297cf4c284e2621c2c7462fbfb216704ed0fdc325de0baf6dca5718 |
型: String | XML フィードでは必須 | はい | 暗号化された XML フィードの URL です。 | 0906256350d8ed657d9f70ffe91e84d4a117328ab5d42c22ccbac1689af2d1cb |
型: String | XML フィードでは必須 | はい | 暗号化された XML フィード求人の参照 ID です。この ID で求人を一意に識別します。 | 1d76ab187297cf4c284e2621c2c7462fbfb216704ed0fdc325de0baf6dca5718 |
型: String | 必須 | いいえ | Apply with Indeed トークンです。1. アクセス権を取得するをご覧ください。 | 98922e8fa1355c944b0f7efc6ae9b182ebb1f3ed8ce0b36ea40b33a9b73e2211 |
型: String | 必須 | はい | Apply with Indeed ボタンを表示する公開求人ページの、暗号化された URL です。 | 0906256350d8ed657d9f70ffe91e84d4a117328ab5d42c22ccbac1689af2d1cb |
型: String | 任意 | はい | 応募者が応募を送信した後に Continue を選択したときの移動先となる、暗号化された URL です。 | 0906256350d8ed657d9f70ffe91e84d4a117328ab5d42c22ccbac1689af2d1cb |
型: String | 任意 | はい | 応募者が送信前に Exit リンクを選択して Indeed エントリーフォームを離れたときの移動先となる、暗号化された URL です。 | 0906256350d8ed657d9f70ffe91e84d4a117328ab5d42c22ccbac1689af2d1cb |
型: String | 任意 | いいえ | 応募フォームの言語です。 | en |
型: String | 任意 | いいえ | 応募者の国コードです。 | US |
型: String | 任意 | いいえ | 応募者が Apply with Indeed を選択したときに実行される JavaScript メソッドの名前です。 | _onClick |
型: String | 任意 | いいえ | Apply with Indeed ボタンが正常に読み込まれた後に実行される JavaScript メソッドの名前です。 | _onButtonReady |
型: Boolean | 任意 | いいえ | ボタンの CSS を読み込まないようにし、ボタンのスタイルをご自身で設定できるようにします。 | true |
型: Boolean | 任意 | いいえ | 応募フォームを新しいタブで開くかどうかです。 | false |
暗号化列がはいの属性は暗号化してください。属性の暗号化を処理するをご覧ください。
3. コールバックメソッドを選択する
#ボタンが選択されたときや読み込まれたときに独自のコードを実行するには、data-indeed-apply-onClick または data-indeed-apply-onReady に JavaScript メソッドの名前を設定します。
-
onClickは、ボタンのHTMLElementを 1 つの引数として受け取ります。 -
onReadyは、ボタンのHTMLElementとbuttonLoadStatusの 2 つの引数を受け取ります。buttonLoadStatusオブジェクトには次のフィールドがあります。success: ボタンが読み込まれたかどうか。message: 成功メッセージまたはエラーメッセージ。error_code: ボタンの読み込みに失敗した場合のエラーコード。
4. 属性の暗号化を処理する
#パラメーターの表の暗号化列がはいの属性は、すべて暗号化してください。AES を CBC モードと PKCS5 パディングで使用し、初期化ベクトルには 16 バイトのゼロを使用します。キーは、partnerApiToken に関連付けられたシークレットの先頭 16 バイト(128 ビット)です。
属性を暗号化するには、次の手順を実行します。
- 1.平文の値を UTF-8 のバイト列として読み取ります。
- 2.バイト列を暗号化します。
- 3.暗号化したバイト列を 16 進文字列に変換します。
- 4.16 進文字列を
data-indeed-apply-{attribute-name}の値として使用します。Indeed エントリーはその値を暗号化済みとして認識します。
次のサンプルは、データを暗号化および復号します。
import java.nio.charset.Charset;import java.lang.RuntimeException;import javax.crypto.Cipher;import javax.crypto.spec.*;import javax.crypto.spec.SecretKeySpec;public class EncryptionTest { public static void main(String[] args) { String url = "YOUR_URL"; String apiSecret = "YOUR_API_SECRET"; String encrypted_url = encrypt(url, apiSecret); String decrypted_url = decrypt(encrypted_url, apiSecret); System.out.println(encrypted_url); System.out.println(decrypted_url); } static String encrypt(String message, String apiSecret) { try { byte[] keyBytes = apiSecret.getBytes(Charset.forName("UTF-8")); byte[] message_bytes = message.getBytes("UTF-8"); SecretKeySpec key = new SecretKeySpec(keyBytes, 0, 16, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivspec = new IvParameterSpec(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); cipher.init(Cipher.ENCRYPT_MODE, key, ivspec); byte[] email_encrypted = cipher.doFinal(message_bytes); return bytesToHexString(email_encrypted); } catch (Exception e) { System.out.println(e.getMessage()); throw new RuntimeException(e); } } static String decrypt(String message, String apiSecret) { try { byte[] keyBytes = apiSecret.getBytes(Charset.forName("UTF-8")); byte[] message_bytes = message.getBytes(Charset.forName("UTF-8")); message_bytes = decodeHex(message_bytes); SecretKeySpec key = new SecretKeySpec(keyBytes, 0, 16, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivspec = new IvParameterSpec(new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }); cipher.init(Cipher.DECRYPT_MODE, key, ivspec); byte[] email_decrypted = cipher.doFinal(message_bytes); return new String(email_decrypted, "UTF-8"); } catch (Exception e) { System.out.println(e.getMessage()); throw new RuntimeException(e); } } static String bytesToHexString(byte[] in) { final StringBuilder builder = new StringBuilder(); for (byte b: in) { builder.append(String.format("%02x", b)); } return builder.toString(); } static byte[] decodeHex(byte[] data) throws Exception { String text = new String(data, "UTF-8"); char[] chars = text.toCharArray(); int len = chars.length; byte[] out = new byte[len >> 1]; int i = 0; for (int j = 0; j < len; ++i) { int f = toDigit(chars[j], j) << 4; ++j; f |= toDigit(chars[j], j); ++j; out[i] = (byte)(f & 255); } return out; } static int toDigit(char ch, int index) throws Exception { int digit = Character.digit(ch, 16); if (digit == -1) { throw new Exception("Illegal hexadecimal character " + ch + " at index " + index); } else { return digit; } }}次のサンプルは、値を暗号化した属性を示しています。
求人情報連携API のサンプルデータ
#<div data-indeed-apply-widget-type="<WIDGET-TYPE>" data-indeed-apply-sourceJobPostingId="<JobId>" data-indeed-apply-partnerApiToken="<PartnerApiToken>" data-indeed-apply-encryptedJobUrl="b18d0be4c173dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299" data-indeed-apply-encryptedContinueUrl="417856e7c173dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299" data-indeed-apply-encryptedExitUrl="2b7cb78563dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299"></div>XML フィードのサンプルデータ
#<div data-indeed-apply-widget-type="<WIDGET-TYPE>" data-indeed-apply-encryptedSourceName="1d76ab187297cf4c284e2621c2c7462fbfb216704ed0fdc325de0baf6dca5718" data-indeed-apply-encryptedFeedUrl="b18d0be4c173dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299" data-indeed-apply-encryptedReferenceId="<ReferenceId>" data-indeed-apply-partnerApiToken="<PartnerApiToken>" data-indeed-apply-encryptedJobUrl="b18d0be4c173dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299" data-indeed-apply-encryptedContinueUrl="417856e7c173dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299" data-indeed-apply-encryptedExitUrl="2b7cb78563dfa2b7cb7856e7c7b6f02a563867a9df67ca208c8b9654966299"></div>URL 属性(encryptedJobUrl、encryptedContinueUrl、encryptedExitUrl、encryptedFeedUrl)には、それぞれ URL を 1 つだけ指定してください。1 つの属性に複数の URL があると、ボタンにエラーが表示され、グレーアウトされます。
5. ボタンのデザインを選択する
#この画像は、正常な Apply with Indeed ボタンを示しています。
この画像は、正常でない Apply with Indeed ボタンを示しています。
ボタンが読み込まれない場合は、エラーをトラブルシューティングするとIndeed エントリーエラーのトラブルシューティングをご覧ください。
Apply with Indeed ボタンは、ほかの Apply ボタンと同じサイズとスタイルにしてください。
方法 2: createApplyUrlForEmployers ミューテーション
#このミューテーションを使用して、Apply with Indeed ボタン用の Apply with Indeed URL(Indeed Apply URL とも呼ばれます)を作成します。
1. Apply with Indeed URL を作成する
#求人の投稿方法に合った入力を指定して、applyUrl の下にある createApplyUrlForEmployers ミューテーションを呼び出します。
求人情報連携API の入力
#jobId.sourceJobPostingId(必須): 求人を作成したときに求人情報連携API が返す採用企業の求人 ID です。求人情報連携API ガイドではsourcedPostingIdと呼ばれます。jobUrl(必須): Apply with Indeed ボタンを表示する公開求人ページの URL です。continueUrl: 応募者が完了画面で Continue を選択したときの移動先です。exitUrl: 応募者が Indeed エントリーフォームを離れたときの移動先です。
XML フィードの入力
#xmlFeedParams.sourceName(必須): その職種の採用を行う親組織です。たとえば、Test Company Name や Indeed Japan などです。xmlFeedParams.feedUrl(必須): XML フィードの URL です。xmlFeedParams.referenceId(必須): XML フィード内の求人の<referenceNumber>または<referenceId>の値です。jobUrl(必須): Apply with Indeed ボタンを表示する公開求人ページの URL です。continueUrl: 応募者が完了画面で Continue を選択したときの移動先です。exitUrl: 応募者が Indeed エントリーフォームを離れたときの移動先です。
各 Apply with Indeed URL は 1 回しか使用できません。ボタンを表示するたびに新しい URL を生成してください。
mutation { applyUrl { createApplyUrlForEmployers(input: { jobId: { sourceJobPostingId: "jobId" } jobUrl: "http://example.com/careers/job1.html" continueUrl: "http://example.com/careers/indeedapply-continue.html" exitUrl: "http://example.com/careers" }) { applyUrl } }}mutation { applyUrl { createApplyUrlForEmployers(input: { xmlFeedParams: { sourceName: "sourceName", feedUrl: "feedUrl", referenceId: "referenceNumber" } jobUrl: "http://example.com/careers/job1.html" continueUrl: "http://example.com/careers/indeedapply-continue.html" exitUrl: "http://example.com/careers" }) { applyUrl } }}レスポンス – createApplyUrlForEmployers
#このミューテーションは、ATS の求人ページの Apply with Indeed ボタンに使用する applyUrl を返します。
{ "data": { "applyUrl": { "createApplyUrlForEmployers": { "applyUrl": "https://smartapply.indeed.com/beta/indeedapply/applybyapplyablejobid?indeedApplyableJobId=b957be31-16ed-4f65-9376-cf383594eee5-Y21ocWEx" } } }}ヘッダー – createApplyUrlForEmployers
#リクエストには次のヘッダーを含めてください。
| ヘッダー | 意味 | 必須 / 任意 | 詳細 | 例 |
|---|---|---|---|---|
authorization | アクセストークン | 必須 | ミューテーションへのアクセスを認可します。アクセストークンを取得するをご覧ください。 | Bearer eyJrEIOeWQiOiI5NzVkOWZkMC01NzE3LTQzMzQtOTM |
indeed-co | 国 | 任意 | リクエストの国を設定します。 | US |
indeed-locale | ロケール | 任意 | 元のリクエストのクライアントロケールを設定します。 | en-US(形式) |
indeed-user-agent | 応募者のユーザーエージェント文字列 | 任意 | 元のブラウザーリクエストのユーザーエージェントを設定します。 | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 |
indeed-user-ip | 応募者の IP | 任意 | 元のブラウザーリクエストのクライアント IP アドレスを設定します。 | 192.168.0.0 |
2. ミューテーションとボタンのデザインを統合する
#ミューテーションを使用する場合は、次のスクリプトで Indeed のボタン CSS を読み込めます。
<!DOCTYPE html><html><head> ... <!-- Step 1: Load the script --> <script src="https://apply.indeed.com/indeedapply/static/scripts/app/buttonStyles.js" ></script></head><body> ... <!-- Step 2: Specify data-style as indeed-apply-button for the button where you want to enable button style --> <button data-style="indeed-apply-button">Apply Now</button></body></html>この画像は、CSS を適用した Apply with Indeed ボタンを示しています。
失敗後にボタンを無効にするには、ボタン要素にネイティブの disabled 属性と aria-disabled=true を追加します。aria-disabled=true だけではクリックを止められません。ボタンをフォーカス可能なままにする必要がある場合は、disabled を追加しないでください。代わりに、ボタンが失敗状態の間はクリックハンドラーが実行されないようにします。
<!-- Add disabled and aria-disabled="true" to disable the button --><button data-style="indeed-apply-button" disabled aria-disabled="true">Apply Now</button>この画像は、無効にした Apply with Indeed ボタンを示しています。
3. ボタンの言語を変更する
#ボタンの言語を変更するには、スクリプトの URL に hl=ja や hl=es などの hl クエリパラメーターを追加します。
<!DOCTYPE html><html><head> ... <!-- Step 1: Specify query parameter --> <script src="https://apply.indeed.com/indeedapply/static/scripts/app/buttonStyles.js?hl=ja"></script></head><body> ... <!-- Step 2: Specify data-style as indeed-apply-button for the button where you want to enable button style --> <button data-style="indeed-apply-button">Apply Now</button></body></html>この画像は、日本語の Apply with Indeed ボタンを示しています。
4. エラーをトラブルシューティングする
#リクエストが失敗すると、data フィールドは null になり、errors フィールドに失敗の詳細が含まれます。主なエラーには、GRAPHQL_PARSE_FAILED、JOB_NOT_FOUND や PARTNER_DATA_NOT_FOUND などのサブコードを持つ BAD_USER_INPUT、INTERNAL_SERVER_ERROR があります。
リクエストが失敗して URL を取得できなかった場合は、Apply with Indeed ボタンを非表示にします。URL を取得したら、ボタンを再び表示します。再試行するのは INTERNAL_SERVER_ERROR の場合だけで、指数バックオフを使用してください。GRAPHQL_PARSE_FAILED と BAD_USER_INPUT の場合は、リクエストを修正してから再送信してください。再試行の方針の詳細については、Indeed エントリーエラーのトラブルシューティングをご覧ください。
エラーの詳細、サブコード、修正方法については、Indeed エントリーエラーのトラブルシューティングをご覧ください。
関連項目
#ガイド
#- Indeedとの連携とAPIの呼び出し — OAuth 認証情報を取得し、最初の API 呼び出しを行います。
- 求人情報連携APIガイド — Indeed で求人を作成、管理します。
- 求人情報連携APIガイド > レスポンス – 求人を作成する — 採用企業の求人 ID を含むレスポンスの例です。
- Job Sync XML フィードガイド — XML フィードを使用して、求人と Indeed での表示方法を定義します。
- Partner Console — Indeed の API とサービスの連携を管理します。
- Indeed エントリーエラーのトラブルシューティング — Indeed エントリーの一般的なエラーを解決する方法です。
リファレンス
#- 対応言語コード、国コード、ロケール — 使用できる
languageCode、countryCode、localeの値と、それぞれの表示テキストです。