API
Pull API とキー
API キーを作成し、GET /api/public/v1/events でイベントを取得し、カーソルでページを進め、pageToken で実行 Webhook のページを読み、signal.v1 を Webhook のイベントに対応付けます。
Pull API は、リクエストに応じて組織のイベントを返します。実行 Webhook のページの読み取り、履歴の取得、Webhook を受け取れない場合のポーリング、Webhook では送信されない LinkedIn エンゲージメントの取得に使います。
API キーを作成する
開発者を開く
キーを作成する
今すぐコピーする
キーを削除するには、キーの横の無効化をクリックして確定します。そのキーを使っているものは、すぐに動かなくなります。元に戻せません。
キーは組織に属します。パスワードと同じように扱い、ブラウザや公開リポジトリには絶対に置かないでください。
リクエスト
1curl "$SIGNALS_HOST/api/public/v1/events?limit=1" \2 -H "x-api-key: $SIGNALS_API_KEY"
SIGNALS_HOST は、サインインするアプリのアドレスです。開発者ページの試してみるボックスに、正確なコマンドが表示されます。
キーは x-api-key ヘッダーで送ります。1 日のリクエスト数に上限はありません。リクエストは IP アドレスごとに 1 分あたり 30 件に制限されます。超えると Retry-After: 60 付きの 429 が返ります。
pageTokenoptionalcursoroptionalnextCursor を渡します。limitoptional30。範囲外の数値は範囲内に丸められます。整数でない値は 400 です。sinceoptional2026-10-14、2026-10-14T09:00:00Z)。この時刻以降に保存されたイベントのみ。それ以外の形式は 400 です。projectIdoptional404 です。trackerIdoptionalsourceoptionalreviews、news、linkedin、linkedin_mentions、reddit_mentions、linkedin_engagement、x、instagram、ads、website、job_postings、competitor_discovery。それ以外の値は 400 です。source は reddit_mentions を受け付けます
アプリ内のリファレンスの説明には、載っている値がもっと少なくなっています。API は、reddit_mentions や linkedin_engagement を含め、上記のすべてのソースを受け付けます。
削除されたプロジェクトのイベントは返されません。
レスポンス
1{2 "items": [ /* signal.v1 objects, oldest first */ ],3 "nextCursor": "eyJ…",4 "hasMore": true5}
itemsnextCursorcursor として渡します。最後のページでは null です。hasMoretrue です。| ステータス | 意味 |
|---|---|
200 | OK。 |
400 | クエリパラメーターが無効です。ボディは { "error": "..." } で、パラメーター名が示されます。 |
401 | キーがない、無効、または無効化されています。 |
403 | キーが Signals の組織に属していません。 |
404 | projectId が組織の有効なプロジェクトではない、または Signals がオフになっています。 |
429 | 同じ IP から 1 分間に 30 件を超えるリクエストがありました。60 秒後に再試行してください。 |
実行 Webhook のページ
実行 Webhook には、イベント名ごとに firstPageToken が入ります。これを pageToken として渡します。
1curl "$SIGNALS_HOST/api/public/v1/events?pageToken=$TOKEN" \2 -H "x-api-key: $SIGNALS_API_KEY"
レスポンスは { run, eventName, total, page, totalPages, items, nextPageToken } です。items には、signal.v1 ではなくイベントの形のイベントが最大 100 件入ります。nextPageToken が null になるまでたどります。
| ステータス | 意味 |
|---|---|
400 | トークンが変更された、途中で切れた、または Signals のものではありません。 |
404 | 実行がキーの組織にない、または Webhook が削除されました。 |
410 | トークンが 30 日を過ぎています。GET /api/public/v1/events?trackerId=…&since=… で実行を読み取り、runId が実行の id と一致する要素だけを残してください。 |
項目、例、そのまま使えるループは実行のイベントを読むにあります。
新しいイベントをポーリングする
ページは古い順に返されるため、先へ進みながら、イベントを取りこぼすことはありません。nextCursor は最後のページで null になるため、ブックマークとして再利用できません。見た中で最新のイベントの detectedAt を保存し、次回のポーリングで since として使い、id で重複を排除してください。
ページを取得する
GET /api/public/v1/events?limit=100&since=…。since には前回保存した detectedAt から 10 分ほど前の時刻を指定します。各イベントを処理する
items を順に処理します。処理済みの id は飛ばします。カーソルをたどる
hasMore が true の間は、cursor に nextCursor を指定して再度リクエストします。位置を保存する
detectedAt を保存し、数分後の次回のポーリングで使います。since なしの最初の実行では、履歴全体を読み取ります。後から始めたい場合は、since を指定してください。
signal.v1 のフィールド
schematypereviews.new、ads.new、website.changed、jobs.new、engagement.new。ideventId と同じ値です。orgIdtrackerIdprojectIdoptionalrunIdsourcereviews、ads、job_postings、linkedin_engagement。subject{ key: string, display: string }。display は競合の名前です。changechangeSeqitemKeyobservedAtremoved では null です。detectedAtitemdetailrating など、ソース固有のフィールド。removed では null です。relevance1{2 "schema": "signal.v1",3 "type": "ads.new",4 "id": "617692b7-2c85-499c-bc3b-6810f3673190",5 "orgId": "org_3KikADUjsyXrUJ4RJhWpwcp98Yf",6 "trackerId": "3c8918c2-7011-4518-9185-31344c83861f",7 "runId": "b0b5b63b-fc3d-4eef-84ab-879e2335c06d",8 "source": "ads",9 "subject": {10 "key": "google:AR10072600183532683265@-|meta:https://www.facebook.com/hubspot|linkedin:hubspot",11 "display": "HubSpot"12 },13 "change": "added",14 "changeSeq": 254,15 "itemKey": "ads|google|CR00389017023612452865",16 "observedAt": "2025-07-30T14:52:54.000Z",17 "detectedAt": "2026-10-27T20:28:40.624Z",18 "item": {19 "title": null,20 "text": null,21 "url": null,22 "author": {23 "name": "Hubspot, Inc."24 },25 "metrics": null,26 "media": [27 {28 "type": "image",29 "url": "https://tpc.googlesyndication.com/archive/simgad/13161062113949559550"30 }31 ]32 },33 "detail": {34 "source": "ads",35 "kind": "ad",36 "adSource": "google",37 "externalId": "CR00389017023612452865",38 "format": "text",39 "isActive": true,40 "startedAt": "2025-07-30T14:52:54.000Z",41 "endedAt": null,42 "previewUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265/creative/CR00389017023612452865?region=anywhere",43 "cta": null,44 "landingUrl": null,45 "paidBy": null,46 "postedBy": null,47 "logoUrl": null,48 "daysShown": 45549 },50 "relevance": {51 "status": "unjudged"52 }53}
1{2 "schema": "signal.v1",3 "type": "engagement.new",4 "id": "1742a36b-08e8-477d-8f35-10b3d6207930",5 "orgId": "org_3KikADUjsyXrUJ4RJhWpwcp98Yf",6 "trackerId": "271e9142-1ab6-41ad-b905-3d58e065e71d",7 "runId": "57a0369d-23f8-4aa5-86db-6c64b3cea6e4",8 "source": "linkedin_engagement",9 "subject": {10 "key": "engagement:hubspot|posts:5",11 "display": "HubSpot"12 },13 "change": "added",14 "changeSeq": 27,15 "itemKey": "linkedin_engagement|7520919497038557184|acoaac8dmlgbxyqanprimg25nxbncr5bqy0hpe8",16 "observedAt": "2026-10-27T20:28:38.954Z",17 "detectedAt": "2026-10-27T20:28:38.954Z",18 "item": {19 "title": "Diksha Sabharwal",20 "text": "B2B Marketing Strategy | Lifecycle Operations | MS in Marketing Analytics",21 "url": "https://www.linkedin.com/in/ACoAAC8DMLgBxyqaNpRiMg25NxBNcR5bQY0HPE8",22 "author": {23 "name": "Diksha Sabharwal",24 "handle": "acoaac8dmlgbxyqanprimg25nxbncr5bqy0hpe8",25 "url": "https://www.linkedin.com/in/ACoAAC8DMLgBxyqaNpRiMg25NxBNcR5bQY0HPE8"26 },27 "metrics": {},28 "media": []29 },30 "detail": {31 "source": "linkedin_engagement",32 "kind": "person",33 "personHandle": "acoaac8dmlgbxyqanprimg25nxbncr5bqy0hpe8",34 "name": "Diksha Sabharwal",35 "headline": "B2B Marketing Strategy | Lifecycle Operations | MS in Marketing Analytics",36 "profileUrl": "https://www.linkedin.com/in/ACoAAC8DMLgBxyqaNpRiMg25NxBNcR5bQY0HPE8",37 "how": "reacted",38 "reaction": "ENTERTAINMENT",39 "commentText": null,40 "postUrn": "7520919497038557184",41 "postUrl": "https://www.linkedin.com/feed/update/urn:li:activity:7520919497038557184/",42 "postTitle": "Which of these is “frighteningly” on brand? 👻"43 },44 "relevance": {45 "status": "unjudged"46 }47}
signal.v1 から Webhook イベントへ
signal.v1(Pull API) | Webhook イベント(ページの要素) | 備考 |
|---|---|---|
schema: "signal.v1" | version: 1 | バージョンの付け方が異なります。 |
type | signalType | 名前は同じです。 |
id | eventId | 同じ値です。 |
change | action | added → new、updated → updated、removed → removed。 |
changeSeq | sequence | 同じ数値です。 |
observedAt | occurredAt | 削除された項目では、どちらも null です。 |
subject { key, display } | competitor { name, domain, subjectKey } | display → name、key → subjectKey。Webhook では domain が加わります。 |
item + detail | <family>Response と metadata | Webhook は、項目のフィールドとソースのフィールドを 1 つのオブジェクトにまとめます。それを、種類のキー(例: reviewResponse)と metadata の 2 か所に入れて送ります。 |
source | source、さらに eventType と subEventType | Webhook では、ソースを種類とプラットフォームにも分けます。 |
orgId、trackerId、projectId、runId、itemKey、detectedAt、relevance | 同じ名前 | Webhook では、itemKey の ` |
LinkedIn エンゲージメントには、Webhook イベントがありません。ここで source=linkedin_engagement を指定して取得してください。
リファレンス
機械可読な OpenAPI 仕様とインタラクティブなビューアーは、Signals ホストの /api/public/docs にあります。先にサインインしてください。