REST API
API ドキュメント / Hanamii REST API
REST API を使う
Hanamii のワークスペース、プロジェクト、デプロイ、ログ、環境変数、API トークンを HTTP リクエストから操作できます。
API の基本
リクエストは HTTPS の REST endpoint に送信します。JSON body を送る POST / PATCH では Content-Type: application/json を指定してください。
GET / DELETE と multipart/form-data の ZIP アップロードでは不要です。
Base URL: https://hanamii.jp Authorization: Bearer <API_TOKEN> Content-Type: application/json # JSON body の場合のみ
認証
すべての公開 API リクエストで Authorization: Bearer <TOKEN> が必要です。
API トークン
トークンはアカウント設定で作成します。平文トークンの表示は作成時のみです。
レート制限
認証入口では IP guard を適用します。認証後は endpoint ごとに制限されます。
認証
すべての公開 API リクエストで Authorization header が必要です。API トークンは hnm_ から始まる Bearer token です。
平文トークンの表示は作成時のみのため、作成後に再表示できません。
Authorization: Bearer <TOKEN>ワークスペースのリソース操作
scopeType=full_account のトークンは、トークン所有ユーザーが所属しているワークスペースを対象にします。scopeType=workspace のトークンは対象ワークスペース内のみ操作でき、実行できる操作はそのワークスペースにおけるユーザー role によって制限されます。
workspaceId は GET /api/v1/workspaces で確認できます。
curl -H "Authorization: Bearer $HANAMII_TOKEN" \ "$BASE_URL/api/v1/workspaces"
操作
owner
admin
developer
viewer
プロジェクト一覧・詳細
可
可
可
可
ログ取得
可
可
可
可
環境変数の取得
可
可
可
不可
プロジェクト作成・デプロイ・再デプロイ
可
可
可
不可
環境変数の追加・更新
可
可
可
不可
プロジェクト削除
可
可
不可
不可
ページネーション
一覧取得では limit で取得件数を指定できます。limit を省略した場合は 20 件、最大は 100 件です。続きがある場合はレスポンスの pagination.next に値が入るため、その値をそのまま until に指定して同じ endpoint を再度呼び出します。pagination.next が null の場合、続きはありません。
query
用途
limit
取得件数。省略時は 20、最大 100
until
pagination.next の値をそのまま指定して続きの一覧を取得
since
pagination.prev の値をそのまま指定して前方向の一覧を取得
# まず一覧を取得 curl -H "Authorization: Bearer $HANAMII_TOKEN" \ "$BASE_URL/api/v1/projects?workspaceId=$WORKSPACE_ID&limit=20" # 返ってきた JSON の pagination.next を確認 { "pagination": { "count": 20, "next": 1777622400000, "prev": 1777623000000 } } # pagination.next の値をそのまま until に指定 curl -H "Authorization: Bearer $HANAMII_TOKEN" \ "$BASE_URL/api/v1/projects?workspaceId=$WORKSPACE_ID&limit=20&until=1777622400000"
レート制限
レート制限を超過した場合、API は 429 rate_limited を返します。詳しい上限は以下の表を参照してください。レスポンスには X-RateLimit-* ヘッダーが含まれます。
operation
scope
limit
補足
認証試行
同一 IP
60 / 60秒
トークン確認前に適用
認証失敗
同一 IP
30 / 300秒
未認証、不正な Bearer、無効なトークン
トークン一覧 / 取得
ユーザー
120 / 60秒
GET /api/v1/user/tokens 系
トークン作成
ユーザー
32 / 3600秒
POST /api/v1/user/tokens
トークン失効
ユーザー
50 / 300秒
DELETE /api/v1/user/tokens/:id
ワークスペース一覧
ユーザー
120 / 60秒
GET /api/v1/workspaces
プロジェクト一覧 / 取得
ユーザー
500 / 60秒
GET /api/v1/projects 系
プロジェクト作成
ワークスペース
60 / 3600秒
POST /api/v1/projects
プロジェクト削除
プロジェクト
30 / 300秒
DELETE /api/v1/projects/:id
デプロイ / 再デプロイ
プロジェクト
120 / 300秒
POST /api/v1/projects/:id/deploy
ZIP uploadUrl / 検証
トークン
120 / 60秒
POST /api/v1/uploads 系
ログ取得
プロジェクト
500 / 60秒
GET /api/v1/projects/:id/logs
環境変数取得
プロジェクト
500 / 60秒
GET /api/v1/projects/:id/env
環境変数更新
プロジェクト
120 / 60秒
PATCH /api/v1/projects/:id/env
エラー
エラーレスポンスは JSON で返します。
400
validation_error
リクエスト body、query、path parameter が不正
401
unauthorized
認証失敗、message は 認証に失敗しました に統一
403
forbidden
トークン scope または workspace / project 権限不足
404
not_found
対象リソースが存在しない、または参照できない
409
conflict
同じワークスペース内でプロジェクト名が重複
413
payload_too_large
request body または chunk size の上限超過
415
unsupported_media_type
JSON body で Content-Type が application/json ではない
429
rate_limited
レート制限超過。X-RateLimit-* header を返却
500
internal_error
内部 message を外部へ返さず固定 message を返却
エンドポイント一覧
利用できる REST API endpoint の一覧です。各 endpoint の詳細は下のリファレンスを参照してください。
API トークン
/api/v1/user/tokens
有効な API トークンの一覧を取得します。
/api/v1/user/tokens
新しい API トークンを作成します。(トークンの表示は作成時のみ)
/api/v1/user/tokens/:id
指定した API トークンの情報を取得します。 :id に current を指定すると、このリクエストの認証に使用している API トークン自身の情報を取得します。
/api/v1/user/tokens/:id
指定した API トークンを失効します。 :id に current を指定すると、このリクエストの認証に使用している API トークン自身を失効します。
ワークスペース
/api/v1/workspaces
トークンの scope 内で参照できるワークスペース一覧を取得します。 full_account token はトークン所有ユーザーが所属しているワークスペース、workspace scope token は対象ワークスペースのみを返します。
プロジェクト
/api/v1/projects
参照可能なプロジェクト一覧を取得します。
/api/v1/projects
Git または ZIP から project を作成し、初回 deployment を開始します。
/api/v1/projects/:id
project 情報、公開URL、直近 deployment 試行の状態を取得します。
/api/v1/projects/:id/deploy
既存 project の再デプロイを開始します。
/api/v1/projects/:id
指定したプロジェクトを削除します。 トークン所有ユーザーが、そのプロジェクトのワークスペースで owner または admin の場合のみ実行できます。
/api/v1/projects/:id/logs
project の runtime logs を JSON または text で取得します。
環境変数
/api/v1/projects/:id/env
project の環境変数を取得または key 単位で更新します。
エンドポイント詳細
各 endpoint の method、path、入力、レスポンス、使用例です。
API トークン
API トークン一覧を取得
有効な API トークンの一覧を取得します。
/api/v1/user/tokens
パラメータ
項目
指定
タイプ
説明
limit
query
number
取得件数。省略時は 20、最大 100
until
query
number
この createdAt より前のトークンを取得
since
query
number
この createdAt より後のトークンを取得
レスポンス
200
トークン一覧とページ情報。bearerToken / tokenHash は含みません
401
Authorization header がない、またはトークンが無効
リクエスト例
GET /api/v1/user/tokens
const response = await fetch('https://hanamii.jp/api/v1/user/tokens?limit=20', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "tokens": [ { "id": "tok_123", "name": "GitHub Actions Deploy", "scopeType": "workspace", "scopeWorkspaceId": "ws_123", "createdAt": 1777622400000, "expiresAt": 1809158400000, "lastUsedAt": null } ], "pagination": { "count": 1, "next": null, "prev": 1777622400000 } }
API トークン
API トークンを作成
新しい API トークンを作成します。(トークンの表示は作成時のみ)
/api/v1/user/tokens
パラメータ
項目
指定
タイプ
説明
name
body
string
表示用のトークン名、重複可能
scopeType
body
full_account | workspace
所属ワークスペース全体を対象にする場合は full_account
scopeWorkspaceId
body
string | null
workspace scope の対象ワークスペース ID、full_account は null
expiresAt
body
number | null
UNIX epoch milliseconds、null は期限なし、指定時は作成時点から1年以内
expiresAt の指定例
有効期限
TypeScript / Next.js
1時間
Date.now() + 60 * 60 * 1000
1日
Date.now() + 24 * 60 * 60 * 1000
30日
Date.now() + 30 * 24 * 60 * 60 * 1000
90日
Date.now() + 90 * 24 * 60 * 60 * 1000
期限なし
null
※ cURL では expiresAt に UNIX epoch milliseconds の数値を指定します。期限なしにする場合は null を指定してください。
レスポンス
200
トークンメタデータと bearerToken
400
入力値が不正、ISO 文字列の expiresAt、1年を超える expiresAt は不可
413
リクエスト body が 16KB を超過
リクエスト例
POST /api/v1/user/tokens
const response = await fetch('https://hanamii.jp/api/v1/user/tokens', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json', }, body: JSON.stringify({ name: 'GitHub Actions Deploy', scopeType: 'workspace', scopeWorkspaceId: 'workspace_id', expiresAt: Date.now() + 30 * 24 * 60 * 60 * 1000, }), }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "token": { "id": "tok_123", "name": "GitHub Actions Deploy", "scopeType": "workspace", "scopeWorkspaceId": "ws_123", "createdAt": 1777622400000, "lastUsedAt": null, "expiresAt": 1809158400000 }, "bearerToken": "hnm_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" }
API トークン
API トークンを取得
指定した API トークンの情報を取得します。 :id に current を指定すると、このリクエストの認証に使用している API トークン自身の情報を取得します。
/api/v1/user/tokens/:id
パラメータ
項目
指定
タイプ
説明
id
path
string
トークン ID または current
レスポンス
200
トークン情報。bearerToken / tokenHash は含みません
404
トークンが存在しない、または参照できない
リクエスト例
GET /api/v1/user/tokens/:id
const response = await fetch('https://hanamii.jp/api/v1/user/tokens/current', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "token": { "id": "tok_123", "name": "GitHub Actions Deploy", "scopeType": "workspace", "scopeWorkspaceId": "ws_123", "createdAt": 1777622400000, "lastUsedAt": 1777622400000, "expiresAt": 1809158400000 } }
API トークン
API トークンを失効
指定した API トークンを失効します。 :id に current を指定すると、このリクエストの認証に使用している API トークン自身を失効します。
/api/v1/user/tokens/:id
パラメータ
項目
指定
タイプ
説明
id
path
string
トークン ID または current
レスポンス
200
失効したトークン ID と deleted=true
404
トークンが存在しない、またはすでに失効済み
リクエスト例
DELETE /api/v1/user/tokens/:id
const response = await fetch('https://hanamii.jp/api/v1/user/tokens/current', { method: 'DELETE', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "token": { "id": "tok_123", "deleted": true } }
ワークスペース
ワークスペース一覧を取得
トークンの scope 内で参照できるワークスペース一覧を取得します。 full_account token はトークン所有ユーザーが所属しているワークスペース、workspace scope token は対象ワークスペースのみを返します。
/api/v1/workspaces
パラメータ
項目
指定
タイプ
説明
なし
-
-
query / body はありません
レスポンス
200
ワークスペース一覧
401
Authorization header がない、またはトークンが無効
429
レート制限超過
リクエスト例
GET /api/v1/workspaces
const response = await fetch('https://hanamii.jp/api/v1/workspaces', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "workspaces": [ { "id": "ws_123", "name": "Production", "role": "owner" } ] }
プロジェクト
プロジェクト一覧を取得
トークンの scope とユーザーの workspace role で参照できるプロジェクト一覧を取得します。 範囲: workspaceId を省略すると、トークンが参照できるすべてのワークスペース内のプロジェクトを返します。 絞り込み: workspaceId を指定すると、そのワークスペース内のプロジェクトだけを返します。
/api/v1/projects
パラメータ
項目
指定
タイプ
説明
workspaceId
query
string
任意。対象ワークスペース、scope 外は 403
limit
query
number
取得件数。省略時は 20、最大 100
until / since
query
number
createdAt cursor
レスポンス
200
プロジェクト一覧とページ情報
400
limit または cursor が不正
403
トークン scope 外のワークスペースを指定
リクエスト例
GET /api/v1/projects
const response = await fetch('https://hanamii.jp/api/v1/projects?workspaceId=workspace_id', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "projects": [ { "id": "prj_123", "name": "my-api-test-app", "workspaceId": "ws_123", "status": "healthy", "url": "https://app-xxxx.ingress.apprun.sakura.ne.jp", "urls": [ { "type": "default", "host": "app-xxxx.ingress.apprun.sakura.ne.jp", "url": "https://app-xxxx.ingress.apprun.sakura.ne.jp" } ], "latestDeployment": { "id": "dpl_123", "readyState": "READY", "errorCode": null }, "createdAt": 1777622400000, "updatedAt": 1777622400000 } ], "pagination": { "count": 1, "next": null, "prev": 1777622400000 } }
プロジェクト
プロジェクトを作成
Git または ZIP から project を作成し、初回 deployment を開始します。 Git: repository と branch を指定します。 ZIP: 先に ZIP を Storage へアップロードして checkId を取得し、その checkId を指定します。ZIP 作成前に node_modules、vendor、.git、.env*、.next、dist、build、cache などの不要ファイルや secret を除外してください。 checkId は1回の作成または再デプロイで使い切りです。 レスポンス: 開始系APIのため、project.url / project.urls / latestDeployment は返しません。完了後のURLと状態は GET /api/v1/projects/:id で確認します。 権限: 作成可否はトークン所有ユーザーの workspace role で判定されます。
/api/v1/projects
パラメータ
項目
指定
タイプ
説明
name
body
string
プロジェクト名、英小文字、数字、ハイフンのみ
workspaceId
body
string
作成先ワークスペース ID。full_account token では必須、workspace scope token では省略可
source
body
object
Git または ZIP の作成元
source.type
body
git / zip
Git 作成は git、ZIP 作成は zip
source.repoFullName
body
string
Git 作成時に指定。owner/repo 形式
source.ref
body
string
Git 作成時に指定。branch 名
source.checkId
body
string
ZIP 作成時に指定。アップロード検証後に返る checkId
source.rootDirectory
body
string
任意。Git repository 内のデプロイ対象ディレクトリ
envs
body
array
任意。初回デプロイ時に登録する環境変数
レスポンス
200
プロジェクトと building 状態の deployment
400
source や name が不正
409
同じワークスペース内でプロジェクト名が重複
413
JSON body が 1MB を超過
リクエスト例
Git から作成する場合
application/json で repository と branch を指定
POST /api/v1/projects
const response = await fetch('https://hanamii.jp/api/v1/projects', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json', }, body: JSON.stringify({ workspaceId: 'workspace_id', name: 'my-api-test-app', source: { type: 'git', repoFullName: 'owner/repo', ref: 'main', }, envs: [ { key: 'API_URL', value: 'https://example.com' }, ], }), }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
ZIP から作成する場合
ZIP 本体は Hanamii API へ直接送らず、発行された uploadUrl へ PUT します。最後に返った checkId を source.checkId に指定します。checkId は使い切りです。CI/CD では通常 Git deploy を推奨します。
ZIP upload flow
import { readFile } from 'node:fs/promises'; const baseUrl = 'https://hanamii.jp'; const token = process.env.HANAMII_TOKEN!; async function uploadZipAndCreateCheckId(filePath: string) { const fileName = filePath.split('/').pop() ?? 'frontend.zip'; // 1. StorageへZIPをPUTするための uploadUrl と uploadId を発行 const uploadResponse = await fetch(`${baseUrl}/api/v1/uploads`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ workspaceId: 'workspace_id', fileName, contentType: 'application/zip', }), }); if (!uploadResponse.ok) throw new Error(await uploadResponse.text()); const { upload } = await uploadResponse.json(); // 2. ZIP本体は Hanamii API ではなく、発行された uploadUrl へ直接PUT const zipBuffer = await readFile(filePath); const putResponse = await fetch(upload.uploadUrl, { method: 'PUT', headers: { 'Content-Type': 'application/zip' }, body: zipBuffer, }); if (!putResponse.ok) throw new Error(await putResponse.text()); // 3. アップロード済みZIPを検証して checkId を取得 const checkResponse = await fetch(`${baseUrl}/api/v1/uploads/${upload.id}/check`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({}), }); if (!checkResponse.ok) throw new Error(await checkResponse.text()); const check = await checkResponse.json(); return check.result.checkId as string; } const checkId = await uploadZipAndCreateCheckId('./frontend.zip'); // 4. checkId を指定してプロジェクトを作成 const response = await fetch(`${baseUrl}/api/v1/projects`, { method: 'POST', headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ workspaceId: 'workspace_id', name: 'my-api-test-app', source: { type: 'zip', checkId }, }), }); if (!response.ok) throw new Error(await response.text()); console.log(await response.json());
レスポンス例
ZIP 作成の cURL では、レスポンスの upload.putCurl のファイルパスだけ変更して実行します。その後、upload.id / result.checkId を次のリクエストに貼り付けます。
1. uploadUrl 発行
Response
{ "upload": { "id": "upload_123", "uploadUrl": "https://object-storage.example.com/uploads/upload_123/source.zip?...", "putCurl": "curl -X PUT 'https://object-storage.example.com/...' -H 'Content-Type: application/zip' --data-binary '@/path/to/frontend.zip'", "expiresAt": 1777622700000 } }
3. checkId 作成
Response
{ "result": { "checkId": "check_123", "canDeploy": true, "errorCount": 0, "errors": [] } }
4. プロジェクト作成
Response
{ "project": { "id": "prj_123", "name": "my-api-test-app", "workspaceId": "ws_123", "status": "initial", "createdAt": 1777622400000, "updatedAt": 1777622400000 }, "deployment": { "id": "dpl_123", "readyState": "BUILDING", "errorCode": null } }
checkId 再利用時
Response
{ "error": { "code": "validation_error", "message": "ZIPファイルが見つかりません。再度チェックを実行してください" } }
プロジェクト
プロジェクトを取得
指定したプロジェクトの情報を取得します。 URL: project.url は現在アクセスするための代表URLです。project.urls には利用可能なURL一覧が入ります。 CI/CD: latestDeployment.readyState を polling し、READY / ERROR を判定します。 注意: latestDeployment は現在稼働中の deployment ではなく、直近の deployment 試行を表します。前回成功版が稼働中のまま再デプロイに失敗した場合、project.status / project.url は現在公開中のアプリを表し、latestDeployment.readyState は ERROR になることがあります。 権限: 参照可否は token scope とトークン所有ユーザーの project 権限で判定されます。
/api/v1/projects/:id
パラメータ
項目
指定
タイプ
説明
id
path
string
URL の :id に入れるプロジェクト ID。body は不要
レスポンス
200
プロジェクト情報
403
トークン scope または project 権限不足
404
project が存在しない、または参照できない
リクエスト例
GET /api/v1/projects/:id
const response = await fetch('https://hanamii.jp/api/v1/projects/project_id', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "project": { "id": "prj_123", "name": "my-api-test-app", "workspaceId": "ws_123", "status": "healthy", "url": "https://app-xxxx.ingress.apprun.sakura.ne.jp", "urls": [ { "type": "default", "host": "app-xxxx.ingress.apprun.sakura.ne.jp", "url": "https://app-xxxx.ingress.apprun.sakura.ne.jp" } ], "latestDeployment": { "id": "dpl_123", "readyState": "READY", "errorCode": null }, "createdAt": 1777622400000, "updatedAt": 1777622400000 } }
プロジェクト
プロジェクトを再デプロイ
既存プロジェクトを Git または ZIP から再デプロイします。 URL取得: この API はデプロイ開始 API のため URL は返しません。完了後の URL は GET /api/v1/projects/:id を polling し、latestDeployment.readyState が READY になった response から取得します。 ZIP: checkId は1回の再デプロイで使い切りです。ZIP 作成前に node_modules、vendor、.git、.env*、.next、dist、build、cache などの不要ファイルや secret を除外してください。 補足: API 側でも check 時に不要ディレクトリを除外しますが、元 ZIP が大きいほど時間がかかります。 権限: 実行可否は token scope とトークン所有ユーザーの project 権限で判定されます。
/api/v1/projects/:id/deploy
パラメータ
項目
指定
タイプ
説明
id
path
string
プロジェクト ID
source.type
body
git | zip
JSON リクエストの source。git は保存済みの GitHub 連携設定で再デプロイ
source.checkId
body
string
ZIP 再デプロイ時に指定。アップロード検証後に返る checkId
レスポンス
200
project と deployment
400
source が不正、またはデプロイ開始に失敗
403
トークン scope またはプロジェクト権限不足
413
JSON body が 1MB を超過
リクエスト例
Git から再デプロイする場合
application/json で Git 再デプロイを開始
POST /api/v1/projects/:id/deploy
const response = await fetch('https://hanamii.jp/api/v1/projects/project_id/deploy', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json', }, body: JSON.stringify({ source: { type: 'git', }, }), }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
ZIP から再デプロイする場合
ZIP upload flow で取得した checkId を指定して再デプロイ。checkId は使い切りです。CI/CD では通常 Git deploy を推奨します。
POST /api/v1/projects/:id/deploy
const response = await fetch('https://hanamii.jp/api/v1/uploads', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json', }, body: JSON.stringify({ source: { type: 'git', }, }), }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "project": { "id": "prj_123", "name": "my-api-test-app", "workspaceId": "ws_123", "status": "healthy", "createdAt": 1777622400000, "updatedAt": 1777622400000 }, "deployment": { "id": "dpl_123", "readyState": "BUILDING", "errorCode": null } }
プロジェクト
プロジェクトを削除
指定したプロジェクトを削除します。 トークン所有ユーザーが、そのプロジェクトのワークスペースで owner または admin の場合のみ実行できます。
/api/v1/projects/:id
パラメータ
項目
指定
タイプ
説明
id
path
string
プロジェクト ID
レスポンス
200
削除したプロジェクト ID と deleted=true
403
トークン scope または project 権限不足
404
project が存在しない、または参照できない
429
レート制限超過
リクエスト例
DELETE /api/v1/projects/:id
const response = await fetch('https://hanamii.jp/api/v1/projects/project_id', { method: 'DELETE', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "project": { "id": "prj_123", "deleted": true } }
プロジェクト
プロジェクトログを取得
プロジェクトのランタイムログを取得します。 範囲: limit や since / before で取得範囲を指定できます。 text形式: format=text を指定すると text/plain で返します。ログが0件の場合は 200 / 空文字 / text/plain; charset=utf-8 を返します。
/api/v1/projects/:id/logs
パラメータ
項目
指定
タイプ
説明
id
path
string
URL の :id に入れるプロジェクト ID。body は不要
limit
query
number
取得するログ行数。省略時は 100、最大 500
since
query
string
任意。-15m / -2h / -1d または ISO 8601 日時
before
query
string
任意。指定日時より前のログを取得。before 指定時は since より優先
format
query
string
任意。text を指定すると text/plain で返す
レスポンス
200
ログ一覧。標準は JSON、format=text の場合は text/plain
400
limit / since / before が不正
403
トークン scope または log 権限不足
404
project が存在しない、または参照できない
429
レート制限超過
リクエスト例
GET /api/v1/projects/:id/logs
const response = await fetch('https://hanamii.jp/api/v1/projects/project_id/logs?limit=100&since=-15m', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
Response
{ "logs": [ { "timestamp": "2026-05-05T12:00:00.000Z", "message": "Server started" } ] }
環境変数
環境変数を取得・更新
プロジェクトに紐づく環境変数を取得または更新します。 更新: PATCH は key 単位の upsert です。送信した key は作成または上書きされ、送信していない既存の環境変数は削除されません。 type: 公開APIの type は secret / plain のみで、encrypted は返しません。 権限: 取得・更新とも owner / admin / developer のみ実行可能です。
/api/v1/projects/:id/env
パラメータ
項目
指定
タイプ
説明
id
path
string
プロジェクト ID
decrypt
query
boolean
true のときだけ value を含める
envs
body
array
PATCH で upsert する key / value / type の配列。既存 env 全体の置換ではありません
envs[].type
body
secret | plain
任意。plain のとき非secret、secret または未指定は secret として保存。null やその他の値は 400
レスポンス
200
env 一覧または更新結果。encryptedValue / iv は含みません
400
envs が空配列、または item が不正
403
トークン scope または env 権限不足
413
リクエスト body が 2MB を超過
リクエスト例
環境変数を取得する場合
value も取得する場合は ?decrypt=true を指定
GET /api/v1/projects/:id/env
const response = await fetch('https://hanamii.jp/api/v1/projects/project_id/env', { method: 'GET', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', }, }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
環境変数を更新する場合
key 単位で upsert。type は secret または plain。未指定時は secret として保存
PATCH /api/v1/projects/:id/env
const response = await fetch('https://hanamii.jp/api/v1/projects/project_id/env', { method: 'PATCH', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', 'Content-Type': 'application/json', }, body: JSON.stringify({ envs: [ { key: 'API_URL', value: 'https://example.com', type: 'plain' }, { key: 'API_KEY', value: 'secret-value', type: 'secret' }, ], }), }); if (!response.ok) { throw new Error('Request failed'); } const data = await response.json(); console.log(data);
レスポンス例
GET / PATCH の通常レスポンス
Response
{ "envs": [ { "id": "env_123", "key": "API_URL", "target": ["production"], "type": "plain", "createdAt": 1777622400000, "updatedAt": 1777622400000 } ] }
GET ?decrypt=true のレスポンス
Response
{ "envs": [ { "id": "env_123", "key": "API_URL", "value": "https://example.com", "target": ["production"], "type": "plain", "createdAt": 1777622400000, "updatedAt": 1777622400000 } ] }
© 2026 hanamii. All rights reserved. 🌸