メンテナンス中 — しばらくしてからもう一度お試しください。

🕊️

HATO API

鳩の郵便局

07 / いつものツールとつなぐ

APIリファレンス

Letterflowの一覧と定義の取得、実行の開始と状態確認、各ステップのリージョン入力・出力の確認ができます。

キーを使う前に権限を選ぶ

TinkererのキーはLetterbox履歴の読み取り、ピン留め、削除に使えます。Aspiringでは該当スコープを選ぶと定義の読み取り、実行、状態の取得もできます。新しいキーの初期権限はLetterboxの読み取りのみです。実行権限だけでは状態や結果を取得できません。

概要

認証

APIキーを 設定 → 連携APIキー で生成します。Authorizationヘッダーに作成したトークンを含めてください:

キーごとに対象リソースと操作の権限を選択します。新しいキーはレターボックスの読み取りのみ許可されます。実行、状態の確認、ピン留め、削除には、それぞれの権限が必要です。

Authorization: Bearer hato_live_<token>

レート制限とキャッシング

API キーは送信元 IP に関係なく 1 分間に 30 リクエストまで使用できます。メタデータは ETag による条件付きリクエストに対応しています。リージョンのアクセス URL は 5 分以内に有効期限が切れ、コンテンツの保持期限も適用されます。

エラーフォーマット

エラーは、エラーコードとわかりやすいメッセージを含む標準JSONオブジェクトとして返されます:

{"error": {"code": "unauthorized", "message": "A valid Bearer API key is required."}}

保存済みの定義

limitとcursorで自分のLetterflowをページ単位で取得します。詳細にはメタデータ、準備状態、リージョン入力への署名付きリンクが含まれます。秘密鍵とアカウント認証情報は含まれません。

エンドポイントAPI の権限
GET /api/v1/letterflows/
GET /api/v1/letterflows/{id}/
letterflows:read

実行の開始と状態の確認

空のJSONオブジェクトをPOSTすると保存済みLetterflowをすぐ実行します。Idempotency-Keyは実行ごとに新しく指定してください。同じキーの再送は同じ実行を返します。入力の上書きやAPIでのスケジュール設定には対応していません。

エンドポイントAPI の権限
POST /api/v1/letterflows/{id}/runs/letterflows:run
GET /api/v1/runs/{uuid}/runs:read

新しい実行は202とLocationポーリングURLを返し、同じ冪等性キーでの再送は200を返します。状態はwaiting、queued、running、completed、failedです。waitingはアカウントの利用枠をまだ予約していない状態、queuedは実行枠を割り当て済みでリージョンでの実行を待つ状態です。letterbox_urlが利用可能になったら参照してください。すべての送信に実行準備状態とプランの上限が適用されます。

実行状態のポーリングにはqueue_position、wait_reason、admitted_atが含まれます。待機キューが満杯の場合は429とerror.code=queue_fullを返します。受け付け済みの冪等性キーはキャンセル後も常に同じ実行を返すため、新しい配達には新しいキーを使用してください。

配達キュー →
curl -X POST -H "Authorization: Bearer $HATO_API_KEY" \
  -H 'Idempotency-Key: example-run-001' -H 'Content-Type: application/json' \
  --data '{}' 'https://hato-api.example/api/v1/letterflows/7/runs/'

Letterflowのステップを確認

ステップの URL には value1 などのユーザー定義コンポーネント ID を使います。ID は大文字と小文字を区別し、実行時に固定されたスナップショットから解決されます。後で名前を変更しても、過去の実行へのアクセスは変わりません。

GET /api/v1/letterbox/{id}/steps/
GET /api/v1/letterbox/{id}/steps/{step_id}/
GET /api/v1/letterbox/{id}/steps/{step_id}/input/
GET /api/v1/letterbox/{id}/steps/{step_id}/output/
GET /api/v1/letterbox/{id}/steps/{step_id}/request-headers/
GET /api/v1/letterbox/{id}/steps/{step_id}/request-body/
GET /api/v1/letterbox/{id}/steps/{step_id}/response-headers/
GET /api/v1/letterbox/{id}/steps/{step_id}/response-body/
GET /api/v1/letterbox/{id}/steps/{step_id}/request-metadata/
GET /api/v1/letterbox/{id}/steps/{step_id}/value/

ステップの確認には letterbox:read が必要で、指定リージョンにリダイレクトされます。実行されたコンポーネントは実行順に表示され、その後にスキップされたコンポーネントが続きます。スキップされた入力は読み取れますが、生成されなかった出力は 404 を返します。保存済みの結果を再評価することはありません。

