Public API
現在の v1 REST API の実装に合わせた、posts・sites・webhooks 向けの公開リファレンスです。
このページは、現在
/api/v1で実際に公開されているルートだけを対象にしています。現時点の公開 v1 API は、posts、sites、webhooks のみです。
クイックスタート
ベース URL
https://postion.app/api/v1認証
すべてのリクエストで Bearer Token が必要です。
Authorization: Bearer pk_your_api_key_here新しい API キーの生キーは作成直後に一度だけ表示されます。作成時に必ず安全な場所へ保存してください。
レート制限
各 API キーは、各 endpoint ごとに 100 リクエスト/分に制限されます。レスポンスには以下のヘッダーが含まれます。
X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset
スコープ
連携ごとに最小限のスコープを付与してください。
| Scope | 用途 |
|---|---|
posts:read | GET /posts、GET /posts/{id} |
posts:write | POST /posts、PUT /posts/{id} |
posts:delete | DELETE /posts/{id} |
sites:read | GET /sites |
webhooks:read | GET /webhooks |
webhooks:write | POST /webhooks |
レスポンスの基本形
多くの成功レスポンスは data ラッパーを使います。
{
"data": {}
}一覧系では pagination も返ります。
{
"data": [],
"pagination": {
"page": 1,
"limit": 10,
"total": 42,
"pages": 5
}
}バリデーション失敗や認証失敗では error が返り、一部のレスポンスには details や resetTime が含まれます。
エンドポイント
GET /api/v1/posts
認証済みユーザー自身の投稿一覧を返します。
クエリパラメータ
| 名前 | 型 | デフォルト | 説明 |
|---|---|---|---|
page | integer | 1 | 最小値は 1 |
limit | integer | 10 | 範囲は 1-100 |
siteId | string | - | 特定サイトに絞り込む |
published | boolean | - | true または false |
search | string | - | title と description を大文字小文字を無視して検索 |
例
curl "https://postion.app/api/v1/posts?page=1&limit=10&published=true" \
-H "Authorization: Bearer pk_your_api_key_here"各投稿には以下が含まれます。
id、title、description、slug、imagestatus、published、public、isPaidpricingsitetagsstats.likes、stats.comments、stats.bookmarkscreatedAt、updatedAt
POST /api/v1/posts
自分のサイトに新しい投稿を作成します。
ボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
title | string | はい | 最大 200 文字 |
siteId | string | はい | API キー所有者のサイトである必要があります |
content | JSON | いいえ | リッチエディタ JSON または任意の JSON 構造 |
description | string | いいえ | 概要 |
slug | string | いいえ | 未指定なら title から自動生成 |
image | string | いいえ | 有効な URL |
status | string | いいえ | デフォルトは draft |
published | boolean | いいえ | モデルのデフォルト値に従います |
tags | string[] | いいえ | 存在しないタグは自動作成されます |
public | boolean | いいえ | デフォルトは true |
isPaid | boolean | いいえ | デフォルトは false |
pricing.price | number | いいえ | pricing を送る場合は必須 |
pricing.currency | string | いいえ | 3 文字の通貨コード、デフォルトは USD |
pricing.isPaid | boolean | いいえ | デフォルトは false |
pricing.previewLength | integer | いいえ | プレビュー長 |
注意点
- slug は同一サイト内で一意です。重複時は
409 Conflictを返します。 status: "published"またはstatus: "draft"だけを送り、publishedを省略した場合、API は boolean 側も自動で同期します。- title から有効な slug を生成できない場合は、自動生成 slug にフォールバックします。
pricing内の Decimal 値は、レスポンスで文字列として返る場合があります。
例
{
"title": "API launch checklist",
"siteId": "site_123",
"description": "公開 API のロールアウト前に確認すること",
"published": true,
"tags": ["api", "launch"],
"public": true
}GET /api/v1/posts/{id}
単一投稿を返します。content、tags、pricing、site、stats を含みます。
PUT /api/v1/posts/{id}
自分の投稿を更新します。
現在更新できるフィールド:
titlecontentdescriptionslugimagestatuspublishedtags
tags を送った場合、既存タグはすべてその配列で置き換えられます。status だけを draft または published に更新した場合も、published フラグは自動で同期されます。
DELETE /api/v1/posts/{id}
投稿をソフトデリートします。レスポンスは以下です。
{
"message": "Post deleted successfully"
}GET /api/v1/sites
認証ユーザーが所有するサイト一覧を返します。
各サイトには以下が含まれます。
id、name、description、logosubdomain、customDomaincreatedAt、updatedAtstats.posts
GET /api/v1/webhooks
認証ユーザーの Webhook 一覧を返します。
クエリパラメータ
| 名前 | 型 | 説明 |
|---|---|---|
siteId | string | 任意。特定サイトに絞り込み |
レスポンスには以下が含まれます。
data: Webhook 一覧availableEvents: サポートされているイベント一覧
セキュリティ上、一覧 API では webhook secret は返しません。
POST /api/v1/webhooks
新しい Webhook を作成します。
ボディ
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
name | string | はい | 最大 100 文字 |
url | string | はい | 有効な URL |
events | string[] | はい | 少なくとも 1 つの有効イベントが必要 |
siteId | string | いいえ | 特定サイトのイベントだけに制限 |
headers | object | いいえ | 各配信に付与する追加の文字列ヘッダー |
retryCount | integer | いいえ | 範囲は 0-10 |
timeoutSeconds | integer | いいえ | 範囲は 5-300 |
サポートイベント
post.createdpost.publishedpost.deleteduser.registereduser.updatedsite.createdsubscription.createdsubscription.cancelledtest.event
作成レスポンスには webhook の secret が含まれます。一覧 API では再取得できないため、作成時に保存してください。
Webhook 配信
Webhook は生のリクエストボディに対する HMAC-SHA256 で署名され、X-Webhook-Signature ヘッダーで送信されます。
各配信には以下のヘッダーが付きます。
X-Webhook-SignatureX-Webhook-EventX-Webhook-DeliveryUser-Agent: Position-Webhooks/1.0
Payload 形式:
{
"id": "delivery_payload_id",
"event": {
"type": "post.published",
"data": {},
"timestamp": "2026-04-04T12:00:00.000Z",
"site_id": "site_123",
"user_id": "user_123"
},
"webhook": {
"id": "webhook_123",
"name": "Production Listener"
}
}検証方法やハンドラ実装の詳細は Webhooks を参照してください。
エラーコード
| ステータス | 意味 |
|---|---|
400 | バリデーション失敗、またはクエリパラメータ不正 |
401 | API キーが未指定、無効、または期限切れ |
403 | 必要な scope が不足 |
404 | リソースが存在しない、または所有者が異なる |
409 | 投稿 slug の衝突 |
429 | レート制限超過 |
500 | 内部サーバーエラー |
実装のヒント
- API キーは必ずサーバー側だけに保存してください。
- Webhook 作成時に secret を保存してください。
- 連携の同期はポーリングより Webhook を優先してください。
DELETE /posts/{id}は物理削除ではなくソフトデリートです。
バージョニング
API は URL パスでバージョン管理されます。破壊的変更は /api/v2 のような新しいパスで公開されます。