# サーバーから送信する

> シークレット API キーを使って、バックエンド、スクリプト、連携サービスから送信データを作成します。

バックエンド、cron ジョブ、連携サービスも、ブラウザーと同じエンドポイントに送信できます。シークレット API キーを付けると、Ikiform はその送信があなたのものだとわかります。

## シークレットキーを作成する

1. ダッシュボードで **API keys** を開き、**secret** キーを作成します。
2. `submissions:write` スコープを付与します。同じキーで [REST API](https://ikiform.com/ja/docs/api.md) からデータを読み取る場合にのみ、`submissions:read` と `forms:read` を追加してください。
3. キーをコピーします。`ik_sk_` で始まり、表示されるのは 1 回だけです。Ikiform はハッシュしか保存しません。

## 送信データを送る

**Node** (`submit.ts`)

```ts
const response = await fetch("https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    Authorization: `Bearer ${process.env.IKIFORM_SECRET_KEY}`,
    "Idempotency-Key": order.id,
  },
  body: JSON.stringify({ email: order.email, plan: order.plan }),
});

const result = await response.json();
if (!result.ok) throw new Error(`${result.error.code}: ${result.error.message} (${result.request_id})`);
```

**curl** (`ターミナル`)

```bash
curl https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx \
  -H "Authorization: Bearer $IKIFORM_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: order_1234" \
  -d '{"email":"ada@example.com","plan":"team"}'
```

**Python** (`submit.py`)

```python
import os

import requests

response = requests.post(
    "https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx",
    json={"email": "ada@example.com", "plan": "team"},
    headers={
        "Authorization": f"Bearer {os.environ['IKIFORM_SECRET_KEY']}",
        "Idempotency-Key": "order_1234",
    },
    timeout=10,
)
result = response.json()
if not result["ok"]:
    raise RuntimeError(f"{result['error']['code']}: {result['error']['message']}")
```

## シークレットキーで変わること

| チェック | キーなし | シークレットキーあり |
| --- | --- | --- |
| 許可ドメイン | `Origin` または `Referer` と照合 | スキップ |
| Ikiform の人間確認 | オンの場合は必須 | スキップ |
| 独自の Turnstile キー | トークンが必要 | 引き続きトークンが必要 |
| レート制限 | 訪問者の IP とフォームごと | 引き続き適用。サーバーの IP ごと |
| フィールドのバリデーションとスパムスコア | 実行 | 実行 |

別のワークスペースのキー、無効化されたキー、`submissions:write` のないシークレットキーには `403 forbidden` が返ります。不正な形式の `Authorization` ヘッダーも無視されずに拒否されるので、タイプミスで知らないうちに匿名の送信に格下げされることはありません。

> サーバーから送られる送信はすべてサーバーの IP アドレスから届くため、Ikiform の訪問者ごとのレート制限は全訪問者をまとめてカウントします。標準のプリセットは IP とフォームごとに 1 分あたり 5 件までなので、アクセスの多いサイトでは上限に達することがあります。可能ならブラウザーから送信するか、サーバーを経由するフォームでは緩めまたはカスタムの[レート制限](https://ikiform.com/ja/docs/rate-limits.md)を選んでください。

## 公開可能キー

公開可能キー（`ik_pub_`）はブラウザー用です。送信しかできず、キーに登録したドメインからしか使えません。それ以外のサイトから公開可能キーで送信すると `403 origin_not_allowed` になります。人間確認やフォーム自体の許可ドメインはスキップしません。

> シークレットキーをブラウザーのコード、モバイルアプリ、公開リポジトリに含めないでください。漏れた場合はダッシュボードで無効化してください。

## リトライ

サーバーはリトライするものです。注文 ID など、送信する対象ごとに一定の `Idempotency-Key` を送ると、リトライしても重複は作られず、最初の応答が再送されます。[冪等性](https://ikiform.com/ja/docs/frameworks.md#idempotency)を参照してください。