バリューの出力はテキスト、条件の出力は真偽値です。大きなバリューには result_url が返され、レターのステップには記録されたリクエストとレスポンスのアーティファクトへのリンクが返されます。期限切れのコンテンツは 410 を返します。

Letterステップのメタデータには、記録があればhttp_versionが含まれます。これはクライアントの希望設定ではなく、最終レスポンスで合意されたプロトコルです。

Bearer キーは Hub にのみ送信してください。リージョンのアクセス URL は、API キーを転送せず、別のリクエストで取得してください。

Letterbox一覧はletterflow_idとrun_idで絞り込めます。source_type(letter、condition、value、email)は最終コンポーネントの結果の種類です。

一覧

GET /api/v1/letterbox/
レターボックスエントリの一覧取得

レターボックスのレスポンスメタデータを最新順にカーソルページネーションで取得します。

ヘッダー
Authorization必須 Bearer hato_live_...
If-None-Match 304条件付きキャッシュ検証用の任意のETag。
クエリパラメータ
パラメータ説明
limitinteger 取得するレコード件数(1〜100、デフォルト: 50)。
cursorstring 前のレスポンスから返された不透明なページネーションカーソル。
sinceISO-8601 指定日時以降に送信されたエントリをフィルタ(例: 2026-08-01T00:00:00Z)。
untilISO-8601 指定日時以前に送信されたエントリをフィルタ。
letter_idinteger 特定のLetter IDでエントリをフィルタ。
source_typestring 最終結果の種類で絞り込みます: letter、condition、value。
status_codeinteger HTTP/FTPレスポンスコードでフィルタ(例: 200, 404, 500)。
pinnedboolean ピン留め状態('true' または 'false')でフィルタ。
レスポンス
200 OK エントリの配列と任意のnext_cursorを返します。
400 Bad Request パラメータまたはカーソルの形式が無効です。
401 Unauthorized Bearer APIキーが存在しないか無効です。
cURL
curl -H "Authorization: Bearer $HATO_API_KEY" \
     "https://hato-api.example/api/v1/letterbox/?limit=20&pinned;=true"
レスポンス (200 OK)
{
  "data": [
    {
      "id": 42,
      "letterflow_id": 7,
      "letterflow_name": "Health Check",
      "source_type": "letter",
      "run_id": null,
      "steps_url": null,
      "request": {
        "method": "GET"
      },
      "response": {
        "status_code": 200
      },
      "duration_ms": 142,
      "sent_at": "2026-08-28T14:30:00+00:00",
      "request_sent_at": "2026-08-28T14:30:00.010000+00:00",
      "response_received_at": "2026-08-28T14:30:00.152000+00:00",
      "is_pinned": true,
      "bodies_pruned": false,
      "error_message": "",
      "region": "au",
      "spoke_id": "spoke-au-1",
      "artifact_available": true,
      "request_headers_url": "https://spoke-au.example/artifacts/...",
      "request_body_url": null,
      "response_headers_url": "https://spoke-au.example/artifacts/...",
      "response_body_url": "https://spoke-au.example/artifacts/..."
    }
  ],
  "next_cursor": "eyJzZW50X2F0IjoiMjAyNi0wOC0yOFQxNDozMDowMCIsImlkIjo0Mn0"
}
DELETE /api/v1/letterbox/
ピン留めされていないすべてのエントリをクリア

ピン留めされていないLetterbox履歴をすべて削除し、関連するリージョンのアーティファクトも削除します。Spokeが一時的に利用できない場合は、削除を再試行するためにキューへ登録します。

レスポンス
204 No Content ピン留めされていないすべてのエントリが正常にクリアされました。
401 Unauthorized Bearer APIキーが存在しないか無効です。
cURL
curl -X DELETE \
     -H "Authorization: Bearer $HATO_API_KEY" \
     "https://hato-api.example/api/v1/letterbox/"
GET /api/v1/letterbox/{id}/
エントリメタデータの取得

IDを指定して単一のレターボックスレスポンスの完全なメタデータ(最新の署名付きリージョンアーティファクトURLを含む)を取得します。

URIパラメータ
idinteger必須 レターボックスエントリの一意なID。
レスポンス
200 OK エントリのメタデータが正常に返されました。
404 Not Found エントリが存在しないか、他のユーザーのものです。
cURL
curl -H "Authorization: Bearer $HATO_API_KEY" \
     "https://hato-api.example/api/v1/letterbox/42/"
