- 概要
- ステップ1. Indeedアカウントを作成する
- ステップ2. アプリを登録する
- ステップ3. NodeJS Expressアプリを作成する
- ステップ4. アプリを設定する
- config.jsファイルを作成する
- セッション状態を設定する
- Bootstrapを設定する
- ステップ5. XML求人フィードを公開する
- 静的な求人リストを返す
- npmのXMLライブラリをインストールする
- 各求人にsourceNameを追加する
- XML求人フィードのルートを追加する
- ステップ6. アプリのホームページを作成する
- ステップ7. アプリにIndeed APIの呼び出しを認可する
- ステップ8. スポンサー求人キャンペーンを作成する
- GET /campaign/createルートを作成する
- campaign-createビューを作成する
- POST /campaign/createルートを作成する
- createCampaignメソッドを作成する
- ステップ9. スポンサー求人キャンペーンを表示する
- キャンペーンを一覧表示する
- スポンサー求人キャンペーンの詳細を取得する
- キャンペーンを一時停止、再開、削除する
NodeJS製ATS作成のためのSponsored Jobs API連携ガイド
3-legged OAuthでSponsored Jobs APIを呼び出し、NodeJS製の採用管理システムを構築します。
ユーザーは Indeed のAPIまたはそのドキュメントを使用することにより、本APIの使用に関する Indeed との書面による同意がない限り、Indeed のAPIの使用に Indeed API規約と追加API規約およびガイドラインが適用されることに同意したことになります。
概要
このステップバイステップガイドは、Indeedと連携するATS向けです。スポンサー求人キャンペーンを作成するためにATSを使用する雇用主向けに、NodeJS Expressアプリを構築する方法を説明します。
- フレームワーク: NodeJS
- OAuth: 3-legged OAuth
- サンプルコード: Sponsored Job Campaigns API

このガイドのサンプルアプリでは、次の方法を示します。
- XML求人フィードを使用してATSの求人をIndeedと共有する方法。
- 3-legged OAuthを使用して、雇用主に代わってATSがIndeed Sponsored Jobs APIを呼び出すことを認可する方法。
/campaignsエンドポイントを呼び出してスポンサー求人キャンペーンを作成する方法。
GitHubからサンプルアプリのコードをダウンロードしてください。
ステップ1. Indeedアカウントを作成する
ご自身のアプリケーション用にIndeedユーザーアカウントを作成します。
このタスクを完了するには:
- おすすめの求人にアクセスします。
- サインインしている場合は、Profileメニューを開き、Sign outを選択します。
- Sign inを選択します。
- **New to Indeed?**を選択して、アカウントを作成します。
- メールアドレスとパスワードを入力します。

ステップ2. アプリを登録する
Indeedパートナーになると、Indeedが連携用のアプリを作成します。Partner Consoleにログインして、アプリとOAuth認証情報(クライアントID、クライアントシークレット、および3-legged OAuthの場合は認可コード)を確認します。認証情報をアクセストークンと交換し、API呼び出しを認証します。
OAuth 2.0クレデンシャルタイプの場合:
アプリを登録する フィールド 値 パブリッククライアント アプリがパブリッククライアントであるかどうかを指定します。
このアプリがATSサイトにATS JavaScriptプラグインを組み込む場合は、This application is a public clientを選択します。
許可するグラントタイプ 認可コードグラントタイプを選択します。
リダイレクトURL 1つ以上のリダイレクトURLを定義します。
このアプリがATSサイトにATS JavaScriptプラグインを組み込む場合は、プラグインを読み込むページのURLを追加します。
その後、Save and continueを選択します。
アプリのレビューを希望するかどうかを指定し、Save and continueを選択します。
アプリのレビューを受けていない場合、ユーザーにはレビュー未実施の警告メッセージが 表示されます。
必要に応じて、追加の会社情報を入力し、Save and continueを選択します。
アプリ情報をプレビューし、Complete registrationを選択します。
クライアントIDなどのアプリ情報、およびアプリがパブリッククライアントでない場合はクライアントシークレットが、ページに表示されます。
これらのクレデンシャルは安全に保管してください。共有したり、公開のGitリポジトリに保存したりしないでください。
承認済みのパートナーはパートナーコンソール を使用してテストツールにアクセスし、連携、認証情報、関連するAPIやサービスを管理します。また、 3-legged OAuthアプリの場合、承認済みのパートナーはパートナーコンソールを使用してリダイレクトURLを設定し、OAuthの同意確認画面がユーザーにどのように表示されるかを確認します。
ステップ3. NodeJS Expressアプリを作成する
OAuthクライアントアプリがIndeed APIを呼び出す認可を得るため、サンプルのNodeJS Expressアプリはオープンソースのopenid-clientライブラリを使用します。
NodeJS Expressアプリを作成するには:
-
Node.jsとnpmをダウンロードしてインストールします。
Node.jsとnpmのダウンロードとインストールをご覧ください。
-
HandlebarsJSビューエンジンを使用する
Find-TalentExpressアプリを生成します。npx express-generator Find-Talent --view=hbs --git--gitオプションはExpress用の.gitignoreファイルを生 成します。 -
package.jsonファイルがあるディレクトリに移動します。 -
必要なnpmパッケージをインストールします。
npm install -
openid-clientライブラリを含めるようpackage.jsonファイルを更新します。npm install openid-client -
オープンソースのAxiosライブラリをインストールします。これにより
package.jsonファイルが更新されます。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パートナー向けSponsored Jobs APIスコープをご覧ください。
oauthClientIdとoauthClientSecretの値は、登録済みOAuthクライアントアプリのクライアントIDとクライアントシークレットに置き換えてください。これらはManage app credentialsページで確認できます。
sessionSecret設定はExpressのセッション状態で使用されます。「Something Secret!」を新しいシークレット(任意の値)に置き換えてください。
config.jsファイルにはシークレットが多数含まれるため、このファイルが公開されないようにしてください(たとえば、config.jsファイルを公開のGitHubリポジトリに置かないでください)。
セッション状態を設定する
アクセストークンの繰り返しリクエストを避けるため、アクセストークンをセッション状態に保存できます。Expressアプリのセッション状態を有効化するには、次のコマンドを実行します。
npm install express-sessionこのコマンドにより、package.jsonファイルに依存関係が追加されます。

セッション状態を設定するため、app.jsファイルを変更します。app.jsファイルの先頭付近に次のコードを追加します。
const config = require('./config');const session = require('express-session');次に、app.jsファイル内のこの行のコードを見つけます。
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求人フィードを公開します。このセクションでは、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ライブラリを使用します。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>