NodeJS ATSを作成するためのスポンサー求人API連携ガイド
採用企業がATSでスポンサー求人キャンペーンを作成できるアプリを構築します。
Indeed の API の使用について Indeed と書面による契約を締結していない場合、この API またはそのドキュメントを使用することにより、Indeed の API の使用には Indeed API Terms (新しいウィンドウで開きます) および Additional API Terms and Guidelines が適用されることに同意したものとみなされます。
連携の概要
このガイドでは、ATSパートナー向けに、採用企業がATSでスポンサー求人キャンペーンを作成できるNodeJS Expressアプリの構築方法を説明します。
- Framework: Node.jsを使用します。
- OAuth: 3-legged OAuthを使用します。
- Sample code: Sponsored Job Campaigns API (新しいウィンドウで開きます)をご覧ください。

サンプルアプリでは、次の方法を示します。
- XML求人フィードを使用してATSの求人をIndeedと共有する
- 3-legged OAuthを使用して、採用企業に代わってATSがスポンサー求人APIを呼び出せるように認可する
/campaignsエンドポイントを呼び出してスポンサー求人キャンペーンを作成する
GitHubのindeedeng/sponsored-jobs-nodejs-auth-code (新しいウィンドウで開きます)からサンプルアプリのコードをダウンロードします。
連携手順
1. Indeedアカウントを作成する
アプリケーション用のIndeedユーザーアカウントを作成します。
- jp.indeed.com (新しいウィンドウで開きます)にアクセスします。
- サインインしている場合は、Profileメニューを開き、Sign outを選択します。
- Sign inを選択します。
- **New to Indeed?**を選択します。
- メールアドレスとパスワードを入力します。
2. アプリを登録する
Indeed パートナーになると、Indeed が連携用のアプリを作成します。Partner Console (新しいウィンドウで開きます) にサインインして、アプリと OAuth 認証情報(クライアント ID、シークレット、および 3-legged OAuth の認可コード)を確認します。これらの認証情報をアクセストークンと交換し、API 呼び出しを認証します。
OAuth 2.0クレデンシャルタイプには、次の値を入力します。
アプリを登録する 項目 値 Public client アプリがパブリッククライアントかどうかを指定します。
アプリがATSサイトにATS JavaScriptプラグインを組み込む場合は、This application is a public clientを選択します。
Allowed grant types 認可コード付与タイプを選択します。 Redirect URL 1つ以上のリダイレクトURLです。
アプリがATSサイトにATS JavaScriptプラグインを組み込む場合は、プラグインを読み込むページのURLを追加します。
Save and continueを選択します。
Indeedがアプリをレビューするかどうかを選択し、Save and continueを選択します。レビューを省略すると、アプリがレビューされていないことを示す警告がユーザーに表示されます。
必要に応じて会社情報を追加し、Save and continueを選択します。
アプリ情報をプレビューし、Complete registrationを選択します。
ページにはクライアントIDと、パブリッククライアント以外の場合はクライアントシークレットが表示されます。これらのクレデンシャルは安全に保管してください。共有したり、公開Gitリポジトリにコミットしたりしないでください。
3. NodeJS Expressアプリを作成する
サンプルのNode.js Expressアプリでは、Indeed APIを呼び出すために、オープンソースのopenid-clientライブラリを使用します。
-
Node.jsとnpmをダウンロードしてインストールします。
Downloading and installing Node.js and npm (新しいウィンドウで開きます)をご覧ください。
-
HandlebarsJSビューエンジンを使用して
Find-TalentExpressアプリを生成します。npx express-generator Find-Talent --view=hbs --git--gitオプションにより、Express用の.gitignoreファイ ルが生成されます。 -
package.jsonがあるディレクトリに移動します。 -
必要なnpmパッケージをインストールします。
npm install -
package.jsonにopenid-clientライブラリを追加します。npm install openid-client -
オープンソースのAxiosライブラリを追加します。
npm install axios -
Expressアプリを起動します。
npm start -
http://localhost:3000/ (新しいウィンドウで開きます)を開きます。
Welcome to Expressというメッセージが表示された、デフォルトのExpressインデックスページが表示されます。
4. アプリを設定する
Expressアプリを設定するには、設定ファイルを作成し、セッション状態を設定して、Bootstrapを有効にします。
config.jsファイルを作成する
シークレットを保存するには、Find-Talentアプリのルートにconfig.jsファイルを作成します。
const config = { oysterBaseURL: 'https://apis.indeed.com/ads/v1', oauthDiscovery: 'https://secure.indeed.com/.well-known/openid-configuration', oauthClientId: '90f9f4bd6a34cac31daebe1a093a606ce6b34e91ae6cfa139432ae387269a529', oauthClientSecret: 'bML2BGshr8mLng6d1c1qCujH2PgblxEJwW5WqLxpr32XWfAFSonlhIE07buG7Nlr', oauthRedirectURL: 'http://localhost:3000/oauth-callback', scope: 'employer_access offline_access employer.advertising.account.read employer.advertising.campaign', sessionSecret: 'Something Secret!',};
module.exports = config;scope設定には、OAuthアプリに必要な権限を指定します。たとえば、スポンサー求人キャンペーンを作成するには、employer.advertising.campaignを含めます。スコープの一覧については、ATS連携向けスポンサー求人APIスコープをご覧ください。
oauthClientIdとoauthClientSecretは、登録済みOAuthアプリのクライアントIDとシークレットに置き換えてください。Manage app credentials (新しいウィンドウで開きます)ページで確認できます。
Expressは、セッション状態にsessionSecretを使用します。Something Secret!は、独自のシークレットに置き換えてください。
config.jsにはシークレットが含まれているため、このファイルを公開しないでください。たとえば、公開GitHubリポジトリに保存しないでください。
セッション状態を設定する
アクセストークンを繰り返し要求しないようにするには、トークンをセッション状態に保存します。セッション状態を有効にするには、次のコマンドを実行します。
npm install express-sessionこのコマンドにより、package.jsonに依存関係が追加されます。

