Apply with Indeed
パートナー ATS と採用企業向けに Apply with Indeed ボタンを作成して展開します。
- この API とそのドキュメントを使用し、連携を構築することで、追加の API 利用規約およびガイドラインに同意したものとみなされます。
はじめに
Apply with Indeed(AWI)を使用すると、Job Sync API または XML 連携を通じて投稿した求人に Apply with Indeed ボタンを追加して展開できます。AWI を連携すると、求職者は採用企業の採用ページで Apply with Indeed ボタンをクリックし、Indeed アカウントに保存されている Indeed profile データを使用して応募できます。
前提条件
開始前
-
AWI を使用するには、Job Sync API または XML フィードを通じて求人を投稿し、その求人で Indeed エントリーを有効にしてください。求人の投稿方法と Indeed エントリーの有効化については、Job Sync API ガイド または Job Sync XML フィードガイド をご覧ください。
-
AWI の Integration Request を作成してください。
- 新しいパートナーシップをリクエストするには、この リクエストフォーム (新しいウィンドウで開きます) を使用してください。
- Indeed が AWI 用の
partnerApiTokenを生成します。
AWI のプロビジョニング
認証情報には Partner Console からアクセスできます。
-
Indeed が AWI アクセス用の認証情報をプロビジョニングします。
- OAuth トークンとシークレット: これらの認証情報は、GraphQL API へのリクエストを認証するアクセストークンの生成に使用します。
- Partner API トークンとシークレット: これらの認証情報は AWI に使用します。これらの認証情報は、Indeed に求人を投稿する際に使用する Indeed エントリー API トークンとは別です。Partner Console では、このトークンは Apply With Indeed Token として表示されます。
推奨される AWI 連携オプション
ATS ページで Apply with Indeed ボタンを有効にするには、次のいずれかの方法を使用してください。
-
SDK または JavaScript をウェブページのコードに追加すると、よりすばやくセットアップできます。
フロントエンドコードを簡単に変更でき、SDK にボタンデザインとエラー処理を任せたい場合は、この方法を使用してください。
-
この方法では応募フォーム URL が返されるため、ウェブページ内の任意の場所に柔軟に統合できます。
バックエンドシステムから Indeed GraphQL API を呼び出すことができ、ボタン UI の構築とエラー処理を自身で行っても問題ない場合は、この方法を使用してください。
Indeed パートナーは、Indeed に求人を投稿し、Indeed エントリーを有効にする方法が Job Sync API か XML フィードかを識別する必要があります。Apply with Indeed ボタンを追加するための入力パラメーターは、その選択によって異なります。
AWI JavaScript
AWI JavaScript は、ATS の求人ページで Apply with Indeed ボタンを有効にします。
JavaScript を読み込む
ATS の求人ページで AWI JavaScript を読み込むには、次のコードサンプルのように <script> タグをページに追加します。
必要に応じて、ページのエンコーディング用に <meta charset> タグを含めることもできます。
<!DOCTYPE html><html> <head> ... <!-- Load the AWI JavaScript --> <script src="https://apply.indeed.com/indeedapply/static/scripts/app/awi-bootstrap.js"></script> ... </head>...</html>Apply with Indeed ボタンを有効にする
スクリプトを読み込んだら、必要な属性を持つ HTML 要素を追加して Apply with Indeed ボタンを有効にします。次のコードサンプルにその方法を示します。
パラメーターは、Job Sync API を使用するか XML フィードを使用するかによって異なります。
Job Sync API コードサンプル
<!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>XML フィードのコードサンプル
<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>パラメーターを指定する
前のコードサンプルの山括弧(<>)内にあるパラメーターを、実際の値に置き換えてください。
必須パラメーターは Job Sync API と XML フィードで異なります。
次の表は data-indeed-apply-* 属性を説明しています。
| 属性 | 必須 | 暗号化 | 説明 | 例 |
|---|---|---|---|---|
型: String | 必須 | いいえ | Apply with Indeed ボタンの種類です。サポートされる値は AWI のみです。 | AWI |
型: String | Job Sync API では必須 | いいえ | 求人投稿の作成時に Job Sync API が生成する Indeed の採用企業求人 ID です。data-indeed-apply-sourceJobPostingId は、Job Sync API guide - Response - Create job posting では sourcePostingId とも呼ばれます。 | 57caad99-6441-46ec-913c-e018e5013689 |
型: String | XML フィードでは必須 | はい | XML フィードの暗号化されたソース名です。これはその役職の採用を行う親組織です。 | 1d76ab187297cf4c284e2621c2c7462fbfb216704ed0fdc325de0baf6dca5718 |
型: String | XML フィードでは必須 | はい | XML フィードの暗号化されたフィード URL です。これは貴社サイト上の求人一覧 URL です。 | 0906256350d8ed657d9f70ffe91e84d4a117328ab5d42c22ccbac1689af2d1cb |
型: String | XML フィードでは必須 | はい | XML フィード求人の reference ID を暗号化したものです。この ID は求人インスタンスを一意に識別します。 | 1d76ab187297cf4c284e2621c2c7462fbfb216704ed0fdc325de0baf6dca5718 |
型: String | 必須 | いいえ | 貴社の Partner API トークンです。 | 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 |
必要なパラメーターは、partnerApiToken に関連付けられたシークレットを使用して暗号化してください。
コールバックメソッド
onClick:- コールバックメソッドは 1 つの引数を受け取ります。それはボタンの
HTMLElementです。
- コールバックメソッドは 1 つの引数を受け取ります。それはボタンの
onReady:- コールバックメソッドは 2 つの引数を受け取ります。ボタンの
HTMLElementとbuttonLoadStatusです。 buttonLoadStatusは、次のフィールドを含むオブジェクトです。successはボタンの読み込みが成功したか失敗したかを示します。messageは成功メッセージまたはエラーメッセージを含みます。error_codeはボタンの読み込みが失敗した場合のエラーコードを含みます。
- コールバックメソッドは 2 つの引数を受け取ります。ボタンの
属性の暗号化を処理する
- 前の表の 暗号化 列で
はいと示されたすべての属性を暗号化してください。生成されたpartnerApiTokenに関連付けられた 128 ビットのシークレットキーを使った AES を使用します。CBC モードと PKCS5 パディングを使用してください。初期化ベクトルには、16 バイトの00を使 用します。 - 属性を暗号化するには、次の手順を実行します。
- 生成された
partnerApiTokenに関連付けられたシークレットの先頭 16 バイトを使用して、128 ビットのキーを作成します。 - 平文の属性のバイト列を UTF-8 で読み取ります。
- AES、CBC モード、および PKCS5 パディングで属性を暗号化します。
- 暗号化されたバイト列を 16 進文字列に変換します。
- その 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; } }}Job Sync API サンプルデータ
<divdata-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 フィードのサンプルデータ
<divdata-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 を含めないでください。複数の URL を含めると、ボタンにエラーが表示され、灰色の非アクティブ状態になります。
ボタンデザイン
この画像は正常な Apply with Indeed ボタンを示しています。
この画像は正常でない Apply with Indeed ボタンを示しています。
問題が発生した場合は、エラーをトラブルシューティングするとIndeed Applyエラーのトラブルシューティング をご覧ください。
生成された Apply With Indeed ボタンは、ほかの Apply ボタンと同じサイズおよび表示に合わせてください。
applyUrlForEmployers ミューテーション
このミューテーションを使用して、Apply with Indeed ボタンを読み込むたびに Indeed Apply URL を作成します。
Indeed API と連携する
Indeed パートナーになると、Indeed が連携用のアプリを作成します。Partner Console (新しいウィンドウで開きます) にサインインして、アプリと OAuth 認証情報(クライアント ID、シークレット、および 3-legged OAuth の認可コード)を確認します。これらの認証情報をアクセストークンと交換し、API 呼び出しを認証します。
Apply with Indeed URL を作成する
Apply with Indeed URL は Indeed Apply URL とも呼ばれます。これを作成するには、ApplyUrlMutations.applyUrlForEmployers ミューテーションを呼び出します。Apply with Indeed ボタンを読み込む求人を識別する入力を送信してください。必要な入力は XML フィードと Job Sync API で異なります。
Job Sync API の入力
sourcedPostingId*: 求人投稿を作成したときに Job Sync API が生成する Indeed の採用企業求人 IDjobUrl*: Apply with Indeed ボタンを読み込んだ公開求人説明ページの URLcontinueUrl: 応募者が成功画面で Continue をクリックしたときにリダイレクトされる URLexitUrl: 応募者が Indeed エントリーフォームを離れたときにリダイレクトされる URL
* - 必須入力
XML フィードの入力
sourceName*: その役職の採用を行う親組織名。たとえば Test Company Name や Indeed JapanfeedUrl*: XML 求人のフィード URLreferenceId*: XML フィード内の<referenceNumber>または<referenceId>jobUrl*: Apply with Indeed ボタンを読み込んだ公開求人説明ページの URLcontinueUrl: 応募者が成功画面で Continue をクリックしたときにリダイレクトされる URLexitUrl: 応募者が Indeed エントリーフォームを離れたときにリダイレクトされる URL
* - 必須入力
Apply with Indeed ボタンを描画するたびに、新しい Apply with Indeed URL を生成してください。各 URL は 1 回しか使用できず、再利用できません。
リクエスト
Job Sync API リクエストコードサンプル
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 } }}XML フィードのリクエストコードサンプル
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 } }}このミューテーションは applyUrl を返します。これを ATS の求人ページ上の Apply with Indeed ボタンに使用できます。
レスポンス
レスポンスコードサンプル:
{ applyUrl: "https://smartapply.indeed.com/beta/indeedapply/applybyapplyablejobid?indeedApplyableJobId=b957be31-16ed-4f65-9376-cf383594eee5-Y21ocWEx"}ヘッダー
| ヘッダー | 意味 | 必須 / 任意 | 詳細 | 例 |
|---|---|---|---|---|
authorization | アクセストークン | 必須 | ミューテーションへのアクセスを認可します。Get an access token | Bearer eyJrEIOeWQiOiI5NzVkOWZkMC01NzE3LTQzMzQtOTM |
indeed-co | 国 | 任意 | リクエストの国を設定します。対応国 をご覧ください。 | US |
indeed-locale | ロケール | 任意 | 元のリクエストのクライアントロケールを設定します。 | en-US (format) |
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 |