レスポンス (200 OK)
{
  "data": {
    "id": 42,
    "letterflow_id": 7,
    "letterflow_name": "Health Check",
    "source_type": "letter",
    "run_id": null,
    "steps_url": null,
    "request": {
      "method": "GET"
    },
    "response": {
      "status_code": 200
    },
    "duration_ms": 142,
    "sent_at": "2026-08-28T14:30:00+00:00",
    "request_sent_at": "2026-08-28T14:30:00.010000+00:00",
    "response_received_at": "2026-08-28T14:30:00.152000+00:00",
    "is_pinned": false,
    "bodies_pruned": false,
    "error_message": "",
    "region": "au",
    "spoke_id": "spoke-au-1",
    "artifact_available": true,
    "request_headers_url": "https://spoke-au.example/artifacts/read?token=...",
    "request_body_url": null,
    "response_headers_url": "https://spoke-au.example/artifacts/read?token=...",
    "response_body_url": "https://spoke-au.example/artifacts/read?token=..."
  }
}
PATCH /api/v1/letterbox/{id}/
エントリのピン留め/ピン留め解除

レターボックスエントリをピン留めまたは解除します。ピン留めにより、レスポンスボディが有効期限切れやFIFO容量削除から保護されます。

リクエストボディ
項目型説明
is_pinned必須 boolean ピン留めする場合は true、解除する場合は false を設定します。
レスポンス
200 OK ピン留め状態が正常に更新されました。
400 Bad Request 無効なJSONペイロード、または容量上限に達しました(満杯時は少なくとも1件のレスポンスがピン留めされていない状態である必要があります)。
404 Not Found エントリが存在しません。
cURL
curl -X PATCH \
     -H "Authorization: Bearer $HATO_API_KEY" \
     -H "Content-Type: application/json" \
     -d '{"is_pinned": true}' \
     "https://hato-api.example/api/v1/letterbox/42/"
レスポンス (200 OK)
{
  "data": {
    "id": 42,
    "letterflow_id": 7,
    "letterflow_name": "Health Check",
    "source_type": "letter",
    "run_id": null,
    "steps_url": null,
    "request": {
      "method": "GET"
    },
    "response": {
      "status_code": 200
    },
    "duration_ms": 142,
    "sent_at": "2026-08-28T14:30:00+00:00",
    "request_sent_at": "2026-08-28T14:30:00.010000+00:00",
    "response_received_at": "2026-08-28T14:30:00.152000+00:00",
    "is_pinned": true,
    "bodies_pruned": false,
    "error_message": "",
    "region": "au",
    "spoke_id": "spoke-au-1",
    "artifact_available": true,
    "request_headers_url": "https://spoke-au.example/artifacts/read?token=...",
    "request_body_url": null,
    "response_headers_url": "https://spoke-au.example/artifacts/read?token=...",
    "response_body_url": "https://spoke-au.example/artifacts/read?token=..."
  }
}
DELETE /api/v1/letterbox/{id}/
単一エントリの削除

単一のレスポンスレコードを完全に削除し、リージョンSpokeからの保存アーティファクトのクリーンアップを実行します。

URIパラメータ
idinteger必須 削除するレターボックスエントリの一意なID。
レスポンス
204 No Content エントリが完全に削除されました。
404 Not Found エントリが存在しません。
cURL
curl -X DELETE \
     -H "Authorization: Bearer $HATO_API_KEY" \
     "https://hato-api.example/api/v1/letterbox/42/"
GET /api/v1/letterbox/{id}/{artifact}/
アーティファクトストリームのダウンロード

有効期間の短いリージョンURLへリダイレクトします。BearerキーはHubに送信し、リージョンのLocationにはキーを転送せず別のリクエストでアクセスしてください。コンテンツへのアクセス権は保持期間と所有権の確認に従います。

URIパラメータ
idinteger必須 レターボックスエントリID。
artifactstring必須 次のいずれか: request-headers、request-body、response-headers、response-body。
レスポンス
302 Found 署名付きダイレクトSpoke URLにリダイレクトします(有効期間5分)。
404 Not Found アーティファクトが見つからないか、削除済み、または存在しません。
cURL(2回のリクエスト)
curl -sS -D - -o /dev/null -H "Authorization: Bearer $HATO_API_KEY" \
     "https://hato-api.example/api/v1/letterbox/42/response-body/"

curl -o response_payload.json "REGIONAL_LOCATION_URL"
リダイレクトヘッダー (302 Found)
HTTP/1.1 302 Found
Location: https://spoke-au.example/artifacts/read?token=ey...
Cache-Control: private, no-store

Directory

有料の連携キーでは、directory:readを明示的に選択して変数の一覧やリージョンの値URLを取得できます。秘密情報も含む権限で、自動的には付与されません。Directoryの変更はダッシュボードから行います。

GET /api/v1/directory/?region=au
GET /api/v1/directory/{id}/