フォーム ID

REST API

シークレットキーで、フォームと送信データの読み取り、送信データのスパムへの移動と解除、削除を行います。

REST API を使うと、サーバーからフォームと送信データを読み取り、送信データをスパムに移動または解除し、削除できます。https://ikiform.com/api/v1 で HTTPS 経由の JSON を使います。OpenAPI 3.1 のドキュメントは /api/v1/openapi.json にあります。

送信データの作成は /api/v1 には含まれません。代わりに、シークレットキーを付けてフォームのエンドポイントに送信してください。サーバーから送信するを参照してください。

API キー

キーはダッシュボードの API keys で作成します。キーは 1 つのワークスペースに属し、そのワークスペースしか参照できません。キー全体が表示されるのは 1 回だけで、Ikiform はハッシュしか保存しません。

種類プレフィックス用途
シークレットik_sk_サーバー用。選んだスコープで REST API を呼び出せ、送信データも作成できます。
公開可能ik_pub_ブラウザー用。フォームの送信しかできず、キーに登録したドメインからしか使えません。

スコープ

スコープ許可される操作
forms:readGET /forms, GET /forms/:formId
submissions:readGET /submissions, GET /submissions/:id
submissions:writeDELETE /submissions/:id、POST /submissions/:id/spam と /not-spam、/f/:formId への送信

認証

シークレットキーを Bearer トークンとして送ります。API はサーバー間専用です。CORS ヘッダーを送らず、ブラウザーのプリフライトには 405 で応答するため、シークレットキーが Web ページから使えることはありません。

ターミナル
curl https://ikiform.com/api/v1/forms \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"
  • キーがない、不正な形式、存在しない、無効化された、期限切れの場合は、WWW-Authenticate: Bearer 付きの 401 unauthorized が返ります。
  • 公開可能キーには 403 forbidden(Publishable keys can only submit forms.)が返ります。必要なスコープのないキーには、メッセージにスコープ名を含む 403 forbidden が返ります。
  • レスポンスは Cache-Control: no-store 付きで送られます。

以下の SDK の例では、1 つのクライアントを共有します:

ikiform.ts
import { createClient } from "@ikiform/sdk";

const ikiform = createClient({ apiKey: process.env.IKIFORM_SECRET_KEY! });

リクエストコンポーザー

フォーム
フォーム ID
curl "https://ikiform.com/api/v1/submissions?form_id=frm_xxxxxxxxxxxxxxxx&status=received&limit=50" \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

これはサーバーから実行してください。REST API はブラウザーからのリクエストを拒否するため、このページからは送信しません。

エンドポイント

メソッドパススコープ返すもの
GET/formsforms:readフォームの一覧
GET/forms/:formIdforms:readフォームを取得
GET/submissionssubmissions:read送信データの一覧
GET/submissions/:idsubmissions:read送信データを取得
POST/submissions/:id/spamsubmissions:writeスパムとしてマーク
POST/submissions/:id/not-spamsubmissions:writeスパムではないとマーク
DELETE/submissions/:idsubmissions:write送信データを削除
GET/openapi.jsonなしOpenAPI のドキュメント
GET/healthなし{ "ok": true }

フォームの一覧

forms:read スコープで GET /forms。

  • 新しい順。limit(1〜100、デフォルト 25)と cursor を受け取ります。
curl "https://ikiform.com/api/v1/forms?limit=10" \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

フォームを取得

forms:read スコープで GET /forms/:formId。

  • 別のワークスペースのフォーム ID は、存在しない ID とまったく同じく 404 を返します。
curl https://ikiform.com/api/v1/forms/frm_xxxxxxxxxxxxxxxx \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

送信データの一覧

submissions:read スコープで GET /submissions。

パラメーター値デフォルト
form_idフォーム IDワークスペースのすべてのフォーム
statusreceived または spam両方
limit1〜10025
cursor前のページの next_cursor最初のページ
  • 新しい順。別のワークスペースの form_id はエラーではなく空の一覧を返すので、ID を探られることはありません。