次に、app.jsでセッション状態を設定します。ファイルの先頭付近に次のコードを追加します。
const config = require('./config');const session = require('express-session');次に、この行を探します。
var app=express(); その下に次のコードを追加します。
// session setupapp.use(session({ secret: config.sessionSecret, resave: false, saveUninitialized: true, cookie: { secure: false },}));コントローラーでは、req.sessionを使用してリクエスト間でデータを保存します。
Bootstrapを設定する
アプリをすばやくスタイリングするには、オープンソースのBootstrap CSSフレームワークを使用します。views/layout.hbsで、<title>タグの下に次のコードを追加します。
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>完全なlayout.hbsテンプレートは次のとおりです。
<!DOCTYPE html><html> <head> <title>Sponsor Jobs</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous"> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.bundle.min.js" integrity="sha384-b5kHyXgcpbZJO/tY9Ul7kGkf1S0CWuKcCD38l8YkeH8z8QjE0GmW1gYU5S9FOnJ0" crossorigin="anonymous"></script>
<link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> {{>header}} <div class="container"> {{{body}}} </div> </body></html>5. XML求人フィードを公開する
採用企業がIndeedで求人をスポンサーするには、Indeedがその求人を認識している必要があります。ATSでホストしている求人をIndeedで利用できるようにするには、このセクションで説明する形式でXML求人フィードを公開します。
静的な求人一覧を返す
実際のATSでは、採用企業の求人はデータベースに保存されます。サンプルアプリを簡潔に保つために、静的な求人一覧を返すメソッドを作成します。
static listJobs() { return [ { id: 2312, title: 'Product Manager', description: 'Manage products', posted: new Date('1/12/2021'), url: 'https://example.com/job/2312', city: 'Seattle', state: 'WA', country: 'USA', }, { id: 2313, title: 'Python Engineer', description: 'Must be an expert in Django.', posted: new Date('1/12/2021'), url: 'https://example.com/job/2313', city: 'Seattle', state: 'WA', country: 'USA', }, { id: 2314, title: 'Senior Python Engineer', description: 'Must be an expert in Django.', posted: new Date('1/12/2021'), url: 'https://example.com/job/2314', city: 'Seattle', state: 'WA', country: 'USA', }, ];}このメソッドは、\services\JobService.jsにあります。
npm XMLライブラリをインストールする
求人一覧をXMLに変換するには、Node Package Manager(npm)のXMLライブラリをインストールします。
npm install xml各求人にsourceNameを追加する
各求人には、Indeedが必要とするすべてのデータ、特にreferenceNumberとsourceNameが含まれている必要があります。services\JobService.jsにもあるこのメソッドが、そのデータを追加します。
static listJobsAsXML() { const jobs = this.listJobs().map((j) => ({ job: [ { title: { _cdata: j.title } }, { description: { _cdata: j.description } }, { date: { _cdata: j.posted } }, { referenceNumber: { _cdata: j.id } }, { url: { _cdata: j.url } }, { company: { _cdata: 'US Robotics and Mechanical Men' } }, { sourceName: { _cdata: 'Apple' } }, { city: { _cdata: j.city } }, { state: { _cdata: j.state } }, { country: { _cdata: j.country } }, { email: { _cdata: 'your_email@your_company.com' } }, { metadata: { _cdata: '' } }, ], }));
return [ { source: [ { publisher: 'Superhero ATS' }, { publisherurl: 'https://example.com' }, { lastBuildDate: Date() }, ...jobs, ], }, ];}listJobsAsXML()メソッドは、各求人をIndeedが読み取れる形式に変換します。各求人には、一意のIDであるreferenceNumberと、Appleに設定したsourceNameの両方が含まれます。IndeedはsourceNameを使用して、各求人を正しい採用企業に関連付けます。
XML求人フィードのルートを追加する
次に、求人一覧をXMLとして公開します。アプリのroutesフォルダに、次のjobFeed.jsファイルを追加します。
const express = require('express');const xml = require('xml');const JobService = require('../services/JobService');
const router = express.Router();
router.get('/', async (req, res) => { res.contentType('application/xml'); res.send(xml(JobService.listJobsAsXML(), true));});
module.exports = router;このルートはlistJobsAsXML()メソッドを呼び出し、その結果をXMLライブラリに渡します。これにより、Indeedが読み取れる形式のXMLとして求人一覧を公開します。
<source> <publisher>Superhero ATS</publisher> <publisherurl>https://example.com</publisherurl> <lastBuildDate>Mon May 24 2021 14:43:59 GMT-0700 (Pacific Daylight Time)</lastBuildDate> <job> <title><![CDATA[Product Manager]]></title> <description><![CDATA[Manage products]]></description> <date><![CDATA[Tue Jan 12 2021 00:00:00 GMT-0800 (Pacific Standard Time)]]></date> <referenceNumber><![CDATA[2312]]></referenceNumber> <url><![CDATA[https://example.com/job/2312]]></url> <company><![CDATA[US Robotics and Mechanical Men]]></company> <sourceName><![CDATA[Apple]]></sourceName> <city><![CDATA[Seattle]]></city> <state><![CDATA[WA]]></state> <country><![CDATA[USA]]></country> <email><![CDATA[your_email@your_company.com]]></email> <metadata/> </job> <job> <title><![CDATA[Python Engineer]]></title> <description><![CDATA[Must be an expert in Django.]]></description> <date><![CDATA[Tue Jan 12 2021 00:00:00 GMT-0800 (Pacific Standard Time)]]></date> <referenceNumber><![CDATA[2313]]></referenceNumber> <url><![CDATA[https://example.com/job/2313]]></url> <company><![CDATA[US Robotics and Mechanical Men]]></company> <sourceName><![CDATA[Apple]]></sourceName> <city><![CDATA[Seattle]]></city> <state><![CDATA[WA]]></state> <country><![CDATA[USA]]></country> <email><![CDATA[your_email@your_company.com]]></email> <metadata/> </job> <job> <title><![CDATA[Senior Python Engineer]]></title> <description><![CDATA[Must be an expert in Django.]]></description> <date><![CDATA[Tue Jan 12 2021 00:00:00 GMT-0800 (Pacific Standard Time)]]></date> <referenceNumber><![CDATA[2314]]></referenceNumber> <url><![CDATA[https://example.com/job/2314]]></url> <company><![CDATA[US Robotics and Mechanical Men]]></company> <sourceName><![CDATA[Apple]]></sourceName> <city><![CDATA[Seattle]]></city> <state><![CDATA[WA]]></state> <country><![CDATA[USA]]></country> <email><![CDATA[your_email@your_company.com]]></email> <metadata/> </job></source>6. アプリのホームページを作成する
サンプルアプリのホームページには、各求人の横にSponsor with Indeed