hanamii

特徴

お問い合わせ

ログイン
無料で始める
hanamii

特徴

お問い合わせ

ログイン
無料で始める

REST API

API ドキュメント / Hanamii REST API

REST API を使う

Hanamii のワークスペース、プロジェクト、デプロイ、ログ、環境変数、API トークンを HTTP リクエストから操作できます。

API トークンを発行

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

プロジェクト一覧・詳細

ログ取得

環境変数の取得

不可

プロジェクト作成・デプロイ・再デプロイ

不可

環境変数の追加・更新

不可

プロジェクト削除

不可

不可

レート制限

レート制限を超過した場合、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 トークン

GET

/api/v1/user/tokens

有効な API トークンの一覧を取得します。

POST

/api/v1/user/tokens

新しい API トークンを作成します。(トークンの表示は作成時のみ)

GET

/api/v1/user/tokens/:id

指定した API トークンの情報を取得します。 :id に current を指定すると、このリクエストの認証に使用している API トークン自身の情報を取得します。

DELETE

/api/v1/user/tokens/:id

指定した API トークンを失効します。 :id に current を指定すると、このリクエストの認証に使用している API トークン自身を失効します。

ワークスペース

GET

/api/v1/workspaces

トークンの scope 内で参照できるワークスペース一覧を取得します。 full_account token はトークン所有ユーザーが所属しているワークスペース、workspace scope token は対象ワークスペースのみを返します。

プロジェクト

GET

/api/v1/projects

参照可能なプロジェクト一覧を取得します。

POST

/api/v1/projects

Git または ZIP から project を作成し、初回 deployment を開始します。

GET

/api/v1/projects/:id

project 情報、公開URL、直近 deployment 試行の状態を取得します。

POST

/api/v1/projects/:id/deploy

既存 project の再デプロイを開始します。

DELETE

/api/v1/projects/:id

指定したプロジェクトを削除します。 トークン所有ユーザーが、そのプロジェクトのワークスペースで owner または admin の場合のみ実行できます。

GET

/api/v1/projects/:id/logs

project の runtime logs を JSON または text で取得します。

環境変数

GET / PATCH

/api/v1/projects/:id/env

project の環境変数を取得または key 単位で更新します。

エンドポイント詳細

各 endpoint の method、path、入力、レスポンス、使用例です。

API トークン

API トークン一覧を取得

有効な API トークンの一覧を取得します。

GET

/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 トークンを作成します。(トークンの表示は作成時のみ)

POST

/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 トークン自身の情報を取得します。

GET

/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 トークン自身を失効します。

DELETE

/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 は対象ワークスペースのみを返します。

GET

/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 を指定すると、そのワークスペース内のプロジェクトだけを返します。

GET

/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 で判定されます。

POST

/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 権限で判定されます。

GET

/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 権限で判定されます。

POST

/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 の場合のみ実行できます。

DELETE

/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 を返します。

GET

/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 のみ実行可能です。

GET / PATCH

/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
    }
  ]
}
hanamii

日本の空に咲くクラウド

Calm. Fast. Trusted.

プロダクト

© 2026 hanamii. All rights reserved. 🌸