contAIct

API リファレンス

ベース URL:https://api.contaict.app

すべてのリクエスト・レスポンスは Content-Type: application/json です。

POST /v1/token

アクセストークンを発行します。フロー A(ブラウザ JS)専用です。サイトキーcs_)を使用してください。

リクエスト

パラメータ 場所 説明
api_key クエリ string サイトキー(cs_ で始まる)
POST /v1/token?api_key=cs_xxxxxxxxxxxx

レスポンス 200 OK

フィールド 説明
token string アクセストークン。発行から 10 分間有効。同一トークンで初回判定+5 回まで再判定が可能です(補足事項参照)
expires_at string トークンの有効期限(UTC ISO 8601 形式)
{
  "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "expires_at": "2026-06-07T10:20:30Z"
}

エラー

ステータス error 説明
400 invalid_request api_key が空
401 unauthorized APIキーが無効、無効化済み、またはサイトキー以外
403 forbidden Origin がドメイン制限に一致しない
429 rate_limit_exceeded 同一 IP からのトークン発行が短時間に集中(10 分間に 30 件)
429 quota_exceeded 月次スキャン上限に達した
POST /v1/analyze

テキストのスパムスコアを返します。フロー A(トークン)とフロー B(Bearer)の 2 種類の認証方式に対応しています。

A トークンフロー

推奨構成:トークン取得はブラウザ JS、/v1/analyze の呼び出しはサーバーサイドから行います。ブラウザから直接 analyze を呼ぶ構成ではスコアをクライアント側で改ざんできるため、判定として機能しません。

パラメータ 場所 説明
token body string /v1/token で取得したトークン
text body string 判定対象のテキスト(最大 3,000 文字)
POST /v1/analyze
Content-Type: application/json

{
  "token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "text": "お問い合わせ本文"
}

B Bearer フロー(サーバー間)

パラメータ 場所 説明
Authorization header string Bearer sk_xxxx(サーバーキー)
text body string 判定対象のテキスト(最大 3,000 文字)
client_ip body string フォーム送信者の IP アドレス(必須)。不正アクセス検知に使用します。リバースプロキシ環境では REMOTE_ADDR がプロキシの IP になる場合があるため、適切なヘッダー(X-Forwarded-For 等)から取得してください。
POST /v1/analyze
Content-Type: application/json
Authorization: Bearer sk_xxxxxxxxxxxx

{
  "text": "お問い合わせ本文",
  "client_ip": "203.0.113.45"
}

レスポンス 200 OK(A・B 共通)

フィールド 説明
score integer 0〜100 の整数
reason string 送信者に向けた判定理由(日本語 1〜2 文)
{
  "score": 85,
  "reason": "お送りいただいた内容は、一方的なSEO対策サービスの売り込みであり、スパムと判断いたしました。"
}

エラー

ステータス error 説明
400 invalid_request token または text が空
401 unauthorized APIキーが無効、無効化済み、または種別違い(サーバーキー以外)
403 forbidden IP 制限に一致しない
400 text_too_long text が 3,000 文字を超えている
404 token_not_found トークンが存在しない
410 token_expired トークンの有効期限切れ(発行から 10 分超過)
429 rate_limit_exceeded リクエストが短時間に集中、または異常なアクセスパターンを検出
429 quota_exceeded 月次スキャン上限に達した
429 rescan_limit_exceeded 同一トークンでの再スキャンが上限(5 回)を超えた。新しいトークンを取得して再送信してください(フロー A のみ)

エラーレスポンス例

{
  "error": "unauthorized"
}

スコアの見方

スコア 目安
0〜29 通常のお問い合わせ
30〜69 判断が難しい(要確認)
70〜100 スパムの疑いが強い

スコアの閾値判断はアプリケーション側で行ってください。contAIct はスコアのみを返します。

APIキーの種別

種別 プレフィックス 用途 使用できるエンドポイント
サイトキー cs_ ブラウザ JS に埋め込む公開キー。ドメイン制限必須。 /v1/token
サーバーキー sk_ サーバーサイド専用。ブラウザに露出させないこと。 /v1/analyze(Bearer)

補足事項

月次スキャン件数のカウント定義

  • フロー A:/v1/analyze の初回成功時に 1 件カウントします。同一トークンでの再スキャン(書き直し)は 5 回まで追加カウントされません。6 回目以降は 429 rescan_limit_exceeded が返るため、新しいトークンを取得してください(新規 1 件としてカウントされます)。
  • フロー B:/v1/analyze の成功時に毎回 1 件カウントします。
  • 月の起算日は、Free プランはアカウント登録日、有料プランは課金開始日(Checkout 完了日)です(暦月ではありません)。

テキストの文字数制限

最大 3,000 文字(Unicode 文字数)。漢字・かなも 1 文字としてカウントされます。上限を超えた場合は 400 text_too_long が返ります。

対応言語

判定対象テキストは日本語を前提としています。reason フィールドは常に日本語で返します。

ドメイン制限(フロー A)の仕様

  • 登録ドメインと Origin ヘッダーのホスト部分を照合します。
  • サブドメインも許可されます(例:example.com と設定すると sub.example.com も通ります)。
  • localhost127.0.0.1 も登録すれば開発環境で使用できます。
  • ワイルドカード(*.example.com)は使用できません。

IP 制限(フロー B)の仕様

  • 未設定の場合はすべての IP から呼び出し可能です。
  • CIDR 表記(例:203.0.113.0/24)での設定も可能です。
  • 照合対象はリクエスト元サーバーの IP(REMOTE_ADDR)です。

トークンと Origin のバインドについて

発行済みトークンは Origin に紐付きません。/v1/analyze はサーバーサイドから呼び出す設計のため、Origin ヘッダーの照合は行いません。

サンプルコード

フローごとにすぐ使える PHP サンプルを GitHub で公開しています。

dotAster/contaict-examples