# API リファレンス：スキーマ

> https://okaeri.tech/developers/reference/schemas/ の Markdown 版。

リクエスト・応答・Webhook の本文の型です。各操作からはここへリンクしています。

## CampaignDetailOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `site_id` | `string`（uuid） | 必須 | — |
| `key` | `string` | 必須 | — |
| `name` | `string` | 必須 | — |
| `product_name` | `string`（null 可） | 必須 | — |
| `status` | `string` | 必須 | 値：`active`・`paused`・`archived`（今後増えることがある） |
| `abandon_wait_minutes` | `integer` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |
| `site` | `object`（項目は未掲載） | 必須 | — |
| `url_rules` | [UrlRuleOut](https://okaeri.tech/developers/reference/schemas.md#UrlRuleOut) の配列 | 必須 | — |
| `form_profile` | [FormProfileOut](https://okaeri.tech/developers/reference/schemas.md#FormProfileOut)（null 可） | 必須 | — |
| `warnings` | [TakeoverWarningOut](https://okaeri.tech/developers/reference/schemas.md#TakeoverWarningOut) の配列 | — | 保存で稼働中キャンペーンのページを別キャンペーンが奪った時の警告。保存は成立している |

## CampaignDuplicateIn

複製の指定。省略＝識別子は `<元>-copy`（空いている番号）・名前は「〇〇のコピー」。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string`（null 可） | — | — |
| `name` | `string`（null 可） | — | — |

## CampaignIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `site_id` | `string`（uuid） | 必須 | — |
| `key` | `string` | 必須 | — |
| `name` | `string` | 必須 | — |
| `product_name` | `string`（null 可） | — | — |
| `status` | `string`（null 可） | — | 省略時はセッション=active・APIキー=paused。APIキーは paused のみ指定可 値：`active`・`paused`・`archived`（今後増えることがある） |
| `abandon_wait_minutes` | `integer`（null 可） | — | — |

## CampaignListItemOut

一覧の1行。「稼働中だが有効なシナリオが無く送られない」を一覧で見分けられる。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `site_id` | `string`（uuid） | 必須 | — |
| `key` | `string` | 必須 | — |
| `name` | `string` | 必須 | — |
| `product_name` | `string`（null 可） | 必須 | — |
| `status` | `string` | 必須 | 値：`active`・`paused`・`archived`（今後増えることがある） |
| `abandon_wait_minutes` | `integer` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |
| `scenario_count` | `integer` | 必須 | 未削除のシナリオ数 |
| `active_scenario_count` | `integer` | 必須 | 有効（active）なシナリオ数（0 か 1）。0 なら稼働中でも送られない |

## CampaignListOut

キャンペーンの一覧（cursor 方式）。URL ルール・フォーム項目は詳細だけに載る。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [CampaignListItemOut](https://okaeri.tech/developers/reference/schemas.md#CampaignListItemOut) の配列 | 必須 | — |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## CampaignPatch

未送信＝現状維持。`key` と `site_id` は受け付けない（送られても黙って無視する）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `name` | `string`（null 可） | — | — |
| `product_name` | `string`（null 可） | — | — |
| `status` | `string`（null 可） | — | 値：`active`・`paused`・`archived`（今後増えることがある） |
| `abandon_wait_minutes` | `integer`（null 可） | — | — |

## CampaignRefOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid）（null 可） | 必須 | — |
| `key` | `string` | 必須 | — |
| `name` | `string`（null 可） | 必須 | — |

## CaptureCountsOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `captured` | `integer`（null 可） | 必須 | — |
| `abandoned` | `integer`（null 可） | 必須 | — |

## ConsentSettingsOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `consent_checkbox_enabled` | `boolean` | 必須 | — |
| `consent_default_checked` | `boolean` | 必須 | — |
| `consent_template_key` | `string`（null 可） | 必須 | 値：`concise`・`formal`・`standard`（今後増えることがある） |
| `template` | [ConsentTemplateOut](https://okaeri.tech/developers/reference/schemas.md#ConsentTemplateOut) | 必須 | — |
| `templates` | [ConsentTemplateOut](https://okaeri.tech/developers/reference/schemas.md#ConsentTemplateOut) の配列 | 必須 | — |
| `consent_optout_link_enabled` | `boolean` | 必須 | — |
| `consent_mode` | `string` | 必須 | 値：`none`・`notice_optout`・`explicit`（今後増えることがある） |
| `optout_text` | [OptoutTextOut](https://okaeri.tech/developers/reference/schemas.md#OptoutTextOut) | 必須 | — |
| `publish_failed` | `string` の配列 | — | 既定値 `[]` |

## ConsentTemplateOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string` | 必須 | 値：`concise`・`formal`・`standard`（今後増えることがある） |
| `main` | `string` | 必須 | — |
| `note` | `string` | 必須 | — |

## ConversionCountsOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `abandoned` | `integer`（null 可） | 必須 | — |
| `converted` | `integer`（null 可） | 必須 | — |

## ConversionDetectedData

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `lead_id` | `string`（uuid） | 必須 | リードの ID（連絡先は `GET /leads/{lead_id}` で取得する） |
| `campaign_id` | `string`（uuid） | 必須 | キャンペーンの ID |
| `site_id` | `string`（uuid） | 必須 | サイトの ID |
| `conversion_source` | `string` | 必須 | CV の検知のしかた。成果の指標に数えるのは `tag`（サンクスページのタグ）だけ。`tag_visitor`＝同じ訪問者の別のキャンペーンの CV から止めた・`hash_match`＝同じ連絡先の CV から止めた 値：`tag`・`tag_visitor`・`hash_match`・`cart_api`・`manual`（今後増えることがある） |
| `converted_at` | `string`（date-time） | 必須 | CV の時刻 |

## DailyCountsOut

面ごと・段ごとの件数。集計がまだの日・シナリオで絞った時の配信以外の面は null。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `traffic` | [TrafficCountsOut](https://okaeri.tech/developers/reference/schemas.md#TrafficCountsOut) | 必須 | — |
| `capture` | [CaptureCountsOut](https://okaeri.tech/developers/reference/schemas.md#CaptureCountsOut) | 必須 | — |
| `conversion` | [ConversionCountsOut](https://okaeri.tech/developers/reference/schemas.md#ConversionCountsOut) | 必須 | — |
| `delivery` | [DeliveryCountsOut](https://okaeri.tech/developers/reference/schemas.md#DeliveryCountsOut) | 必須 | — |

## DailyDayOut

1日分（JST）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `date` | `string` | 必須 | 日付（`YYYY-MM-DD`・JST） |
| `computed` | `boolean` | 必須 | 集計済みか。false の日の件数は null |
| `counts` | [DailyCountsOut](https://okaeri.tech/developers/reference/schemas.md#DailyCountsOut) | 必須 | — |
| `delivery_by_channel` | [DeliveryByChannelOut](https://okaeri.tech/developers/reference/schemas.md#DeliveryByChannelOut) | 必須 | — |
| `converted_spillover` | `integer`（null 可） | 必須 | — |
| `converted_hash_match` | `integer`（null 可） | 必須 | — |

## DailyNotesOut

数字の読み方の注記（画面と同じ文言）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `recovered_cv` | `string` | 必須 | — |
| `traffic_unit` | `string` | 必須 | — |
| `delivery` | `string` | 必須 | — |

## DailyRangeOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `from` | `string` | 必須 | 期間の始まりの日付（含む） |
| `to` | `string` | 必須 | 期間の終わりの日付（含まない） |
| `timezone` | `string` | 必須 | — |
| `site_id` | `string`（null 可） | 必須 | — |
| `campaign_id` | `string`（null 可） | 必須 | — |
| `scenario_id` | `string`（null 可） | 必須 | — |

## DailyReportOut

日次推移（期間は JST の日付の半開区間）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `range` | [DailyRangeOut](https://okaeri.tech/developers/reference/schemas.md#DailyRangeOut) | 必須 | — |
| `refreshed_at` | `string`（null 可） | 必須 | 最後に集計した時刻。集計済みの日が無ければ null |
| `not_computed_dates` | `string` の配列 | 必須 | まだ集計していない日付 |
| `faces` | [ReportFaceOut](https://okaeri.tech/developers/reference/schemas.md#ReportFaceOut) の配列 | 必須 | — |
| `metrics` | [ReportMetricOut](https://okaeri.tech/developers/reference/schemas.md#ReportMetricOut) の配列 | 必須 | — |
| `converted_spillover` | `integer`（null 可） | 必須 | — |
| `converted_hash_match` | `integer`（null 可） | 必須 | — |
| `days` | [DailyDayOut](https://okaeri.tech/developers/reference/schemas.md#DailyDayOut) の配列 | 必須 | — |
| `notes` | [DailyNotesOut](https://okaeri.tech/developers/reference/schemas.md#DailyNotesOut) | 必須 | — |
| `groups` | [DailyStepGroupOut](https://okaeri.tech/developers/reference/schemas.md#DailyStepGroupOut) の配列（null 可） | — | `group_by=step` の時だけ載る |

## DailyStepGroupOut

シナリオのステップ別の実績（`group_by=step`）。期間内に送信の無いステップは行が無い。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `step_id` | `string` | 必須 | — |
| `step_no` | `integer`（null 可） | 必須 | ステップ番号。削除済みで番号が引けない時は null |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `step_deleted` | `boolean` | 必須 | — |
| `counts` | [DeliveryCountsOut](https://okaeri.tech/developers/reference/schemas.md#DeliveryCountsOut) | 必須 | — |
| `metrics` | [ReportMetricOut](https://okaeri.tech/developers/reference/schemas.md#ReportMetricOut) の配列 | 必須 | — |

## DeliveryByChannelOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `sms` | [DeliveryCountsOut](https://okaeri.tech/developers/reference/schemas.md#DeliveryCountsOut) | 必須 | — |
| `email` | [DeliveryCountsOut](https://okaeri.tech/developers/reference/schemas.md#DeliveryCountsOut) | 必須 | — |

## DeliveryCountsOut

配信の段ごとの件数。SMS には開封が無い（`opened` は null）。集計がまだの日は null。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `sent` | `integer`（null 可） | 必須 | — |
| `delivered` | `integer`（null 可） | 必須 | — |
| `opened` | `integer`（null 可） | 必須 | — |
| `clicked` | `integer`（null 可） | 必須 | — |
| `converted` | `integer`（null 可） | 必須 | — |

## DeliveryEventData

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `delivery_id` | `string`（uuid） | 必須 | 配信の ID（`GET /deliveries/{delivery_id}`） |
| `lead_id` | `string`（uuid） | 必須 | リードの ID（連絡先は `GET /leads/{lead_id}` で取得する） |
| `campaign_id` | `string`（uuid） | 必須 | キャンペーンの ID |
| `channel` | `string` | 必須 | チャネル 値：`sms`・`email`（今後増えることがある） |
| `step` | `integer`（null 可） | 必須 | シナリオのステップ番号（1始まり） |
| `status` | `string` | 必須 | 結果（イベント名の後半と同じ） 値：`sent`・`failed`（今後増えることがある） |
| `error_code` | `string` | — | 失敗の理由のコード（`delivery.failed` の時だけ）。固定の語彙ではない（送信事業者が返すエラー名がそのまま入ることがある）＝値で分岐せず、表示とログに使う |

## DeliveryListOut

配信の一覧（cursor 方式）。行は `GET /deliveries/{delivery_id}` と同じ形。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [DeliveryOut](https://okaeri.tech/developers/reference/schemas.md#DeliveryOut) の配列 | 必須 | — |
| `date_field` | `string` | 必須 | 期間の絞り込みに使った日時の項目（クエリ `date_field`） 値：`created_at`・`scheduled_at`・`sent_at`（今後増えることがある） |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## DeliveryOut

配信1件。宛先はマスク済みの `to_masked` だけを返す。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `lead_id` | `string`（uuid） | 必須 | — |
| `status` | `string` | 必須 | 値：`scheduled`・`sending`・`sent`・`delivered`・`failed`・`cancelled`・`suppressed`（今後増えることがある） |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `to_masked` | `string`（null 可） | 必須 | — |
| `pii_state` | `string` | 必須 | 値：`present`・`absent`・`error`（今後増えることがある） |
| `campaign` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `scenario` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `step` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `scheduled_at` | `string`（date-time） | 必須 | — |
| `sent_at` | `string`（date-time）（null 可） | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `cancel_reason` | `string`（null 可） | 必須 | 値：`converted`・`suppressed`・`opted_out`・`cap_exceeded`・`invalid_contact`・`step_removed`（今後増えることがある） |
| `error_code` | `string`（null 可） | 必須 | 失敗の理由のコード。固定の語彙ではない（送信事業者が返すエラー名がそのまま入ることがある）＝値で分岐せず、表示とログに使う |

## DeliveryStatusOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `enabled` | `boolean` | 必須 | — |
| `enabled_at` | `string`（date-time）（null 可） | 必須 | — |
| `mode` | `string` | 必須 | 値：`off`・`test_only`・`live`（今後増えることがある） |

## Error

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `error` | `object` | 必須 | — |

## FormProfileIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `tel_selectors` | `string` の配列（null 可） | — | — |
| `email_selectors` | `string` の配列（null 可） | — | — |
| `consent_selector` | `string`（null 可） | — | — |
| `tel_split_selectors` | `string` の配列（null 可） | — | — |

## FormProfileOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `tel_selectors` | `string` の配列 | 必須 | — |
| `email_selectors` | `string` の配列 | 必須 | — |
| `consent_selector` | `string`（null 可） | 必須 | — |
| `tel_split_selectors` | `string` の配列（null 可） | 必須 | — |
| `detected_by` | `string` | 必須 | 値：`manual`・`preset`・`auto`（今後増えることがある） |
| `detected_at` | `string`（date-time）（null 可） | 必須 | — |

## FromPresetIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `preset_key` | `string` | 必須 | — |
| `name` | `string`（null 可） | — | — |

## FunnelCampaignGroupOut

キャンペーン別の行（`group_by=campaign`）。列ごとに数える基準の日時が違う。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `campaign_id` | `string`（null 可） | 必須 | null はどのキャンペーンにも当たらなかった分 |
| `campaign_key` | `string`（null 可） | 必須 | — |
| `campaign_name` | `string` | 必須 | — |
| `page_view` | `integer` | 必須 | — |
| `form_start` | `integer` | 必須 | — |
| `capture` | `integer` | 必須 | — |
| `conversion` | `integer` | 必須 | — |
| `abandoned` | `integer` | 必須 | — |
| `converted` | `integer` | 必須 | — |
| `converted_spillover` | `integer` | 必須 | — |
| `converted_hash_match` | `integer` | 必須 | — |

## FunnelRangeOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `from` | `string` | 必須 | 期間の始まり（含む） |
| `to` | `string` | 必須 | 期間の終わり（含まない） |
| `site_id` | `string`（null 可） | 必須 | — |
| `campaign_id` | `string`（null 可） | 必須 | — |

## FunnelReportOut

ファネルと指標（期間は半開区間）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `range` | [FunnelRangeOut](https://okaeri.tech/developers/reference/schemas.md#FunnelRangeOut) | 必須 | — |
| `unit` | `string` | 必須 | トラフィックを数える単位の説明 |
| `faces` | [ReportFaceOut](https://okaeri.tech/developers/reference/schemas.md#ReportFaceOut) の配列 | 必須 | — |
| `metrics` | [ReportMetricOut](https://okaeri.tech/developers/reference/schemas.md#ReportMetricOut) の配列 | 必須 | — |
| `volumes` | `object`（項目は未掲載） | 必須 | イベントの種類ごとの件数 |
| `conversion_events` | `integer` | 必須 | — |
| `converted_spillover` | `integer` | 必須 | 別のキャンペーンの CV から止めたリード数 |
| `converted_hash_match` | `integer` | 必須 | 同じ連絡先の CV から止めたリード数 |
| `delivered_inferred` | `integer` | 必須 | 到達の通知は無いが開封・クリックから到達に数えた配信数 |
| `excluded_no_session` | `integer` | 必須 | 訪問を特定できず集計から外したイベント数 |
| `imputed_by_visitor` | `integer` | 必須 | 訪問者の ID で訪問を代用したイベント数 |
| `unassigned_share` | `number`（null 可） | 必須 | どのキャンペーンにも当たらなかった PV の割合 |
| `groups` | [FunnelCampaignGroupOut](https://okaeri.tech/developers/reference/schemas.md#FunnelCampaignGroupOut) の配列（null 可） | — | `group_by=campaign` の時だけ載る |

## LeadAbandonedData

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `lead_id` | `string`（uuid） | 必須 | リードの ID（連絡先は `GET /leads/{lead_id}` で取得する） |
| `campaign_id` | `string`（uuid） | 必須 | キャンペーンの ID |
| `abandoned_at` | `string`（date-time） | 必須 | 離脱が確定した時刻 |

## LeadCapturedData

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `lead_id` | `string`（uuid） | 必須 | リードの ID（連絡先は `GET /leads/{lead_id}` で取得する） |
| `campaign_id` | `string`（uuid） | 必須 | キャンペーンの ID |
| `site_id` | `string`（uuid） | 必須 | サイトの ID |
| `channels` | `string` の配列 | 必須 | 取得した連絡先で届けられるチャネル（SMS は受信できる番号の時だけ） 値：`sms`・`email`（今後増えることがある） |

## LeadDetailOut

詳細だけが返すもの。

流入元（`landing_url` / `referrer` / `utm` / `lp_key`）は一覧に出さず詳細だけで返す。`referrer` には外部サイトの値がそのまま入る。タイムラインも詳細だけで返す。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `site` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `campaign` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `status` | `string` | 必須 | 値：`started`・`captured`・`abandoned`・`queued`・`sent`・`converted`・`suppressed`（今後増えることがある） |
| `consent_state` | `string` | 必須 | 値：`none`・`notice_optout`・`explicit`（今後増えることがある） |
| `email_masked` | `string`（null 可） | 必須 | — |
| `tel_masked` | `string`（null 可） | 必須 | — |
| `pii_state` | `string` | 必須 | 値：`present`・`absent`・`error`（今後増えることがある） |
| `tel_kind` | `string`（null 可） | 必須 | 値：`mobile`・`ip`・`landline`（今後増えることがある） |
| `sms_capable` | `boolean` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `captured_at` | `string`（date-time）（null 可） | 必須 | — |
| `abandoned_at` | `string`（date-time）（null 可） | 必須 | — |
| `converted_at` | `string`（date-time）（null 可） | 必須 | — |
| `conversion_source` | `string`（null 可） | 必須 | 値：`tag`・`tag_visitor`・`hash_match`・`cart_api`・`manual`（今後増えることがある） |
| `suppress_reason` | `string`（null 可） | 必須 | 値：`check_error`・`not_found`・`delivery_disabled`・`campaign_inactive`・`campaign_paused`・`scenario_inactive`・`scenario_paused`・`before_activation`・`stale`・`converted`・`lead_ineligible`・`no_contact`・`not_test_recipient`・`opted_out`・`suppressed`・`invalid_contact`・`sender_unverified`・`free_quota_exhausted`・`subscription_inactive`・`balance_exhausted`・`cap_exceeded`（今後増えることがある） |
| `landing_url` | `string`（null 可） | 必須 | — |
| `referrer` | `string`（null 可） | 必須 | — |
| `utm` | `object`（項目は未掲載） | 必須 | 流入時の UTM パラメータ。画面表示用。形は契約外（予告なく変わる）＝この中の項目に依存した処理を組まない |
| `lp_key` | `string`（null 可） | 必須 | — |
| `timeline` | `object`（項目は未掲載） の配列 | 必須 | リードの出来事の時系列。画面表示用。形は契約外（予告なく変わる）＝この中の項目に依存した処理を組まない |

## LeadListOut

リードの一覧（cursor 方式）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [LeadOut](https://okaeri.tech/developers/reference/schemas.md#LeadOut) の配列 | 必須 | — |
| `date_field` | `string` | 必須 | 期間の絞り込みに使った日時の項目（クエリ `date_field`） 値：`created_at`・`captured_at`・`abandoned_at`・`converted_at`（今後増えることがある） |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## LeadOut

リード1件。連絡先はマスク済みの文字列だけを返す。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `site` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `campaign` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `status` | `string` | 必須 | 値：`started`・`captured`・`abandoned`・`queued`・`sent`・`converted`・`suppressed`（今後増えることがある） |
| `consent_state` | `string` | 必須 | 値：`none`・`notice_optout`・`explicit`（今後増えることがある） |
| `email_masked` | `string`（null 可） | 必須 | — |
| `tel_masked` | `string`（null 可） | 必須 | — |
| `pii_state` | `string` | 必須 | 値：`present`・`absent`・`error`（今後増えることがある） |
| `tel_kind` | `string`（null 可） | 必須 | 値：`mobile`・`ip`・`landline`（今後増えることがある） |
| `sms_capable` | `boolean` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `captured_at` | `string`（date-time）（null 可） | 必須 | — |
| `abandoned_at` | `string`（date-time）（null 可） | 必須 | — |
| `converted_at` | `string`（date-time）（null 可） | 必須 | — |
| `conversion_source` | `string`（null 可） | 必須 | 値：`tag`・`tag_visitor`・`hash_match`・`cart_api`・`manual`（今後増えることがある） |
| `suppress_reason` | `string`（null 可） | 必須 | 値：`check_error`・`not_found`・`delivery_disabled`・`campaign_inactive`・`campaign_paused`・`scenario_inactive`・`scenario_paused`・`before_activation`・`stale`・`converted`・`lead_ineligible`・`no_contact`・`not_test_recipient`・`opted_out`・`suppressed`・`invalid_contact`・`sender_unverified`・`free_quota_exhausted`・`subscription_inactive`・`balance_exhausted`・`cap_exceeded`（今後増えることがある） |

## MatchLocationOut

テストした URL を判定に使う3つの部分に分けたもの。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `hostname` | `string` | 必須 | — |
| `pathname` | `string` | 必須 | — |
| `search` | `string` | 必須 | — |

## MatchRuleOut

配信中のタグ設定に載っている URL ルール1件。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `campaign` | `string` | 必須 | キャンペーンの `key` |
| `role` | `string` | 必須 | 値：`landing`・`form`・`thanks`（今後増えることがある） |
| `match_type` | `string` | 必須 | 値：`prefix`・`glob`・`regex`・`query`・`host`（今後増えることがある） |
| `pattern` | `string` | 必須 | — |
| `priority` | `integer`（null 可） | 必須 | 小さいほど先に評価する。null は最後 |

## MatchTestIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `url` | `string` | 必須 | — |

## MatchTestOut

URL のマッチテストの結果。判定はタグに配る設定と同じルール・同じ順序で行う。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `url` | `string` | 必須 | — |
| `location` | [MatchLocationOut](https://okaeri.tech/developers/reference/schemas.md#MatchLocationOut) | 必須 | — |
| `assigned` | `boolean` | 必須 | どれかのルールに当たったか |
| `campaign` | `string`（null 可） | 必須 | 当たったキャンペーンの `key`。当たらなければ null |
| `role` | `string`（null 可） | 必須 | 当たったルールの役割。当たらなければ null 値：`landing`・`form`・`thanks`（今後増えることがある） |
| `matched` | [MatchRuleOut](https://okaeri.tech/developers/reference/schemas.md#MatchRuleOut)（null 可） | 必須 | 最初に当たったルール。当たらなければ null |
| `evaluated` | [MatchRuleOut](https://okaeri.tech/developers/reference/schemas.md#MatchRuleOut) の配列 | 必須 | 評価したルール（評価順） |

## MessageExampleListOut

メッセージの例文の一覧（全件・ページングなし）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [MessageExampleOut](https://okaeri.tech/developers/reference/schemas.md#MessageExampleOut) の配列 | 必須 | — |

## MessageExampleOut

例文1件。選んだら `POST /messages` の `body`（SMS）／`subject`＋`blocks`（メール）へ。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string` | 必須 | 例文の識別子（`sms_1` 等） |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `position` | `integer` | 必須 | 何通目向けか（推奨シナリオでの順番・チャネルごと） |
| `delay_minutes` | `integer` | 必須 | 推奨シナリオでの送るタイミング（シナリオに入ってから・分） |
| `label` | `string` | 必須 | 表示名（例: 1通目（離脱直後）） |
| `body` | `string`（null 可） | 必須 | SMS の本文。メールは null |
| `subject` | `string`（null 可） | 必須 | メールの件名。SMS は null |
| `blocks` | `object`（項目は未掲載） の配列（null 可） | 必須 | メールのブロック。SMS は null |

## MessageIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `subject` | `string`（null 可） | — | — |
| `body` | `string`（null 可） | — | — |
| `body_html` | `string`（null 可） | — | — |
| `header_image_url` | `string`（null 可） | — | — |
| `link_url` | `string`（null 可） | — | — |
| `link_params` | `object`（項目は未掲載） | — | 既定値 `{}` |
| `blocks` | 任意の値 の配列（null 可） | — | — |

## MessageListOut

文面の一覧（cursor 方式）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [MessageOut](https://okaeri.tech/developers/reference/schemas.md#MessageOut) の配列 | 必須 | — |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## MessageOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `subject` | `string`（null 可） | 必須 | — |
| `body` | `string` | 必須 | — |
| `body_html` | `string`（null 可） | 必須 | — |
| `header_image_url` | `string`（null 可） | 必須 | — |
| `link_url` | `string` | 必須 | — |
| `link_params` | `object`（項目は未掲載） | 必須 | — |
| `blocks` | 任意の値 の配列（null 可） | 必須 | — |
| `sms_segments` | `integer`（null 可） | 必須 | SMS の通数の目安（保存時点）。URL は展開後・商品名は字面（{{product_name}}）で数えたワーストケース（docomo 66文字刻み）。実際の通数はキャンペーンの商品名とキャリアで変わる（実績は配信の記録）。メールは null |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |

## MessagePatch

未送信＝現状維持。`subject` / `body_html` / `header_image_url` / `blocks` は null でクリア

`header_image_url` は null 以外を送ると 422

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `channel` | `string`（null 可） | — | 値：`sms`・`email`（今後増えることがある） |
| `subject` | `string`（null 可） | — | — |
| `body` | `string`（null 可） | — | — |
| `body_html` | `string`（null 可） | — | — |
| `header_image_url` | `string`（null 可） | — | — |
| `link_url` | `string`（null 可） | — | — |
| `link_params` | `object`（項目は未掲載）（null 可） | — | — |
| `blocks` | 任意の値 の配列（null 可） | — | — |

## MessagePreviewIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `campaign_id` | `string`（uuid） | 必須 | — |
| `subject` | `string`（null 可） | — | — |
| `blocks` | 任意の値 の配列 | 必須 | — |

## MessagePreviewOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `subject` | `string` | 必須 | — |
| `html` | `string` | 必須 | — |
| `text` | `string` | 必須 | — |
| `problems` | [MessagePreviewProblem](https://okaeri.tech/developers/reference/schemas.md#MessagePreviewProblem) の配列 | 必須 | — |

## MessagePreviewProblem

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `code` | `string` | 必須 | 値：`not_found`・`sender_info_missing`・`no_link_url`・`unknown_variable`・`missing_value`・`body_too_long`・`token_exhausted`（今後増えることがある） |
| `message` | `string` | 必須 | — |

## MessageVariableOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `name` | `string` | 必須 | — |
| `label` | `string` | 必須 | — |
| `sample` | `string`（null 可） | 必須 | — |

## MessageVariablesOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `campaign_id` | `string`（uuid） | 必須 | — |
| `variables` | [MessageVariableOut](https://okaeri.tech/developers/reference/schemas.md#MessageVariableOut) の配列 | 必須 | — |

## OptoutTextOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `link` | `string` | 必須 | — |
| `done` | `string` | 必須 | — |

## PpCheckListOut

プライバシーポリシーのチェック結果の一覧（cursor 方式）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [PpCheckOut](https://okaeri.tech/developers/reference/schemas.md#PpCheckOut) の配列 | 必須 | — |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## PpCheckOut

プライバシーポリシーのチェック1回の結果。`elements`＝{R1: {state, source, quote}, …}。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `site_id` | `string`（uuid） | 必須 | — |
| `trigger` | `string` | 必須 | 値：`manual`・`sweep`・`recheck`・`operator`（今後増えることがある） |
| `status` | `string` | 必須 | 値：`queued`・`running`・`passed`・`failed`・`error`（今後増えることがある） |
| `pp_url` | `string` | 必須 | — |
| `external_url` | `string`（null 可） | 必須 | — |
| `rule_version` | `string` | 必須 | — |
| `channels` | `string` の配列 | 必須 | 値：`email`・`sms`（今後増えることがある） |
| `elements` | `object`（項目は未掲載） | 必須 | — |
| `links` | `object`（項目は未掲載） | 必須 | — |
| `pages` | `object`（項目は未掲載） の配列 | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `finished_at` | `string`（date-time）（null 可） | 必須 | — |

## ReportFaceOut

集計面。面ごとに数える基準の日時が違う（比率は同じ面の中でだけ出す）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string` | 必須 | — |
| `label` | `string` | 必須 | — |
| `basis` | `string` | 必須 | 数える基準の日時 |
| `available` | `boolean` | 必須 | — |
| `steps` | [ReportStepOut](https://okaeri.tech/developers/reference/schemas.md#ReportStepOut) の配列 | 必須 | — |

## ReportMetricOut

指標（同じ面の2つの段の比率）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string` | 必須 | — |
| `label` | `string` | 必須 | — |
| `face` | `string` | 必須 | 分子・分母の段が属する面の `key` |
| `basis` | `string` | 必須 | — |
| `available` | `boolean` | 必須 | — |
| `numerator` | `string` | 必須 | 分子の段の `key` |
| `denominator` | `string` | 必須 | 分母の段の `key` |
| `numerator_count` | `integer`（null 可） | 必須 | — |
| `denominator_count` | `integer`（null 可） | 必須 | — |
| `rate` | `number`（null 可） | 必須 | 比率（1＝100%）。分母が0・集計がまだなら null |

## ReportStepOut

面の中の段の1つ。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string` | 必須 | — |
| `label` | `string` | 必須 | — |
| `count` | `integer`（null 可） | 必須 | 件数。集計がまだの時は null |
| `rate_from_prev` | `number`（null 可） | 必須 | 親の段（`rate_base`）からの比率（0〜1）。親が無い・分母が0なら null |
| `rate_base` | `string`（null 可） | 必須 | 比率の分母にした段の `key`。先頭の段は null |

## ScenarioDuplicateIn

複製の指定。`campaign_id` 省略＝元と同じキャンペーン。`name` 省略＝「〇〇のコピー」。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `campaign_id` | `string`（uuid）（null 可） | — | — |
| `name` | `string`（null 可） | — | — |

## ScenarioIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `name` | `string` | 必須 | — |
| `status` | `string`（null 可） | — | 作成時は常に draft。APIキーは draft 以外を指定すると 422 値：`draft`・`active`・`paused`（今後増えることがある） |
| `abandon_wait_minutes` | `integer`（null 可） | — | — |

## ScenarioListOut

キャンペーンのシナリオの一覧（全件・ページングなし）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [ScenarioOut](https://okaeri.tech/developers/reference/schemas.md#ScenarioOut) の配列 | 必須 | — |

## ScenarioOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `campaign_id` | `string`（uuid） | 必須 | — |
| `name` | `string` | 必須 | — |
| `status` | `string` | 必須 | 値：`draft`・`active`・`paused`（今後増えることがある） |
| `abandon_wait_minutes` | `integer`（null 可） | 必須 | — |
| `effective_abandon_wait_minutes` | `integer` | 必須 | — |
| `steps` | [StepOut](https://okaeri.tech/developers/reference/schemas.md#StepOut) の配列 | 必須 | — |
| `shop_name_max_chars` | `integer`（null 可） | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |

## ScenarioPatch

未送信＝現状維持。`abandon_wait_minutes` の null はキャンペーンの値に戻す。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `name` | `string`（null 可） | — | — |
| `status` | `string`（null 可） | — | 値：`draft`・`active`・`paused`（今後増えることがある） |
| `abandon_wait_minutes` | `integer`（null 可） | — | — |

## ScenarioPresetListOut

シナリオのテンプレートの一覧（全件・ページングなし）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [ScenarioPresetOut](https://okaeri.tech/developers/reference/schemas.md#ScenarioPresetOut) の配列 | 必須 | — |

## ScenarioPresetOut

シナリオのテンプレート1件。作成は `POST /campaigns/{campaign_id}/scenarios/from_preset`。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `key` | `string` | 必須 | テンプレートの識別子（作成時の `preset_key`） |
| `name` | `string` | 必須 | — |
| `step_count` | `integer` | 必須 | — |
| `steps` | [ScenarioPresetStepOut](https://okaeri.tech/developers/reference/schemas.md#ScenarioPresetStepOut) の配列 | 必須 | — |
| `available` | `boolean` | 必須 | 今のプランで使えるか（ステップ数の上限で決まる） |
| `unavailable_reason` | `string`（null 可） | 必須 | 使えない時の理由。使える時は null |
| `required_plan` | `string`（null 可） | 必須 | 使えない時に、使えるようになる今より上で一番安いプラン。使える時・プランを変えても使えない時は null 値：`free`・`starter`・`growth`・`pro`（今後増えることがある） |
| `shop_name_max_chars` | `integer`（null 可） | 必須 | このテンプレートの SMS が全部1通に収まる店名の最大字数。SMS が無ければ null |

## ScenarioPresetStepOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `delay_minutes` | `integer` | 必須 | シナリオに入ってから送るまでの時間（分） |

## SiteDetailOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `name` | `string` | 必須 | — |
| `site_key` | `string` | 必須 | — |
| `domains` | `string` の配列 | 必須 | — |
| `cart_preset` | `string` | 必須 | 値：`ecforce`・`futureshop`・`samurai`・`tamago`・`cf7`・`generic`（今後増えることがある） |
| `is_active` | `boolean` | 必須 | — |
| `config_version` | `integer` | 必須 | — |
| `config_published_at` | `string`（date-time）（null 可） | 必須 | — |
| `config_publish_error` | `string`（null 可） | 必須 | — |
| `publish_state` | `string` | 必須 | 値：`never`・`published`・`failed`（今後増えることがある） |
| `privacy_policy_url` | `string`（null 可） | 必須 | — |
| `external_transmission_url` | `string`（null 可） | 必須 | — |
| `pp_url_changed_at` | `string`（date-time）（null 可） | 必須 | — |
| `pp_check` | `object`（項目は未掲載） | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |
| `snippets` | `object`（項目は未掲載） | 必須 | 貼り付け用の設置コード一式。画面表示用。形は契約外（予告なく変わる）＝この中の項目に依存した処理を組まない。CSP 用の形はクエリ `nonce=true` |
| `stop_page_url` | `string` | 必須 | プライバシーポリシーに貼る配信停止ページの URL。訪問者が電話番号・メールアドレスを入力すると、そのテナントへの配信を停止する（登録の有無に関わらず同じ応答） |

## SiteListOut

サイトの一覧（cursor 方式）。設置コード（`snippets`）は詳細だけに載る。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [SiteOut](https://okaeri.tech/developers/reference/schemas.md#SiteOut) の配列 | 必須 | — |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## SiteOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `name` | `string` | 必須 | — |
| `site_key` | `string` | 必須 | — |
| `domains` | `string` の配列 | 必須 | — |
| `cart_preset` | `string` | 必須 | 値：`ecforce`・`futureshop`・`samurai`・`tamago`・`cf7`・`generic`（今後増えることがある） |
| `is_active` | `boolean` | 必須 | — |
| `config_version` | `integer` | 必須 | — |
| `config_published_at` | `string`（date-time）（null 可） | 必須 | — |
| `config_publish_error` | `string`（null 可） | 必須 | — |
| `publish_state` | `string` | 必須 | 値：`never`・`published`・`failed`（今後増えることがある） |
| `privacy_policy_url` | `string`（null 可） | 必須 | — |
| `external_transmission_url` | `string`（null 可） | 必須 | — |
| `pp_url_changed_at` | `string`（date-time）（null 可） | 必須 | — |
| `pp_check` | `object`（項目は未掲載） | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |

## SmsEstimateIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `body` | `string` | 必須 | 1文字以上 |

## SmsEstimateOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `chars` | `integer` | 必須 | 課金通数の判定に使う文字数。URL の差し込み変数（`{{short_url}}` / `{{unsubscribe_url}}`）は送信時と同じ長さに展開した後で数える。UTF-16 のコードユニット数（絵文字は2）で、改行は1つにつき2 |
| `segments` | `integer` | 必須 | 課金通数の目安。キャリア未確定のワーストケース（docomo＝70文字超は66文字刻み） |
| `max_segments` | `integer` | 必須 | 1本の SMS の通数の上限（本文上限で数えた値） |

## StepIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid）（null 可） | — | — |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `delay_kind` | `string` | 必須 | 値：`after_previous`・`after_entry`・`at_clock_time`（今後増えることがある） |
| `delay_minutes` | `integer`（null 可） | — | — |
| `send_at_time` | `string`（null 可） | — | — |
| `message_id` | `string`（uuid） | 必須 | — |

## StepOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `step_no` | `integer` | 必須 | — |
| `channel` | `string` | 必須 | 値：`sms`・`email`（今後増えることがある） |
| `delay_kind` | `string` | 必須 | 値：`after_previous`・`after_entry`・`at_clock_time`（今後増えることがある） |
| `delay_minutes` | `integer`（null 可） | 必須 | — |
| `send_at_time` | `string`（null 可） | 必須 | — |
| `message_id` | `string`（uuid） | 必須 | — |

## StepsIn

一括置換。**並び順がそのまま `step_no`** になる（画面の上下順）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `steps` | [StepIn](https://okaeri.tech/developers/reference/schemas.md#StepIn) の配列 | 必須 | — |

## SuppressionCreatedOut

登録した除外1件と、その登録で取り消した配信予約の件数。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `scope` | `string` | 必須 | 値：`tenant`・`campaign`（今後増えることがある） |
| `campaign` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `kind` | `string` | 必須 | 値：`email`・`tel`（今後増えることがある） |
| `value_masked` | `string`（null 可） | 必須 | — |
| `pii_state` | `string` | 必須 | 値：`present`・`absent`・`error`（今後増えることがある） |
| `reason` | `string` | 必須 | 値：`opt_out`・`manual`・`bounce`・`complaint`・`undeliverable`（今後増えることがある） |
| `memo` | `string`（null 可） | 必須 | — |
| `expires_at` | `string`（date-time）（null 可） | 必須 | — |
| `active` | `boolean` | 必須 | — |
| `deletable` | `boolean` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |
| `cancelled_deliveries` | `integer` | 必須 | この登録で取り消した同じ宛先の配信予約の件数 |

## SuppressionIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `scope` | `string` | — | 値：`tenant`・`campaign`（今後増えることがある） 既定値 `"tenant"` |
| `campaign_id` | `string`（uuid）（null 可） | — | — |
| `expires_at` | `string`（date-time）（null 可） | — | — |
| `memo` | `string`（null 可） | — | — |
| `value` | `string`（null 可） | — | — |

## SuppressionListOut

除外リストの一覧（cursor 方式）。宛先はマスクした文字列だけ。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [SuppressionOut](https://okaeri.tech/developers/reference/schemas.md#SuppressionOut) の配列 | 必須 | — |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## SuppressionOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `scope` | `string` | 必須 | 値：`tenant`・`campaign`（今後増えることがある） |
| `campaign` | `object`（項目は未掲載）（null 可） | 必須 | — |
| `kind` | `string` | 必須 | 値：`email`・`tel`（今後増えることがある） |
| `value_masked` | `string`（null 可） | 必須 | — |
| `pii_state` | `string` | 必須 | 値：`present`・`absent`・`error`（今後増えることがある） |
| `reason` | `string` | 必須 | 値：`opt_out`・`manual`・`bounce`・`complaint`・`undeliverable`（今後増えることがある） |
| `memo` | `string`（null 可） | 必須 | — |
| `expires_at` | `string`（date-time）（null 可） | 必須 | — |
| `active` | `boolean` | 必須 | — |
| `deletable` | `boolean` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | — |

## TakeoverRuleOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `match_type` | `string` | 必須 | 値：`prefix`・`glob`・`regex`・`query`・`host`（今後増えることがある） |
| `pattern` | `string` | 必須 | — |
| `priority` | `integer`（null 可） | 必須 | — |

## TakeoverWarningOut

横取りの警告。稼働中の `from_campaign` が担当していた実URLを`to_campaign` の URL ルールが奪った。保存は成立している（止めない）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `code` | `"url_takeover"` | 必須 | — |
| `message` | `string` | 必須 | — |
| `from_campaign` | [CampaignRefOut](https://okaeri.tech/developers/reference/schemas.md#CampaignRefOut) | 必須 | — |
| `to_campaign` | [CampaignRefOut](https://okaeri.tech/developers/reference/schemas.md#CampaignRefOut) | 必須 | — |
| `count` | `integer` | 必須 | — |
| `sample_urls` | `string` の配列 | 必須 | — |
| `rules` | [TakeoverRuleOut](https://okaeri.tech/developers/reference/schemas.md#TakeoverRuleOut) の配列 | 必須 | — |

## TrafficCountsOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `page_view` | `integer`（null 可） | 必須 | — |
| `form_view` | `integer`（null 可） | 必須 | — |
| `form_start` | `integer`（null 可） | 必須 | — |
| `capture` | `integer`（null 可） | 必須 | — |

## UrlRuleIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `role` | `string` | 必須 | 値：`landing`・`form`・`thanks`（今後増えることがある） |
| `match_type` | `string` | 必須 | 値：`prefix`・`glob`・`regex`・`query`・`host`（今後増えることがある） |
| `pattern` | `string` | 必須 | — |

## UrlRuleOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `role` | `string` | 必須 | 値：`landing`・`form`・`thanks`（今後増えることがある） |
| `match_type` | `string` | 必須 | 値：`prefix`・`glob`・`regex`・`query`・`host`（今後増えることがある） |
| `pattern` | `string` | 必須 | — |
| `priority` | `integer` | 必須 | — |

## UrlRulesIn

一括置換。**並び順がそのまま優先順位**になる（画面のドラッグ順）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `rules` | [UrlRuleIn](https://okaeri.tech/developers/reference/schemas.md#UrlRuleIn) の配列 | 必須 | — |

## UsageThresholdReachedData

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `resource` | `string` | 必須 | 枠の種類（SMS は通数・メールは件数） 値：`sms_segments`・`emails`（今後増えることがある） |
| `threshold` | `integer` | 必須 | 到達した割合（%） 値：`80`・`100`（今後増えることがある） |
| `used` | `integer` | 必須 | 使った量 |
| `limit` | `integer` | 必須 | 枠の上限 |
| `period` | `object`（null 可） | 必須 | 枠の期間（月額プランの請求期間）。Free の総量枠は期間が無く null |

## WebhookDeliveryListOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [WebhookDeliveryOut](https://okaeri.tech/developers/reference/schemas.md#WebhookDeliveryOut) の配列 | 必須 | — |
| `next_cursor` | `string`（null 可） | 必須 | — |
| `has_more` | `boolean` | 必須 | — |

## WebhookDeliveryOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `endpoint_id` | `string`（uuid） | 必須 | — |
| `event` | `string` | 必須 | 値：`lead.captured`・`lead.abandoned`・`delivery.sent`・`delivery.failed`・`conversion.detected`・`usage.threshold_reached`（今後増えることがある） |
| `status` | `string` | 必須 | 値：`pending`・`succeeded`・`failed`（今後増えることがある） |
| `attempts` | `integer` | 必須 | — |
| `next_attempt_at` | `string`（date-time）（null 可） | 必須 | — |
| `response_code` | `integer`（null 可） | 必須 | — |
| `response_body` | `string`（null 可） | 必須 | — |
| `payload` | [WebhookEvent](https://okaeri.tech/developers/reference/schemas.md#WebhookEvent) | 必須 | 送った本文（再送でも同じ） |
| `created_at` | `string`（date-time） | 必須 | — |
| `delivered_at` | `string`（date-time）（null 可） | 必須 | — |

## WebhookEndpointCreatedOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `url` | `string` | 必須 | — |
| `events` | `string` の配列 | 必須 | 値：`lead.captured`・`lead.abandoned`・`delivery.sent`・`delivery.failed`・`conversion.detected`・`usage.threshold_reached`（今後増えることがある） |
| `status` | `string` | 必須 | 値：`active`・`disabled`（今後増えることがある） |
| `consecutive_failures` | `integer` | 必須 | — |
| `disabled_reason` | `string`（null 可） | 必須 | 値：`consecutive_failures`（今後増えることがある） |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |
| `secret` | `string` | 必須 | — |

## WebhookEndpointIn

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `url` | `string`（null 可） | — | — |
| `events` | `string` の配列 | — | 値：`lead.captured`・`lead.abandoned`・`delivery.sent`・`delivery.failed`・`conversion.detected`・`usage.threshold_reached`（今後増えることがある） 既定値 `[]` |

## WebhookEndpointListOut

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `data` | [WebhookEndpointOut](https://okaeri.tech/developers/reference/schemas.md#WebhookEndpointOut) の配列 | 必須 | — |

## WebhookEndpointOut

送信先（一覧・取得の形）。**署名鍵 `secret` は含まない**（作成の応答にだけ載る）。

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | — |
| `url` | `string` | 必須 | — |
| `events` | `string` の配列 | 必須 | 値：`lead.captured`・`lead.abandoned`・`delivery.sent`・`delivery.failed`・`conversion.detected`・`usage.threshold_reached`（今後増えることがある） |
| `status` | `string` | 必須 | 値：`active`・`disabled`（今後増えることがある） |
| `consecutive_failures` | `integer` | 必須 | — |
| `disabled_reason` | `string`（null 可） | 必須 | 値：`consecutive_failures`（今後増えることがある） |
| `created_at` | `string`（date-time） | 必須 | — |
| `updated_at` | `string`（date-time） | 必須 | — |

## WebhookEvent

Outbound Webhook で送信先へ送る本文（`POST`・`Content-Type: application/json`・`User-Agent: OKAERI-Webhook/1`）。`type` ごとに `data` の形が決まる。連絡先（電話・メール）は含まない（必要なら `lead_id` で取得する）。

**受け方**

- 2xx を返すと成功。それ以外の応答・接続できない時は再試行する（初回＋再試行5回＝最大6回・間隔は 1分 → 5分 → 30分 → 2時間 → 6時間）。リダイレクトは追わない。連続して失敗し続けた送信先は自動で停止する（`disabled_reason`）
- 少なくとも1回届ける＝同じイベントが2回以上届くことがある。`id` で重複を除く（再試行・再送でも`id` は同じ）
- ヘッダ `X-OKAERI-Event`＝`type` と同じ値。`X-OKAERI-Delivery`＝送信ごとの ID（再送で変わる）

**署名の検証**（ヘッダ `X-OKAERI-Signature: t=<UNIX 秒>,v1=<16進>`）

1. ヘッダを `,` で分け、`t` と `v1` を取り出す
2. `<t>.<受け取った本文のバイト列>` を、送信先の作成時に1回だけ受け取った `secret`（`whsec_…`）を鍵にして HMAC-SHA256 で計算し、16進（小文字）にする。本文は JSON として読み直したものでなく、受け取ったバイト列そのままを使う
3. 計算した値と `v1` を定数時間で比較する。一致しなければ破棄する
4. `t` と受信時刻の差が許容範囲（推奨 5分）を超えたら破棄する（盗んだ本文の再送の対策）。`t` は送るたびにその時刻で付け直す（再試行・再送でも古くならない）

次のいずれか（`type` で分かれる）：[WebhookEventLeadCaptured](https://okaeri.tech/developers/reference/schemas.md#WebhookEventLeadCaptured)・[WebhookEventLeadAbandoned](https://okaeri.tech/developers/reference/schemas.md#WebhookEventLeadAbandoned)・[WebhookEventDeliverySent](https://okaeri.tech/developers/reference/schemas.md#WebhookEventDeliverySent)・[WebhookEventDeliveryFailed](https://okaeri.tech/developers/reference/schemas.md#WebhookEventDeliveryFailed)・[WebhookEventConversionDetected](https://okaeri.tech/developers/reference/schemas.md#WebhookEventConversionDetected)・[WebhookEventUsageThresholdReached](https://okaeri.tech/developers/reference/schemas.md#WebhookEventUsageThresholdReached)

## WebhookEventConversionDetected

`conversion.detected` の本文

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | イベントの ID＝受け手の重複除去のキー（再試行・再送でも同じ） |
| `type` | `"conversion.detected"` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | イベントの発生時刻 |
| `tenant_id` | `string`（uuid） | 必須 | テナントの ID |
| `data` | [ConversionDetectedData](https://okaeri.tech/developers/reference/schemas.md#ConversionDetectedData) | 必須 | — |

```json
{
  "id": "00000000-0000-7000-8000-000000000001",
  "type": "conversion.detected",
  "created_at": "2026-01-01T00:00:00Z",
  "tenant_id": "00000000-0000-7000-8000-000000000002",
  "data": {
    "lead_id": "00000000-0000-7000-8000-000000000003",
    "campaign_id": "00000000-0000-7000-8000-000000000004",
    "site_id": "00000000-0000-7000-8000-000000000005",
    "conversion_source": "tag",
    "converted_at": "2026-01-01T00:00:00Z"
  }
}
```

## WebhookEventDeliveryFailed

`delivery.failed` の本文

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | イベントの ID＝受け手の重複除去のキー（再試行・再送でも同じ） |
| `type` | `"delivery.failed"` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | イベントの発生時刻 |
| `tenant_id` | `string`（uuid） | 必須 | テナントの ID |
| `data` | [DeliveryEventData](https://okaeri.tech/developers/reference/schemas.md#DeliveryEventData) | 必須 | — |

```json
{
  "id": "00000000-0000-7000-8000-000000000001",
  "type": "delivery.failed",
  "created_at": "2026-01-01T00:00:00Z",
  "tenant_id": "00000000-0000-7000-8000-000000000002",
  "data": {
    "delivery_id": "00000000-0000-7000-8000-000000000006",
    "lead_id": "00000000-0000-7000-8000-000000000003",
    "campaign_id": "00000000-0000-7000-8000-000000000004",
    "channel": "sms",
    "step": 1,
    "status": "failed",
    "error_code": "invalid_number"
  }
}
```

## WebhookEventDeliverySent

`delivery.sent` の本文

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | イベントの ID＝受け手の重複除去のキー（再試行・再送でも同じ） |
| `type` | `"delivery.sent"` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | イベントの発生時刻 |
| `tenant_id` | `string`（uuid） | 必須 | テナントの ID |
| `data` | [DeliveryEventData](https://okaeri.tech/developers/reference/schemas.md#DeliveryEventData) | 必須 | — |

```json
{
  "id": "00000000-0000-7000-8000-000000000001",
  "type": "delivery.sent",
  "created_at": "2026-01-01T00:00:00Z",
  "tenant_id": "00000000-0000-7000-8000-000000000002",
  "data": {
    "delivery_id": "00000000-0000-7000-8000-000000000006",
    "lead_id": "00000000-0000-7000-8000-000000000003",
    "campaign_id": "00000000-0000-7000-8000-000000000004",
    "channel": "sms",
    "step": 1,
    "status": "sent"
  }
}
```

## WebhookEventLeadAbandoned

`lead.abandoned` の本文

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | イベントの ID＝受け手の重複除去のキー（再試行・再送でも同じ） |
| `type` | `"lead.abandoned"` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | イベントの発生時刻 |
| `tenant_id` | `string`（uuid） | 必須 | テナントの ID |
| `data` | [LeadAbandonedData](https://okaeri.tech/developers/reference/schemas.md#LeadAbandonedData) | 必須 | — |

```json
{
  "id": "00000000-0000-7000-8000-000000000001",
  "type": "lead.abandoned",
  "created_at": "2026-01-01T00:00:00Z",
  "tenant_id": "00000000-0000-7000-8000-000000000002",
  "data": {
    "lead_id": "00000000-0000-7000-8000-000000000003",
    "campaign_id": "00000000-0000-7000-8000-000000000004",
    "abandoned_at": "2026-01-01T00:00:00Z"
  }
}
```

## WebhookEventLeadCaptured

`lead.captured` の本文

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | イベントの ID＝受け手の重複除去のキー（再試行・再送でも同じ） |
| `type` | `"lead.captured"` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | イベントの発生時刻 |
| `tenant_id` | `string`（uuid） | 必須 | テナントの ID |
| `data` | [LeadCapturedData](https://okaeri.tech/developers/reference/schemas.md#LeadCapturedData) | 必須 | — |

```json
{
  "id": "00000000-0000-7000-8000-000000000001",
  "type": "lead.captured",
  "created_at": "2026-01-01T00:00:00Z",
  "tenant_id": "00000000-0000-7000-8000-000000000002",
  "data": {
    "lead_id": "00000000-0000-7000-8000-000000000003",
    "campaign_id": "00000000-0000-7000-8000-000000000004",
    "site_id": "00000000-0000-7000-8000-000000000005",
    "channels": [
      "email",
      "sms"
    ]
  }
}
```

## WebhookEventUsageThresholdReached

`usage.threshold_reached` の本文

| 項目 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| `id` | `string`（uuid） | 必須 | イベントの ID＝受け手の重複除去のキー（再試行・再送でも同じ） |
| `type` | `"usage.threshold_reached"` | 必須 | — |
| `created_at` | `string`（date-time） | 必須 | イベントの発生時刻 |
| `tenant_id` | `string`（uuid） | 必須 | テナントの ID |
| `data` | [UsageThresholdReachedData](https://okaeri.tech/developers/reference/schemas.md#UsageThresholdReachedData) | 必須 | — |

```json
{
  "id": "00000000-0000-7000-8000-000000000001",
  "type": "usage.threshold_reached",
  "created_at": "2026-01-01T00:00:00Z",
  "tenant_id": "00000000-0000-7000-8000-000000000002",
  "data": {
    "resource": "sms_segments",
    "threshold": 80,
    "used": 800,
    "limit": 1000,
    "period": {
      "start": "2026-01-01T00:00:00Z",
      "end": "2026-02-01T00:00:00Z"
    }
  }
}
```