curl "https://ikiform.com/api/v1/submissions?form_id=frm_xxxxxxxxxxxxxxxx&status=received&limit=50" \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

送信データを取得

submissions:read スコープで GET /submissions/:id。

  • 別のワークスペースの ID は、存在しない ID とまったく同じく 404 を返します。
curl https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3 \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

スパムとしてマーク

submissions:write スコープで POST /submissions/:id/spam。

  • 受信済みの送信データをスパムに移動し、フォームの submission_count を減らし、保留中の Webhook の配信をキャンセルします。
  • すでにスパムの送信データに対して呼び出すと、変更せずにそのまま返します。
curl -X POST https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3/spam \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

スパムではないとマーク

submissions:write スコープで POST /submissions/:id/not-spam。

  • 受信済みに戻し、スパムスコアと理由を消去し、一致するすべての Webhook エンドポイントに submission.created を送ります。
  • 受信済みの送信データに対して呼び出すと、変更せずにそのまま返します。
curl -X POST https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3/not-spam \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

送信データを削除

submissions:write スコープで DELETE /submissions/:id。

  • 送信データとその Webhook の配信を完全に削除します。元に戻すことはできません。もう一度削除すると 404 が返ります。
curl -X DELETE https://ikiform.com/api/v1/submissions/sub_01k7v2c9t3e8m5q4x6z0a1b2c3 \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY"

オブジェクト

オブジェクトは object フィールドを持つ snake_case の JSON です。タイムスタンプはミリ秒付きの ISO 8601(UTC)です。送信 ID は時刻順(sub_ に続く 26 文字)、フォーム ID はランダム(frm_ に続く 16 文字)です。

フォームのフィールド説明
statusactive、paused、disabled のいずれか
submission_count受信済みの送信データ数(スパムを除く)
送信データのフィールド説明
statusreceived または spam
fields保存された値
metauser_agent、origin、referrer、country、subject、reply_to。すべてのキーが存在し、どの値も null になりえます。IP ハッシュが返されることはありません
spam.score, spam.reasonsスパムスコアと理由(honeypot、origin_mismatch など)

ページネーション

一覧は新しい順で、不透明なカーソルを使います。

  1. カーソルなしでリクエストします。
  2. has_more が true なら、同じフィルターで next_cursor を cursor として送ります。
  3. next_cursor が null になったら終了します。

新しい送信データが届いても、ページは安定しています。新しいものは最初のページに表示され、後ろのページで重複することはありません。カーソルを自分で組み立てたり解析したりしないでください。無効なカーソルは 400 invalid_request を返します。

for await (const submission of ikiform.submissions.iterate({ formId: "frm_xxxxxxxxxxxxxxxx" })) {
  console.log(submission.id, submission.fields);
}

エラー

エラーはフォームの送信と同じ形式を使います。すべてのレスポンスに X-Request-Id ヘッダーが付き、エラーではそれが request_id として繰り返されます。

403 Forbidden
{
  "ok": false,
  "error": { "code": "forbidden", "message": "This API key is missing the forms:read scope." },
  "request_id": "req_01k7v2c9t3e8m5q4x6z0a1b2c3"
}
ステータスコードタイミング
400invalid_requestlimit、status、form_id、cursor のいずれかが無効。メッセージにその名前が入ります
401unauthorizedキーがない、または無効
403forbidden公開可能キー、またはスコープ不足
404not_found存在しないルートや ID、または別のワークスペースの ID
405method_not_allowedブラウザーのプリフライト
429rate_limitedキーごとのレート制限を超えた
500server_errorこちら側で問題が発生。request_id を伝えてください

レート制限

各キーは 60 秒あたり 100 リクエストまで送れます。上限を超えると、API は秒数を示す Retry-After ヘッダー付きで 429 rate_limited を返します。SDK ではこれを error.retryAfter として参照できます。