ドキュメント · リファレンス
管理 REST API
コンソールでできることを HTTP で行います。315 個のエンドポイントはルーター(rest.ts)と操作(operations.ts)からそのまま読み取られ、このページと OpenAPI ドキュメントになります。 この一覧はサーバーのコードから生成されます。新しい機能ができると、すぐにここにも表示されます。
はじめに
ベース URL
https://end.blackall.ai/api/v1
認証
すべてのリクエストに Authorization: Bearer <トークン> ヘッダーが必要です。トークンは、コンソールのアカウント、API と MCP トークンで作成した bwk_… の個人トークンか、MCP クライアントが OAuth で受け取ったアクセストークンです。
curl https://end.blackall.ai/api/v1/me \
-H "Authorization: Bearer $ONEEND_TOKEN"
スコープとロール
トークンには read と write のスコープがあります。読み取るだけのエンドポイントには read、何かを変更するエンドポイントには write が必要です。トークンは持ち主のロールをそのまま持つため、組織でのロールが足りなければ write トークンでも 403 になります。
言語
エラーメッセージと note は ?lang=en、?lang=ja、または Accept-Language ヘッダーに従います。指定がなければ韓国語です。それ以外のレスポンスはデータなので、言語によって変わりません。
上限
リクエスト本文は既定で 256 KiB まで受け付けます。マイグレーションや関数のデプロイなど、より大きな本文を受け付けるルートは各項目に記載しています。この API にはトークンごとのリクエスト回数制限はありません。CORS はすべてのオリジンに開いています。
OpenAPI 3.1
同じ内容を OpenAPI 3.1 ドキュメントとして取得できます。コード生成ツールや Postman にそのまま読み込めます。
openapi.json をダウンロード · https://end.blackall.ai/docs/api/openapi.json
ステータスコード
失敗すると、下のステータスコードと {"error": {"message": "…"}} を返します。メッセージは人が読んで次にすべきことがわかるように書かれています。
{ "error": { "message": "…" } }
note がある場合は、次にすべきことを伝える文です。
アカウントとリージョン
GET /api/v1/
API バージョン この API の名前とバージョンを返します。トークンが受け付けられるか確かめるときに使います。
curl "https://end.blackall.ai/api/v1/" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/me
自分のアカウント このトークンが誰のもので、何ができるかを返します。operator は運営者ツールを使えるか(active)と、使えないときのこのアカウントの理由(refused: not_listed、token_bound、no_second_factor)です。どこから始めればよいかわからないときは、最初に呼び出してください。
curl "https://end.blackall.ai/api/v1/me" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/me', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/regions
リージョン リージョンの一覧を返します。今プロジェクトを作成できるのは、can_createがtrueのリージョンだけです。falseのリージョンは準備中のため一覧には表示されますが、まだ選べません。リージョンはプロジェクト作成時に一度だけ選び、後から変更できないため、create_projectの前に確認してください。
curl "https://end.blackall.ai/api/v1/regions" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/regions', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/regions/requests
リージョンのリクエスト まだ開いていないリージョン(can_createがfalseのリージョン)が必要であることを登録します。担当者からご連絡します。時期はお約束できません。すでに開いているリージョンはリクエストするものではありません。create_projectでそのままプロジェクトを作成してください。
curl -X POST "https://end.blackall.ai/api/v1/regions/requests" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"region":"kr"}'
const response = await fetch('https://end.blackall.ai/api/v1/regions/requests', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"region": "kr"
}),
})
const result = await response.json()
GET /api/v1/server-sizes
サーバーサイズと料金 サーバーサイズ(メモリ)ごとのGoogle マシン、CPU、リージョン別の月額(monthly_minor)です。通貨を空にすると組織の決済通貨です。KRWはウォン(付加価値税込み)、USDはセント(決済時に税金を追加)です。included_inがproのサイズはProプランに含まれます。region_statusがplannedのリージョンは準備中のため選べません。listedがfalseならまだ販売しておらず、sizesは空です。
curl "https://end.blackall.ai/api/v1/server-sizes?region=kr¤cy=KRW" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/server-sizes?region=kr¤cy=KRW', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/imports/sources
取り込み元 コンソールの「他のサーバーから取り込む」と同じです。この組織に接続した取り込み元のアカウント(Supabase、Vercel、PostgreSQL)ごとに、そのプロジェクト一覧とこれまでの取り込みを返します。アカウントの接続はコンソール(connect_url)で行います。トークンをチャットに貼らないためです。
curl "https://end.blackall.ai/api/v1/imports/sources?org=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/imports/sources?org=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/imports
取り込みを開始 コンソールの [取り込みを開始] と同じです。コンソールで分割した取り込み(import)か、import_sources の connection と project から新しい取り込みを(まとまりごとに新しいプロジェクトに分けて)開始します。新しいプロジェクトを作り、元は変えません。Supabase の元は address にセッションプーラーの接続文字列が必要で、今回の実行だけに使って削除します。止まった取り込みをもう一度開始すると、終わった移す先は飛ばし、変わったものだけ移します。オーナー・管理者・開発者のみ実行できます。
curl -X POST "https://end.blackall.ai/api/v1/imports?org=value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{}'
const response = await fetch('https://end.blackall.ai/api/v1/imports?org=value', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({}),
})
const result = await response.json()
GET /api/v1/imports/{id}
取り込みの進行状況 コンソールの取り込みの進行画面と同じです。移す先ごとに段階(スキーマ、ログインユーザー、データ、ファイル、スケジュールジョブ…)の状態と数、移さないものとその理由、確認することを返します。
curl "https://end.blackall.ai/api/v1/imports/ID?org=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/imports/ID?org=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
プロジェクト
GET /api/v1/projects
プロジェクト このアカウントのプロジェクトと、それぞれのAPIアドレスを返します。status は ready(使える)、provisioning(データベースを作成中、数秒)、failed(retry_provisioning)、paused のいずれかです。
curl "https://end.blackall.ai/api/v1/projects" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects
プロジェクトの作成 データベース、ログイン、ファイルストレージを備えた新しいプロジェクトを作成します。リージョンを空にすると既定のリージョンになります。リージョンはプロジェクト作成後に変更できません。料金はどのリージョンでも同じです。組織が複数あるときは、org でどの組織に作るかを選びます(その組織のオーナー、管理者、開発者だけが、プランのプロジェクト数の範囲で作れます)。データベースは数秒後に使えるようになります。status が provisioning なら wait(秒)を渡すか、list_projects の status が ready になってからテーブルやキーを使ってください。
curl -X POST "https://end.blackall.ai/api/v1/projects?wait=0" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","region":"kr","org":"value","wait":0,"tier":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects?wait=0', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"region": "kr",
"org": "value",
"wait": 0,
"tier": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}
単一のプロジェクト プロジェクト一覧のうち、この ref の項目を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PATCH /api/v1/projects/{ref}
名前の変更 プロジェクト名、組織名、またはその両方を変更します。識別子(ref)とアドレスは変わりません。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","organisation":"My team"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"organisation": "My team"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/pause
プロジェクトの一時停止 プロジェクトのすべての動作を止めます。サイト、API、関数は503を返し、リアルタイム接続は拒否され、予約ジョブと新しいデプロイも止まります。データとファイルはそのまま残り、resume_projectですぐに元に戻せます。90 日を超えて一時停止すると、データベースをアーカイブストレージへ移します(get_project_archive)。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/pause" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/pause', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/resume
プロジェクトの再開 一時停止したプロジェクトを再び動かします。無料プランで 3 日間使われずに停止したプロジェクトもこれで(または新しいデプロイで)再開します。予約ジョブは逃した実行を取り戻さず、次の予定時刻から実行します。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/resume" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/resume', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/archive
データベースのアーカイブ状態 データベースを使えない状態(支払いの失敗、無料プラン、一時停止)が 90 日続くと、アーカイブストレージへ移します。このプロジェクトの状況を返します: state(none、scheduled、archiving、archived、restoring、purged)、reason、archive_at(移す日時)、purge_at(アーカイブとファイルを削除する日時、移してから 1 年後)、restore_blocked_by。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/archive" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/archive', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/archive/restore
アーカイブしたデータベースを復元 アーカイブストレージのデータベースを、アーカイブしたときのまま作り直します。通常は数分で、一時停止中のプロジェクトは復元と同時に再開します。お支払いが完了していないときや無料プランでは拒否します(restore_blocked_by)。アーカイブがすでに削除されていれば、空のデータベースを新しく作成します。オーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/archive/restore" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/archive/restore', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/archive/download
アーカイブのダウンロード用アドレス アーカイブしたデータベース(pg_dump 形式。pg_restore で復元)を 1 時間ダウンロードできる署名付きアドレスを作成します。理由が必要で、アクセス記録に残ります。オーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/archive/download" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"reason":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/archive/download', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"reason": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}
プロジェクトの削除 プロジェクトのテーブル、ユーザー、ファイル、関数、予約ジョブ、環境変数、ドメインを完全に削除します。元に戻せません。ユーザーがはっきり求めたときだけ使い、confirmにプロジェクト名を正確に入れてください。最後に残ったプロジェクトは削除できません。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/retry-provisioning
準備に失敗したプロジェクトの再試行 データベースを作成できなかったプロジェクトの準備をやり直します。ほかのツールが「作成できませんでした」と拒否したときに使ってください。新しいプロジェクトは作成しないでください。これは同じプロジェクトの準備を続けるもので、新しく作ると請求が二重になるだけです。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/retry-provisioning" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/retry-provisioning', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
キーと署名
GET /api/v1/projects/{ref}/keys
APIキーの取得 プロジェクトのアドレスと2つのキーを返します。パブリッシャブルキーはブラウザ用です。シークレットキーはすべてのアクセスルールを迂回するため、サーバーでのみ使ってください。書き込み権限のあるトークンだけが呼び出せます。フロントエンドのコードに入れる値が必要なときは only: "publishable" で呼び出してください。アドレスとパブリッシャブルキーだけが返り、シークレットキーが会話やコードに混ざりません(読み取り権限のトークンでも呼び出せます)。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/keys?only=publishable" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/keys?only=publishable', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/api-keys
名前付きAPIキー 用途ごとに作成したbw_publishable_キーとbw_secret_キーそれぞれの名前、種類、プレフィックス、最終使用日時、失効状態です。シークレットキーの値は返しません。パブリッシャブルキーの値は返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/api-keys" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/api-keys', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/api-keys
APIキーの作成 名前付きのキーを1つ作成します。publishableはブラウザ用(アクセスルールに従う)、secretはサーバー用(アクセスルールを迂回する)です。シークレットキーの値はこの応答にだけ含まれ、二度と表示できません。キーを作成できるのはオーナーと管理者のみで、プロジェクトごとに20個までです。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/api-keys" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"kind":"publishable","name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/api-keys', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"kind": "publishable",
"name": "my-name"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/api-keys/{id}
APIキーの失効 名前付きのキーを1つ失効させます。そのキーを使ったリクエストは30秒以内に拒否されるようになります。ほかのキーには影響しません。元に戻せません。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/api-keys/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/api-keys/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/signing
トークンの署名 ログイントークンをHS256とES256のどちらで署名しているか、また当面まだ受け付ける古いキー(猶予期間中のキー)を表示します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/signing
トークンの署名の変更 ES256にすると、新しいログインは非対称鍵で署名され、ほかのサーバーが公開鍵(JWKS)でトークンを確認できます。すでに発行されたトークンは期限が切れるまで使えます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"alg":"HS256"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"alg": "HS256"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/signing/rotate
キーのローテーション パブリッシャブルキーとシークレットキーに署名する新しいキーを作成します。古いキーはgrace_hours(0、1、24、168)の間まだ受け付けます。0(または空)にするとすぐに無効になります(漏えいした場合)。0のときは使っているアプリがすべて30秒以内に止まるため、confirm にプロジェクト名(list_projectsのname)をそのまま入れてください。アプリに入れたキーをすべて置き換える必要があるため、ユーザーがはっきり求めたときだけ使ってください。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing/rotate" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"grace_hours":0,"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing/rotate', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"grace_hours": 0,
"confirm": "my-project"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/signing/keys/{kid}
古いキーの終了 猶予期間中の古いキーを今すぐ終了します。kidはget_jwt_signingのkeysのうち、stateがrotatingのものです。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing/keys/KEY_ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/signing/keys/KEY_ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
データベース
GET /api/v1/projects/{ref}/advisors
セキュリティとパフォーマンスの点検 プロジェクトのデータベース構造からセキュリティとパフォーマンスの問題を探します。RLSがオフのテーブル、誰でも書き込めるルール、アクセスルールを迂回するビュー、search_pathが固定されていないsecurity definer関数、ユーザーテーブルを公開するビュー、インデックスのない外部キー、主キーのないテーブル、重複したインデックス、行ごとにuid()を呼び出すルールが対象です。修正するSQLがある項目にはそれ(remedy)を添えます。データは読みません。テーブルを作成したりルールを変更したりした後に呼び出してください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/advisors" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/advisors', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/tables/{table}/csv
テーブルをCSVでエクスポート テーブルの行を CSV で返します(1行目は列名)。コンソールのテーブルエディターのエクスポートと同じです。1MB まで返り、超えると行の区切りで切って truncated が true になります。そのときは filters で範囲を分けて何回かに分けて受け取ってください。空欄は NULL、"" は空文字列です。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/tables/notes/csv?sort=value&desc=true" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/tables/notes/csv?sort=value&desc=true', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/tables/{table}/csv
CSVをテーブルにインポート CSV の行をテーブルに入れます。コンソールのテーブルエディターのインポートと同じです。1行目は列名で、同じ名前の列に入ります(columns で変えられます)。1行でも入れられなければ何も入れず、行番号と理由を返します。2MB、10,000行までです。引用符のない空欄は NULL か列の既定値です。それより大きいときは分けて呼び出してください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/tables/notes/csv" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"csv":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/tables/notes/csv', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"csv": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/tables
テーブル プロジェクトのテーブルを、列、おおよその行数、アクセスルールの状態とともに返します。ルールがオンなのにルールが1つもない場合、パブリッシャブルキーからは何も見えません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/tables" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/tables', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/policies
アクセスルール どのテーブルのどの操作が誰に開かれているかを返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/policies" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/policies', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/rows/{table}
テーブルの読み取り テーブルの先頭の行をそのまま読みます。確認用です。条件が必要な場合はrun_sqlを使ってください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rows/notes?limit=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rows/notes?limit=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/migrations
マイグレーションの記録 apply_migrationsで適用したマイグレーションのバージョン、名前、適用時刻を古い順に返します。記録はプロジェクトのoneend_migrationsテーブルにあります。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/migrations" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/migrations', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/migrations
マイグレーションの適用 まだ適用していないマイグレーションをバージョン順に、1つずつそれぞれのトランザクションで実行し、記録します。すでに適用されたバージョンは飛ばします。1つが失敗すると、それだけを元に戻して止まり、前のものは適用されたまま残ります。スキーマを変更するときにrun_sqlの代わりにこれを使うと、同じ変更をほかのプロジェクトにもそのまま適用し直せます。supabase/migrationsのファイルをそのまま送れます: public.、auth.uid()、storage.、to authenticatedなどのSupabaseの名前はこのプロジェクトの名前に変換して実行し、translatedで返します(Supabase名の変換)。適用記録にはファイルのとおりに残ります。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/migrations" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"migrations":[{"version":"20260101000000","name":"my-name","sql":"select 1"}]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/migrations', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"migrations": [
{
"version": "20260101000000",
"name": "my-name",
"sql": "select 1"
}
]
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/migrations/{version}
マイグレーションの記録の削除 マイグレーションを1つ、適用していない状態に戻します。記録だけを削除し、そのマイグレーションが作ったものはそのまま残します。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/migrations/20260101000000" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/migrations/20260101000000', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/schema
スキーマをSQLで プロジェクトのスキーマ(型、シーケンス、テーブルと制約、外部キー、インデックス、関数、ビュー、トリガー、RLSとルール)を作り直せるSQLとして返します。行のデータと権限は含まれません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/schema" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/schema', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/types/typescript
TypeScriptの型を作る プロジェクトのテーブル、ビュー、関数、列挙型から、supabase-jsのcreateClient<Database>()に渡すDatabase型を作ります。スキーマを変更したあとに、もう一度呼び出してください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/types/typescript?schema=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/types/typescript?schema=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/sql/query
SQLの照会(読み取り専用) プロジェクトのPostgreSQLデータベースで照会文1つ(SELECTなど)を読み取り専用トランザクションで実行し、結果の行を返します。データや構造を変更する文は拒否されるため、その場合はrun_sqlを使ってください。読み取り権限のトークンでも呼び出せます。Vaultのシークレットの値は開きません(vault.decrypted_secretsのdecrypted_secretは空です)。SQLの文法はPostgreSQL 16のドキュメント(https://www.postgresql.org/docs/16/sql-commands.html)に従います。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/sql/query" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"sql":"select 1"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/sql/query', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"sql": "select 1"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/sql
SQLの実行(変更) プロジェクトのPostgreSQLデータベースでデータや構造を変更するSQL(CREATE、INSERT、UPDATE、DELETEなど)を実行し、結果の行を返します。照会だけの場合はquery_sqlを使ってください。SQLの文法はPostgreSQL 16のドキュメント(https://www.postgresql.org/docs/16/sql-commands.html)に従います。新しいテーブルはアクセスルールが自動でオンになるため、続けてルールを作成しない限り、パブリッシャブルキーからは何も見えません。ルールで使うロール名は<ref>_anon、<ref>_authenticated、<ref>_service_roleです。Supabase向けに書いたSQL(public.、auth.uid()、storage.、to authenticated)はこのプロジェクトの名前に変換して実行し、何を変換したかをtranslatedで返します(Supabase名の変換)。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/sql" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"sql":"select 1"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/sql', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"sql": "select 1"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/database
データベース接続情報 このプロジェクトのPostgreSQLに直接接続するためのアドレスを表示します。direct(5432、session: マイグレーションツールやデータベースクライアント用)とpooler(6543、transaction: サーバーレス用)です。パスワードは保存していないため、[YOUR-PASSWORD]と表示されます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/database/password
データベースの新しいパスワード 直接接続用の新しいパスワードを作成し、一度だけ返します。古いパスワードで接続しているものは、次の接続から拒否されます。いまそのパスワードで接続しているサーバー、ジョブ、ツールは再接続のときに切れるので、confirm にプロジェクト名(list_projectsのname)をそのまま入れてください。このユーザーは行レベルセキュリティを迂回するため、サーバーにだけ置いてください。keep_for_deploys: true のときはパスワードを封印して保管し、本番のサーバー・ミドルウェア・関数が実行時に DATABASE_URL・POSTGRES_URL・DIRECT_URL を受け取ります(ビルドには渡しません)。デプロイしたコードがシークレットキーと同じくすべての行を読めるようになるので、ユーザーが望むときだけオンにしてください。これなしで作り直すと受け渡しも止まります。ユーザーが求めたときだけ使ってください。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/password" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/password', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/mysql
MySQL データベースの一覧 このプロジェクトの MySQL データベース(MariaDB 11.4)と、それぞれがどのアプリに入るか(app、null はプロジェクト全体)、状態、サイズ、プランで作れる数(max)を返します。available が false なら、このサーバーにはまだ MySQL がありません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/mysql
MySQL データベースの作成 WordPress のように MySQL を使うアプリのために、データベースと専用ログインを作ります。通常 1 分以内に準備できます。app を指定するとそのアプリのデプロイだけが、指定しなければプロジェクトのすべてのアプリが受け取ります(プロジェクト全体用が 1 つだけのとき)。受け取るアプリのサーバーは起動時に MYSQL_URL・MYSQL_HOST・MYSQL_PORT・MYSQL_USER・MYSQL_PASSWORD・MYSQL_DATABASE と WORDPRESS_DB_HOST・WORDPRESS_DB_USER・WORDPRESS_DB_PASSWORD・WORDPRESS_DB_NAME を受け取ります(ビルドには入りません)。毎晩バックアップされます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/mysql/{name}
MySQL データベースをアプリにつなぐ MySQL データベースを受け取るアプリを変えます。app が null ならプロジェクト全体用になります。1 つのアプリにつなげるデータベースは 1 つだけです。動いているサーバーは再起動するか再デプロイすると変更を受け取ります。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"app":"owner/repo"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"app": "owner/repo"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/mysql/{name}
MySQL データベースの削除 MySQL データベースとそのログイン、バックアップをすべて削除します。元に戻せないので、ユーザーがはっきり求めたときだけ使い、confirm にデータベース名をそのまま入れてください。受け取っていたアプリは次の起動から MYSQL_* の変数を受け取りません。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/mysql/{name}/connection
MySQL の接続情報 MySQL データベースのアドレス、ポート、データベース名、ログイン、パスワードと、アプリが受け取る変数(variables)を返します。アドレスにはこのサーバー上のアプリからだけ届きます。パスワードは書き込み権限のトークンにだけ表示されます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/connection" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/connection', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/mysql/{name}/backups
MySQL バックアップの一覧 MySQL データベースのバックアップ(毎晩の自動、手動で作ったもの、復元の直前のもの)と復元の記録を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/backups" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/backups', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/mysql/{name}/backups
MySQL を今すぐバックアップ MySQL データベースを今すぐバックアップします。プラグインの更新や大きな変更の前に作ってください。7 日間保管されます。毎晩のバックアップは別に自動で行われます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/backups" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/backups', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/mysql/{name}/restore
MySQL をバックアップから復元 MySQL データベースをバックアップした時点に戻します。その後の変更はすべてなくなるので、ユーザーがはっきり求めたときだけ使い、confirm にデータベース名をそのまま入れてください。戻す直前の状態を先にバックアップするので、undo_backup_id でもう一度復元できます。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/restore" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"backup_id":"BACKUP_ID","confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/mysql/my-name/restore', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"backup_id": "BACKUP_ID",
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/extensions
データベースの拡張機能の一覧 有効にできるPostgreSQLの拡張機能(pgvectorのvector、postgis、citext、pgcryptoなど)と、それぞれがこのサーバーにあるか(available)、有効か(enabled)、バージョンを返します。拡張機能はextensionsスキーマにインストールされ、SQLではそのままvector(1536)やgeometryのように使います。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/extensions" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/extensions', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/extensions/{name}
データベースの拡張機能を有効にする 拡張機能を1つ有効にします(create extension ... with schema extensions)。埋め込み検索にはvector、地図や距離の計算にはpostgisを使います。一覧にない拡張機能は拒否されます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/extensions/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/extensions/my-name', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/extensions/{name}
データベースの拡張機能を無効にする 拡張機能を1つ無効にします。その拡張機能を使う列、インデックス、関数が残っていると拒否されます。同じデータベースのほかのプロジェクトが使っている場合、インストールは残り、このプロジェクトの記録だけが削除されます(note)。pg_trgmとunaccentは標準で有効なため無効にできません。confirm に拡張機能の名前をそのまま入れてください。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/extensions/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/extensions/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/database/move
専用データベースへの移行の状態 このプロジェクトが専用データベースにあるか(dedicated)、プランに含まれるか(plan_allows)、移行を依頼したか・移行中か・失敗して止まったか(stopped、last_error)を示します。size_bytesがauto_move_max_bytesより大きいと自動では移行しないため、move_to_dedicated_databaseで依頼してください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/move" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/move', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/database/move
専用データベースへの移行 共用データベースにあるプロジェクトを、専用のデータベースへ移行するよう依頼します。コンソールの「今すぐ移行」と同じです。順番が来ると移行し、移行中は書き込みが止まり、読み取りは続きます。移行直前の状態がバックアップとして残り、失敗した場合は元の場所にそのまま残ります(止まった移行は、もう一度依頼すると再試行します)。Vaultや大きなデータベースに必要です。Proプランから含まれます。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/move" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/move', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/database/dedicated-disk
専用ディスク データベースが大きくなったプロジェクトが使う、このプロジェクトだけのディスクと Postgres を示します。サイズ(size_gb)、使用量、月額、30日間の履歴、進行中の依頼と縮小の提案(shrink)です。まだ共有ディスクにある場合は、移す基準(threshold_gb)と現在のデータベースのサイズを示します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/dedicated-disk" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/dedicated-disk', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/database/dedicated-disk
専用ディスクに移す このプロジェクトのデータベースを専用ディスク(max(1.2 × データベース, 20GB))に移すよう依頼します。コンソールの「専用ディスクに移す」と同じです。ディスクは作成したサイズに対して1GBあたり月 ₩1,200(75セント)で請求し、移している間は書き込みが失敗し、読み取りはできます(get_dedicated_disk の expected_downtime_seconds)。Enterprise はいつでも、ほかの有料プランは基準を超えると依頼できます。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/dedicated-disk" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/dedicated-disk', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/database/dedicated-disk/shrink
ディスクを縮小 専用ディスクを縮小します。より小さいディスク(1.2 × データベース、最小20GB)を新しく作って移し、元のディスクを削除します。7日間 25% 未満の使用が続いたディスクだけ縮小できます(get_dedicated_disk の shrink.suggested)。移している間は書き込みが失敗し、読み取りはできます。自動で縮小することはありません。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/dedicated-disk/shrink" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/database/dedicated-disk/shrink', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/realtime
リアルタイムがオンのテーブル 変更がリアルタイムで送られるテーブルです。ここにないテーブルを購読しても何も届きません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/realtime" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/realtime', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/realtime/{table}
テーブルのリアルタイムのオン・オフ テーブル1つの変更通知をオンまたはオフにします。通知もアクセスルールを通過する行についてだけ送られます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/realtime/notes" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/realtime/notes', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
認証とユーザー
GET /api/v1/projects/{ref}/users
サービスのユーザー このプロジェクトを使うサービスに新規登録したユーザーです。プラットフォームのアカウントとは別です。一度に最大200人まで返り、totalが全体の人数です。has_moreがtrueならまだ続きがあるので、offsetを増やして再度呼び出してください。usersの長さを人数として扱うのは誤りです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users?limit=1&offset=0" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users?limit=1&offset=0', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/users/{id}/links
ログインリンクの作成 メールで送られるリンクを、メールを送らずに作って返します。invite(招待。いなければユーザーを作成)、magiclink(パスワードなしのログイン)、recovery(パスワードの再設定)、signup(新規登録の確認。password が必要)です。action_link を開いた人はそのユーザーとしてログインするので、パスワードと同じです。ユーザーがはっきり求めたときだけ作り、その人にだけ渡してください。redirect_to は add_redirect_url で登録したアドレスである必要があります。シークレットキーを見られるロール(オーナー、管理者、開発者)だけが行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/ID/links" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"type":"invite"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/ID/links', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"type": "invite"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/users/{id}
ユーザーの変更 このプロジェクトのユーザー1人を変更します。メールアドレス、パスワード、メールの確認、利用停止とその解除、メタデータです。渡したものだけが変わります。パスワードを変えるか停止すると、その人のログインはすべて切れます。パスワードは10文字以上で、漏えいしたことのあるものは拒否されます。メタデータは既存の値にマージされます。ユーザーがはっきり求めたときだけ使ってください。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"email":"[email protected]","password":"a-long-passphrase","email_confirm":true,"ban_duration":"value","user_metadata":{},"app_metadata":{}}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/ID', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"email": "[email protected]",
"password": "a-long-passphrase",
"email_confirm": true,
"ban_duration": "value",
"user_metadata": {},
"app_metadata": {}
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/users/import
ユーザーの一括インポート 別のサービス(例: Supabase の auth.users エクスポート)のユーザーを一度に500人まで取り込みます。id と bcrypt のパスワードハッシュはそのまま保たれるため、パスワードを決め直す必要はありません。先にリスト全体を検査し、誤りのある行は番号で示して何も取り込みません。すでにあるアカウントはスキップするので、再実行しても安全です。dry_run=true なら検査のみです。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/import" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"users":[{"email":"[email protected]","id":"ID","encrypted_password":"value","email_confirmed":"value","user_metadata":"value","app_metadata":"value"}]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/import', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"users": [
{
"email": "[email protected]",
"id": "ID",
"encrypted_password": "value",
"email_confirmed": "value",
"user_metadata": "value",
"app_metadata": "value"
}
]
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/users
ユーザーの追加 このプロジェクトのサービスにユーザーを1人作成します。パスワードは10文字以上が必要です。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"email":"[email protected]","password":"a-long-passphrase"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"email": "[email protected]",
"password": "a-long-passphrase"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/providers
ソーシャルログインの設定 このプロジェクトのサービスに、どのアカウントでログインできるかを表示します。プラットフォームが対応するプロバイダーをすべて返すため、まだ設定していないものはconfigured: falseと表示されます。独自に登録したプロバイダー(custom:<名前>)はその後にcustom項目(アドレス、scopes、応答フィールドの対応)と一緒に出ます。callback_urlは、プロバイダーのコンソールにそのまま貼り付けるアドレスです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/auth/providers/{provider}
ソーシャルログインをオンにする プロバイダー1つのクライアントIDとシークレットを保存してオンにします。シークレットは封印され読み戻せず、確認できるのは末尾4文字だけです。先にプロバイダーのコンソールでアプリを作成し、list_auth_providersのcallback_urlをリダイレクト先アドレスとして登録してください。保存済みのプロバイダーのIDだけを変える場合は、client_secretを空文字列にしてください。Supabaseと同じように、providerをcustom:<名前>にすると、プラットフォームの一覧にないOAuth 2.0・OpenID Connectプロバイダーを独自に登録します(例: custom:kakao-xts)。そのときはissuer(OpenID Connectならこれだけでアドレスを埋めます)またはauthorize_url・token_url(・userinfo_url)が必要で、scopesとclaims(応答のどのフィールドがid・email・email_verified・name・avatar・phoneか、ドットでつないだパス)を指定できます。アプリからはsignInWithOAuth({ provider: "custom:<名前>" })で呼び出し、ログイン直後のセッションにprovider_tokenが一度だけ入ります。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers/google" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"client_id":"CLIENT_ID","client_secret":"CLIENT_SECRET","enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers/google', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"client_id": "CLIENT_ID",
"client_secret": "CLIENT_SECRET",
"enabled": true
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/auth/providers/{provider}
ソーシャルログインのオン・オフ プロバイダーをオフまたはオンにし、保存済みの認証情報は残します。プロバイダーの不具合の原因を調べている間に使ってください。オンに戻すときに新しいシークレットは不要です。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers/google" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers/google', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/auth/providers/{provider}
ソーシャルログインの削除 プロバイダーの設定を認証情報ごと削除します。一時的にオフにするだけならset_auth_provider_enabledを使ってください。この方法で削除した後は、シークレットを再取得する必要があります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers/google" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/providers/google', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/redirect-urls
ログイン後に戻るアドレス ログイン後に戻すことができるアドレスです。ここにないアドレスには誰も送られません。ログインはできるのにどこにも戻らない場合は、まずここを見てください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/redirect-urls" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/redirect-urls', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/auth/redirect-urls
戻るアドレスの追加 許可リストにアドレスを1つ追加します。スキーム、ホスト、ポートがすべて一致する必要があり、パスは確認しません。そのためhttps://app.example.com/callbackを追加するとhttps://app.example.comとして保存されます。モバイルアプリ独自のスキーム(co.example.app://callback)も追加できます(ドットを含むスキームのみ)。応答には実際に保存されたリストが含まれます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/redirect-urls" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"url":"https://example.com/hook"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/redirect-urls', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"url": "https://example.com/hook"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/auth/redirect-urls
戻るアドレスの削除 許可リストからアドレスを1つ外します。list_redirect_urlsが返したとおりに指定してください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/redirect-urls" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"url":"https://example.com/hook"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/redirect-urls', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"url": "https://example.com/hook"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/sms
SMSログイン設定の確認 電話番号の認証コードログイン(signInWithOtp({ phone }))に使うSMSアカウントを確認します。プロバイダー(platform、solapi、nhn、aligo、twilio)、送信元番号、送信できる国番号、認証コードの桁数と有効時間、1時間あたりの上限です。認証情報は末尾4文字だけ表示されます。platform_availableがtrueのときだけ、プラットフォームのアカウント(1通 ₩100、韓国のみ)を選べます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sms" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sms', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/auth/sms
SMSログインの設定 SMSアカウントを保存してオンにします。自分で契約したプロバイダーには、key・secret・account(プロバイダーによって異なります。SolapiはAPI KeyとAPI Secret、NHN CloudはApp KeyとSecret Key、AligoはAPI KeyとUser ID(account)、TwilioとTwilio VerifyはAccount SID(account)とAuth Token(secret)、MessageBirdはAccess Key(key)、TextlocalはAPI Key(key)、VonageはAPI Key(key)とAPI Secret(secret))と、事前登録した送信元(MessageBird・Textlocal・Vonageは11文字以内の送信者IDも可、Twilio VerifyはVAで始まるVerify Service SID)が必要です。電話番号の確認やテスト番号などは update_auth_config の SMS_* キーで変更します。空欄の認証情報は保存済みの値を使います。allowed_countriesは既定で82(韓国)のみです。対象外の国を入れると、海外の有料番号にSMSを送らせる詐欺の対象になります。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sms" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"provider":"platform"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sms', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"provider": "platform"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/auth/sms
SMSログインの削除 SMSアカウントの設定を認証情報ごと削除します。以降の電話番号ログインはphone_provider_disabledで拒否されます。一時的にオフにするだけなら、set_sms_settingsにenabled: falseを渡してください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sms" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sms', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/smtp
SMTP設定の表示 このプロジェクトの認証メール(登録確認・パスワード再設定・ログインリンク・メールアドレス変更・招待)を送るSMTPサーバーと送信者を表示します。SupabaseのSMTP Settingsと同じ項目です。パスワードは表示されず、password_hintに末尾4文字だけが出ます(8文字以上の場合)。last_errorがあれば、そのサーバーが拒否したためプラットフォームの送信アドレスから代わりに送ったということです。configuredがfalseならプラットフォームの送信アドレスを使います。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/auth/smtp
SMTP設定 認証メールをこのプロジェクトのSMTPサーバーから、指定した送信者名とアドレスで送ります。初回はsender_email、host、username、passwordが必要で、その後は変える値だけで構いません(passwordを空にすると保存済みの値を使います)。サーバーはパブリックなアドレスで、TLS(465は最初から、それ以外はSTARTTLS)を使う必要があります。拒否された場合はプラットフォームの送信アドレスから送り、理由をlast_errorに残します。保存後にtest_smtp_settingsで確認してください。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"sender_email":"value","sender_name":"value","host":"value","port":25,"username":"value","password":"a-long-passphrase","minimum_interval_seconds":0,"rate_limit_per_hour":1,"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"sender_email": "value",
"sender_name": "value",
"host": "value",
"port": 25,
"username": "value",
"password": "a-long-passphrase",
"minimum_interval_seconds": 0,
"rate_limit_per_hour": 1,
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/auth/smtp
SMTP設定の削除 SMTP設定をパスワードごと削除します。以降、認証メールはプラットフォームの送信アドレスから送られます。一時的に止めるにはset_smtp_settingsにenabled: falseを渡してください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/auth/smtp/test
SMTPテストメールの送信 保存したSMTPサーバーからテストメールを1通送ります。プラットフォームからの代替送信はしないので、失敗した場合はサーバーが返した理由がそのまま表示されます。toを省くと呼び出した人のアドレスに送ります。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp/test" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"to":"https://example.com"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/smtp/test', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"to": "https://example.com"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/templates
メールテンプレートの表示 認証メール6種類(confirmation、invite、magic_link、recovery、email_change、reauthentication)の件名と本文(HTML)です。customがfalseの種類は既定の文面(リクエストの言語に合わせた韓国語・英語・日本語)を使います。typeを渡すとその1つだけを表示します。使える変数はSupabaseと同じです: {{ .ConfirmationURL }}、{{ .Token }}、{{ .TokenHash }}、{{ .SiteURL }}、{{ .Email }}、{{ .NewEmail }}、{{ .RedirectTo }}、{{ .Data.<key> }}。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/templates/{type}
メールテンプレートの表示 認証メール6種類(confirmation、invite、magic_link、recovery、email_change、reauthentication)の件名と本文(HTML)です。customがfalseの種類は既定の文面(リクエストの言語に合わせた韓国語・英語・日本語)を使います。typeを渡すとその1つだけを表示します。使える変数はSupabaseと同じです: {{ .ConfirmationURL }}、{{ .Token }}、{{ .TokenHash }}、{{ .SiteURL }}、{{ .Email }}、{{ .NewEmail }}、{{ .RedirectTo }}、{{ .Data.<key> }}。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/auth/templates/{type}
メールテンプレートの保存 1つの種類の件名と本文(HTML)を設定します。Supabaseからコピーしたテンプレートをそのまま使えます。差し込む値はHTMLエスケープされ、件名は1行である必要があります。{{ if }}などの他の構文は拒否されます。reauthenticationは保存されますが、まだ送信されません(reauthenticateは未対応)。保存前にpreview_email_templateで確認してください。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"subject":"value","body":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"subject": "value",
"body": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/auth/templates/{type}
メールテンプレートを戻す 1つの種類のテンプレートを削除し、既定の文面(韓国語・英語・日本語)に戻します。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/auth/templates/{type}/preview
メールテンプレートのプレビュー 例の値を入れたときのメールの見た目(件名、HTML、テキスト)を返します。subjectとbodyを渡すと保存せずにその内容を、省くと保存済みのテンプレートか既定の文面を表示します。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation/preview" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"subject":"value","body":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/templates/confirmation/preview', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"subject": "value",
"body": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/auth/sso
SAML SSOの確認 このプロジェクトに登録したSAML IdPとメールドメイン、IdPに入力する2つのアドレス(acs_url、entity_id)を確認します。アプリではsupabase.auth.signInWithSSO({ domain })でログインします。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sso" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sso', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/auth/sso/{id}
SAML SSOの削除 IdPを1つ削除します。そのIdPで作られたアカウントは残りますが、SSOではログインできなくなります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sso/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/sso/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/auth/anonymous
匿名ログインのオン・オフ メールアドレスなしですぐにセッションを発行する匿名ログインをオンまたはオフにします。今の状態はlist_auth_providersのanonymous_sign_inです。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/anonymous" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/auth/anonymous', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/users/{id}
ユーザーの削除 プロジェクトのユーザーを1人削除します。元に戻せません。idはlist_usersが返した値です。ユーザーがはっきり求めたときだけ使い、confirm にそのユーザーのメールアドレス(またはid)をそのまま入れてください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/users/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
ストレージ
POST /api/v1/projects/{ref}/buckets/{bucket}/empty
バケットを空にする バケット内のファイルをすべて削除します。バケットは残ります。元に戻せないので、ユーザーがはっきり求めたときだけ使い、confirm にバケット名をそのまま入れてください。removed が削除したファイル数です。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/empty" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/empty', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/buckets/{bucket}/objects
ファイル一覧 バケット内の1つのフォルダーを表示します。サブフォルダーとファイルの名前、サイズ、形式です。prefixでフォルダーを選び(例: avatars/2024/)、searchで名前を探します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/objects?prefix=value&search=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/objects?prefix=value&search=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/buckets/{bucket}/objects
ファイルのアップロード ファイルを1つバケットにアップロードします(2MBまで)。テキストはそのまま、バイナリはencodingをbase64にしてcontentにbase64を入れます。同じ名前があれば拒否し、upsertがtrueなら置き換えます。バケットのサイズと形式の制限に従います。もっと大きいファイルはストレージAPI(/storage/v1)でアップロードしてください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/objects" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"content":"value","name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/objects', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"content": "value",
"name": "my-name"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/buckets/{bucket}/object
ファイルのダウンロード ファイル1つの内容を返します(2MBまで)。テキストはutf-8、バイナリはbase64で返します。もっと大きいファイルはcreate_signed_urlでアドレスを作って受け取ってください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/object?name=my-name&encoding=utf-8" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/object?name=my-name&encoding=utf-8', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/buckets/{bucket}/object
ファイルの削除 バケットからファイルを1つ削除します。元に戻せません。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/object?name=my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/object?name=my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/buckets/{bucket}/upload-urls
アップロードURLの作成 2MBより大きい画像や動画などのファイル1つをアップロードするURLを作ります。ファイルの中身はこのツールでは送りません。返された url にファイルのバイトを本文としてそのまま PUT し、content-type に形式(image/png、video/mp4 など)を入れてください(例: example の curl)。URLは2時間、その名前1つにだけ使えます。max_bytes より大きいファイルや allowed_mime_types にない形式は拒否されます。max_bytes より大きいファイルは blackwall://storage の再開可能アップロード(TUS)を使ってください。公開バケットなら public_url がアップロード後の公開アドレスです。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/upload-urls" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/upload-urls', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/buckets/{bucket}/signed-urls
署名付きURLの作成 非公開バケットのファイル1つを、決まった時間だけ誰でもダウンロードできるアドレスを作ります(既定1時間、最大7日)。アドレスを持つ人はログインなしで受け取れるので、必要な分だけ作ってください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/signed-urls" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value/signed-urls', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/buckets/{bucket}
バケット設定の変更 バケットの公開・非公開、ファイル1つの最大サイズ、受け付ける形式を変更します。渡したものだけが変わり、残りはそのままです。公開にすると中のファイルを誰でもダウンロードできるようになるので、ユーザーがはっきり求めたときだけ使ってください。すでにあるファイルはそのままです。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"public":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"public": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/buckets/{bucket}
バケットの削除 空のバケットを削除します。ファイルが残っていると拒否するので、先に empty_bucket で空にしてください。元に戻せません。ユーザーがはっきり求めたときだけ使い、confirm にバケット名をそのまま入れる必要があります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets/value', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/buckets
バケット ストレージのバケットを、それぞれのファイル数とサイズとともに返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/buckets
バケットの作成 公開バケットは誰でも読めます。非公開バケットはアップロードした本人だけが読めます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"id":"ID"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/buckets', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"id": "ID"
}),
})
const result = await response.json()
デプロイとリポジトリ
POST /api/v1/projects/{ref}/deployments/sources/upload-urls
デプロイ用アーカイブのアップロードURLの作成 deploy_files に収まらない大きなサイト(3MB 超)をリポジトリなしでデプロイするときに使います。アーカイブ(.zip、.tar、.tar.gz)1つをアップロードするURLを作ります。アーカイブの中身はこのツールでは送りません。返された url にアーカイブを本文としてそのまま PUT すると(例: example の curl、トークンなし)答えに source が返り、その source で deploy_source を呼ぶとデプロイされます。URLは1時間、このプロジェクトにだけ使え、max_bytes まで受け付けます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/sources/upload-urls" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/sources/upload-urls', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/deployments/sources
デプロイするファイルのアップロード リポジトリなしでデプロイするファイルを、1 つのアーカイブ(.zip、.tar、.tar.gz)として本文にそのまま送ります。内容のダイジェストで保存され、デプロイは次に POST /deployments へ {"source": "<digest>"} を送って作成します。同じバイトをプレビューと本番にデプロイできます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/sources" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/octet-stream" \
--data-binary @file
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/sources', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/octet-stream' },
body: bytes,
})
const result = await response.json()
POST /api/v1/projects/{ref}/deployments
デプロイの作成 本文の内容によって 3 種類あります。source は POST /deployments/sources で送ったアーカイブのダイジェスト、files(または files_base64)はパスごとのファイル内容です。どちらもなければ app、branch、commit でリポジトリのコミットをビルドします。target が production なら本番、それ以外はプレビューです。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"source":"export default async () => new Response(\"ok\")","files":"value","files_base64":"value","app":"owner/repo","branch":"main","commit":"0123456789abcdef0123456789abcdef01234567","wait":0,"block_on_advisors":true,"prebuilt":true,"target":"preview","message":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"source": "export default async () => new Response(\"ok\")",
"files": "value",
"files_base64": "value",
"app": "owner/repo",
"branch": "main",
"commit": "0123456789abcdef0123456789abcdef01234567",
"wait": 0,
"block_on_advisors": true,
"prebuilt": true,
"target": "preview",
"message": "value"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/deployments/{id}/redeploy
再デプロイ あるデプロイと同じコミットを、同じ環境にもう一度ビルドします。コミットとは関係のない理由(後から追加した環境変数、一時的に落ちていたパッケージレジストリ)で失敗したビルドをやり直すときに使います。プロダクションへのデプロイはオーナーと管理者のみ行えます。応答に新しいデプロイのアドレス(url、preview_url・production_url)とセキュリティチェックの結果(advisors)が含まれます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID/redeploy" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID/redeploy', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/deployments/{id}/rollback
プロダクションのロールバック 以前に配信していたプロダクションデプロイへ、プロダクションのアドレスを直接戻します。再ビルドはせず、数秒で切り替わります。カスタムドメインも追従します。応答にそのデプロイの url と production_url が含まれます。その後プロダクションは保留されます(production_held): 新しいプロダクションビルドは作られますが、promote_deployment で昇格するまで配信されません。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID/rollback" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID/rollback', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/deploy-hooks
デプロイフック デプロイフックとそのアドレスを表示します。アドレスにPOSTするとそのブランチの最新コミットをビルドするため、アドレス自体がシークレットです。読み取り権限のトークンには各アドレスの末尾4文字だけを表示します(secret_hidden)。書き込み権限のトークンならすべて表示します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deploy-hooks" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deploy-hooks', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/deploy-hooks
デプロイフックの作成 pushなしでビルドを起動するアドレスを作成します。CMSで記事を公開したときや、予約ジョブから呼び出してください。プロダクションブランチのフックはオーナーと管理者のみ作成できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deploy-hooks" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"app":"owner/repo","branch":"main"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deploy-hooks', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"app": "owner/repo",
"branch": "main"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/deploy-hooks/{id}
デプロイフックの削除 デプロイフックを削除します。そのアドレスを呼び出していたものは、もうデプロイを起こしません。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deploy-hooks/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deploy-hooks/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/deployments/deleted
最近削除したデプロイ 3日以内に削除されたデプロイ(手動で削除したものと保存期間が過ぎたもの)と、復元できる期限(restorable_until)を返します。その間、そのデプロイのアドレスは 410 を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/deleted" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/deleted', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/deployments/{id}
デプロイを削除 デプロイを 1 つ削除します。配信中とビルド中のデプロイは削除できません。3日間は restore_deployment で復元でき、その後ファイルとビルドログを消去します。本番のデプロイはプロジェクト管理者、それ以外は開発者以上が実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/deployments/{id}/restore
デプロイを復元 3日以内に削除されたデプロイを復元します。このデプロイのアドレスが再び応答し、ロールバックや昇格ができるようになります。本番のデプロイはプロジェクト管理者、それ以外は開発者以上が実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID/restore" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID/restore', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/deployments
デプロイ このプロジェクトの最近のデプロイを新しい順に表示します。状態(queued、building、ready、error)、環境、アドレス、ブランチ、コミット、失敗した理由が含まれます。削除したデプロイは含まれません(list_deleted_deployments で表示)。next_before があれば before に渡すと次のページを表示します。url はそのデプロイ固有の dpl- アドレス、production_url はプロダクションのアドレス、preview_url はそのブランチのプレビューのアドレスです。 preview_protection はプレビューのアドレスを誰が開けるかです(members: 組織のメンバーのみ、既定 / password / off: 誰でも)。プロダクションのアドレスは常に公開なので null ですが、保護がオンなら dpl- アドレスはプロダクションのビルドでも保護されます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments?limit=1&before=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments?limit=1&before=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/deployments/{id}
デプロイ1件とビルドログ デプロイ1件の状態、アドレス、ビルドログの末尾を表示します。ビルドが失敗した場合、理由はたいていログの最後の数行にあります。お客様が設定した環境変数の値は••••••で伏せられます。url はそのデプロイ固有の dpl- アドレス、production_url・preview_url はプロダクションやそのブランチのアドレスです。 preview_protection はプレビューのアドレスを誰が開けるかです(members: 組織のメンバーのみ、既定 / password / off: 誰でも)。プロダクションのアドレスは常に公開なので null です。wait(秒)を渡すとビルドが終わるまで待ちます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID?tail=1&wait=0" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployments/ID?tail=1&wait=0', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/branch-previews
ブランチプレビュー このプロジェクトの組織で、本番ブランチ以外へのプッシュでプレビューをビルドするかを表示します(branch_previews)。false なら本番ブランチ (通常は main) に入ったものだけをビルドします。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branch-previews" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branch-previews', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/branch-previews
ブランチプレビューの変更 組織全体で、ブランチへのプッシュごとにプレビューをビルドするかを決めます。false なら本番ブランチ (通常は main) に入ったものだけをビルドし、スキップしたプッシュはデプロイ履歴にスキップとして残ります。再デプロイ、直接アップロードしたデプロイ、デプロイフックは通常どおりビルドします。この組織のすべてのプロジェクトに適用されます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branch-previews" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branch-previews', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/preview-protection
プレビューの保護 プロダクション以外のデプロイ(ブランチのプレビュー、デプロイごとのアドレス)を誰が開けるかを表示します: off、members(組織のメンバーのみ)、password。保護するアドレス(scope)、サインインなしで通す IP(trusted_ips)、確認せずに通すパス(options_paths)、バイパスキー(bypass_secrets、値は末尾4文字のみ)、共有リンク(share_links)も返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/preview-protection" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/preview-protection', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/preview-protection
プレビューの保護の変更 プレビューを開ける人を変更します。membersはコンソールにログインした組織のメンバー、passwordは共有のパスワード1つ(初回は8文字以上のパスワードが必要)、offは誰でもです。プロダクションのアドレスと接続済みのドメインは常に公開です。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/preview-protection" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"mode":"off"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/preview-protection', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"mode": "off"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/apps
接続済みリポジトリとビルド設定 このプロジェクトにデプロイするリポジトリごとに、プロダクションブランチ、ビルドするフォルダー(root_directory)、フレームワークプリセット(framework。nullなら自動検出)と、ビルドコマンド・出力ディレクトリ・インストールコマンドの上書き(build_command、output_directory、install_command。nullならプリセットの既定値)を表示します。detected_frameworkは最新のビルドが使ったフレームワーク、frameworksは選べるプリセットの一覧です。リポジトリは最初のpushで表示されます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/apps" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/apps', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/apps/{name}
アプリの削除 プロジェクトのアプリ1つを削除します(モノレポでフォルダーをなくしたアプリ)。アドレスはすぐに応答しなくなり、進行中のビルドは取り消され、デプロイは復元できない形で削除され、ファイルは数分以内に消えます。リポジトリにフォルダーが残っていても、プッシュで再びビルドしません。元に戻せません。プロジェクトの既定のサイト、ドメインがつながったアプリ、ディスクのあるアプリは断り、先にすることを伝えます。ユーザーがはっきり求めたときだけ使い、confirmにアプリ名をそのまま入れてください。オーナーと管理者だけが実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/apps/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/apps/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/apps/{name}
ビルド設定の変更 リポジトリ1つのプロダクションブランチ、ビルドするフォルダー、フレームワークプリセット、ビルドコマンド・出力ディレクトリ・インストールコマンドを変更します。モノレポの場合は、アプリのフォルダー(例: apps/web)をroot_directoryに指定してください。指定しなかった値はそのまま残り、nullを指定すると自動検出(プリセットの既定値)に戻ります。コマンドに空文字列を指定すると、その手順を飛ばします。リポジトリのblackwall.jsonに同じ項目があれば、そちらが優先されます。次のデプロイから反映されます。ただしport(サーバーが待ち受けるポート)は1分以内にサーバーを再起動して反映します。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/apps/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"production_branch":"main","root_directory":".","run_as":"platform","port":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/apps/my-name', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"production_branch": "main",
"root_directory": ".",
"run_as": "platform",
"port": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/env
環境変数 デプロイしたアプリがビルドと実行時に受け取る環境変数です。同じ名前をプロダクションとプレビューで別々に持てます。機密の値は返さず、末尾4文字だけがvalue_hintとして返ります。readableがfalseの場合は値を開けずビルドからも除かれるため、もう一度保存してください。automaticは保存しなくても入る自動で入る変数です: SUPABASE_URL、NEXT_PUBLIC_SUPABASE_URL、SUPABASE_ANON_KEY、NEXT_PUBLIC_SUPABASE_ANON_KEY、NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY、SUPABASE_SERVICE_ROLE_KEY。Supabaseから移したアプリがすでに読んでいる名前です。available_inは入る場所です: 公開の値はビルドと実行時(build, runtime)、SUPABASE_SERVICE_ROLE_KEYは実行時のみ(runtime: サーバー・ミドルウェア・関数)で、ビルドには入りません。同じ名前で保存した変数が優先され、保存した値はビルドにも入ります(overridden_in)。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/env" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/env', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/env
環境変数の保存 環境変数を1つ以上保存します。variablesで1つずつ指定するか、dotenvに.envファイルの内容を丸ごと渡せます。同じ名前があれば上書きします。1つでも不正なものがあれば、何も保存しません。ただし dotenv のうちプラットフォームが設定する名前の行は飛ばし、skipped で知らせます。PORT、HOST、HOSTNAME、HOME とBLACKWALL_で始まる名前はプラットフォームが使うため設定できません。ビルドにはCI=1が入りますが、CIを自分で設定すると(CI=falseなど)その値を使います。変更した値は次のデプロイからビルドに使われます。sensitiveを指定しないと、シークレットらしい名前(API_KEY、STRIPE_SECRET、DATABASE_URLなど)は機密の値として保存し、再び読めなくなります(sensitive_keys)。プロダクションの値はオーナーと管理者のみ変更できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/env" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"targets":["production"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/env', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"targets": [
"production"
]
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/env/{target}/{key}
環境変数の削除 プロダクションかプレビューのどちらか一方から環境変数を1つ削除します。機密の値だった場合は復元できません。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/env/production/API_URL?app=owner%2Frepo&branch=main" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/env/production/API_URL?app=owner%2Frepo&branch=main', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/git
Git 接続 コンソールの「Git 接続」と同じです。このプロジェクトがデプロイするリポジトリ(connected: プッシュでデプロイするか)、接続した GitHub アカウント(github_accounts)、非公開リポジトリの取得方法(GitHubまたはGitLabトークンの末尾4文字、GitHub Appのインストール)を表示します。非公開リポジトリのビルドが取得の段階で失敗する場合は、まずここを見てください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/git/tokens/{provider}
リポジトリトークンの保存 非公開リポジトリの取得に使うアクセストークンを保存します(読み取り権限で十分です)。封印され、二度と表示されません。セルフホストのGitLabなら、gitlab_baseにhttps://gitlab.example.comを指定してください。次のビルドから使われます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/tokens/github" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"token":"ghp_xxxxxxxxxxxxxxxxxxxx"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/tokens/github', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"token": "ghp_xxxxxxxxxxxxxxxxxxxx"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/git/tokens/{provider}
リポジトリトークンの削除 保存したトークンを削除します。接続済みのGitHub Appのインストールは残ります。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/tokens/github" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/tokens/github', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/git/repos
リポジトリの追加 最初のpushの前に、リポジトリをこのプロジェクトに紐付けます。以後GitHub Appを通じたpushはこのプロジェクトに届き、create_deploy_hookでpushなしにビルドできます。repoはGitHubならowner/name、GitLabならgroup/nameです。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/repos" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"provider":"github","repo":"owner/repo"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/repos', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"provider": "github",
"repo": "owner/repo"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/git/github-app
GitHub アカウントの接続解除 このプロジェクトと GitHub アカウント(GitHub App のインストール)の接続を解除します。installation を指定するとそのアカウントだけ、空ならすべてです。保存したトークンと GitHub の App のインストールは残ります。接続には GitHub 上で人が承認する必要があるため、接続はコンソールでのみ行えます。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/github-app" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/github-app', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/git/github-app/{installation}
GitHub アカウントの接続解除 このプロジェクトと GitHub アカウント(GitHub App のインストール)の接続を解除します。installation を指定するとそのアカウントだけ、空ならすべてです。保存したトークンと GitHub の App のインストールは残ります。接続には GitHub 上で人が承認する必要があるため、接続はコンソールでのみ行えます。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/github-app/value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/github-app/value', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/git/importable
インポートするリポジトリを探す コンソールの Git 接続 → リポジトリのインポート一覧と同じです。接続した GitHub アカウントの GitHub App が見られるリポジトリを、最近プッシュした順に50個まで表示します。query を指定すると、300個を超えるインストールでもすべてから探します。GitHub でリポジトリを追加したばかりなら refresh: true。アカウントが複数あれば installation で選びます(list_git_access の github_accounts)。オーナーと管理者のみ見られます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/importable?query=value&installation=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/importable?query=value&installation=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/git/import
リポジトリのインポート コンソールの [接続してデプロイ] と同じです。GitHub App が見られるリポジトリをこのプロジェクトに接続し、プロダクションブランチの最新コミットで最初のデプロイをすぐ始めます。branch が空ならリポジトリの既定ブランチです。ビルド設定(framework など)と環境変数(dotenv に .env の内容)を最初のビルドの前に保存します。接続を解除したリポジトリをもう一度インポートすると、設定のまま接続し直します。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/import" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"repo":"owner/repo","branch":"main","root_directory":".","installation":1,"dotenv":"API_URL=https://example.com","sensitive":true,"app":"owner/repo"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/import', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"repo": "owner/repo",
"branch": "main",
"root_directory": ".",
"installation": 1,
"dotenv": "API_URL=https://example.com",
"sensitive": true,
"app": "owner/repo"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/git/checks/{repo}/{repo}
チェックを One Server で実行 接続した GitHub リポジトリの GitHub Actions のチェックを One Server のマシンで実行するかを切り替えます。コンソールの Git 接続 → [チェックを One Server で実行] と同じです。オンにするとリポジトリ変数 POOL_RUNNER を保存し、ジョブが runs-on: ${{ vars.POOL_RUNNER || 'ubuntu-latest' }} を使うと One Server で動きます。オフにすると変数を削除し、GitHub のマシンに戻ります。state が needs_permission なら、permission_url で GitHub App の新しい権限を承認すると自動でオンになります。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/checks/owner%2Frepo/owner%2Frepo" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/checks/owner%2Frepo/owner%2Frepo', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/git/repos/{name}
リポジトリの接続解除 コンソールの Git 接続 → リポジトリの [接続を解除] と同じです。このリポジトリにプッシュしてもデプロイしなくなります。公開中のデプロイ、履歴、ビルド設定、環境変数はそのままで、import_repository で同じリポジトリをインポートすると接続し直します。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/repos/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/git/repos/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/volumes
ボリューム一覧 アプリのボリューム(サーバーを再起動しても、新しくデプロイしても残るディスク)とバックアップ、プランが許す合計(max_gb)と今の使用量(used_gb)、アプリごとにサーバーが待ち受けるポート(apps[].listens_on)を返します。ボリュームは本番サーバーにだけ付きます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/volumes
ボリュームを作成 アプリの本番サーバーにボリュームを付けます。コンテナの mount_path に読み書きできる形で付き、容量が上限です。WordPress なら /var/www/html です。/etc・/usr・/proc・/tmp などのシステムパスには付けられません。1分以内に準備でき、サーバーが再起動します。オーナーと管理者だけが実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"app":"owner/repo","mount_path":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"app": "owner/repo",
"mount_path": "value"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/volumes/{id}
ボリュームを拡張 サーバーを止めずにボリュームを大きくします。小さくすることはできません。オーナーと管理者だけが実行できます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"size_gb":1}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"size_gb": 1
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/volumes/{id}
ボリュームを削除 ボリュームとその中のファイル、ボリュームのバックアップをすべて削除します。本番サーバーはボリュームなしで再起動します。元に戻せないので、ユーザーがはっきり求めたときだけ使い、confirm にボリュームのパス(mount_path)をそのまま入れてください。オーナーと管理者だけが実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/volumes/{id}/backups
ボリュームをバックアップ ボリュームのファイルを今まとめて 30 日間保管します。数分以内に終わり、list_volumes の backups に表示されます。オーナーと管理者だけが実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID/backups" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID/backups', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/volumes/{id}/restore
ボリュームを復元 ボリュームの今のファイルをバックアップのファイルに置き換えます。バックアップの後に変わったファイルはなくなりますが、置き換える前に今のファイルを 7 日間バックアップしておくので、そのバックアップで元に戻せます。ユーザーが求めたときだけ使ってください。オーナーと管理者だけが実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID/restore" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"backup_id":"BACKUP_ID"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/volumes/ID/restore', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"backup_id": "BACKUP_ID"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/server-memory
サーバーメモリ このプロジェクトのサーバーデプロイが使うメモリ(MB)と CPU 数、プランの上限、1GB・時間あたりの料金と、1か月動かし続けたときの金額です。本番とブランチのアドレスのサーバーはリクエストがなくても常に動いている(最小インスタンス 1)ため、その金額がサーバー 1 つの 1 か月の料金です。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server-memory" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server-memory', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/server-memory
サーバーメモリの変更 このプロジェクトのサーバーデプロイ(Node サーバー、ワーカー)が使うメモリを 512・1024・2048・4096MB から選びます。1024MB を超えると CPU は2つです。使った分は runtime_gb_hour で計量されます。1分以内に新しいサイズで再起動します。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server-memory" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"memory_mb":512}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server-memory', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"memory_mb": 512
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/gpu
GPU ジョブとサーバー このプロジェクトの GPU ジョブ(最新50件)、GPU サーバー、GPU ストレージ、マシンごとの1時間料金とストレージ1GB・月の料金、選べる地域とデータセンター、組織が同時に使える GPU の数と今使っている数を返します。無料プランでは GPU を使えません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/gpu/jobs
GPU ジョブを作る GPU を借りて、公開コンテナイメージでコマンドを最後まで実行します(学習、一括処理)。コマンドが終わるか max_minutes を過ぎると GPU を返し、使った秒数をマシンごとの時間料金で請求します。結果はプロジェクトのストレージなど外部に保存しないと残りません。イメージには開始と終了を知らせるため curl、wget、python3 のいずれかが必要です。イメージの取得も GPU の使用時間なので請求され、max_minutes にも含まれます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/jobs" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"gpu":"rtx4090","image":"value","command":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/jobs', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"gpu": "rtx4090",
"image": "value",
"command": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/gpu/jobs/{id}
GPU ジョブを見る GPU ジョブ1件の状態、使った時間と金額、終了コード、出力の最後の部分(最大64KB)を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/jobs/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/jobs/ID', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/gpu/jobs/{id}/cancel
GPU ジョブを止める GPU ジョブを止めます。開始前なら開始せず、実行中なら GPU を返します。返すまでの時間は請求されます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/jobs/ID/cancel" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/jobs/ID/cancel', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/gpu/servers
GPU サーバーを作る 公開イメージでモデルを動かしておく GPU サーバーを作ります。https://<ref>.<zone>/gpu/v1/servers/<name>/ を secret キーで呼ぶと、止まっていれば起動し(その間は503)、リクエストを渡します。idle_minutes の間リクエストがなければ止めます(0は動かし続けます)。起動を始めた時点から止まるまで、イメージの取得時間も含めて秒単位で請求します。サーバーには x-oneend-gpu-token ヘッダーと同じ値が ONEEND_GPU_TOKEN で渡ります。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/servers" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","gpu":"rtx4090","image":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/servers', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"gpu": "rtx4090",
"image": "value"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/gpu/servers/{name}/stop
GPU サーバーを止める GPU サーバーを今止めます。止まるまでの時間は請求します。次のリクエストでまた起動します。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/servers/my-name/stop" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/servers/my-name/stop', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/gpu/servers/{name}
GPU サーバーを削除する GPU サーバーを削除します。動いていれば先に止めてから削除します。元に戻せないので、confirm に GPU サーバー名をそのまま入れてください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/servers/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/servers/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/gpu/volumes
GPU ストレージを作る モデルとデータを残しておく GPU ストレージを1つのデータセンターに作ります。ジョブやサーバーに volume として名前を渡すと /workspace に付き、毎回ダウンロードし直さずに済みます。ストレージがある間は、使っても使わなくても1GB・月の料金で請求します。そのストレージを使うジョブとサーバーは、そのデータセンターでしか GPU を借りられません。無料プランでは使えません。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/volumes" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","datacenter":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/volumes', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"datacenter": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/gpu/volumes/{name}
GPU ストレージを削除する GPU ストレージとその中のファイルをすべて削除します。使っているジョブやサーバーがあれば削除しません。元に戻せません。削除するまでの保存料金は請求します。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/volumes/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/gpu/volumes/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/concurrent-builds
同時ビルド このプロジェクトのビルドを同時にいくつまで動かすかです。null ならビルダーが許すだけ動きます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/concurrent-builds" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/concurrent-builds', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/concurrent-builds
同時ビルドの変更 このプロジェクトのビルドを同時にいくつまで動かすかを 1〜20 で決めるか、null で上限をなくします。超えたビルドはキューで待ち、前のビルドが終わると始まります。待っているあいだはビルド時間が請求されません。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/concurrent-builds" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"concurrent_builds":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/concurrent-builds', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"concurrent_builds": "value"
}),
})
const result = await response.json()
関数
GET /api/v1/projects/{ref}/functions
関数 デプロイされた関数を、それぞれの呼び出しアドレスと公開かどうかとともに表示します。egressは外部リクエストがオンかどうか、outbound_requests_per_minuteは関数・pg_net・HTTPジョブが共有する1分あたりの外部リクエストの上限です(自分のAPIへの呼び出しは数えません)。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/functions/{name}
関数のコードを読む デプロイされた関数のコードとバージョンを表示します。変更する前に、今のコードを読んでください。deploy_function が status "building" で応答したときは、build.status(building・deployed・failed)と build.error で結果を確認します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/functions/{name}
関数のデプロイ 関数を1つデプロイします。同じ名前の関数があれば丸ごと置き換え、次の呼び出しから新しいコードが動きます。 コードはTypeScriptファイル1つで、export defaultで (request, { sql }) => 応答 をエクスポートします。 requestにはmethod、headers、claims(呼び出したキーのクレーム。roleはanon・authenticated・service_role。キーなしで呼んだ公開関数ではnull)、text()、json()があります。 sql(text, values)はこのプロジェクトのservice_role権限でSQL文を1つ実行し、行の配列を返します。 応答はオブジェクト(JSONとして送信)、文字列、または { status, headers, body } です。 npmパッケージを使うには、dependencies({"zod":"^3.23.8"})またはpackage_json(文字列)を一緒に送ってください。 デプロイ時にインストールし、コードと一緒に1つのESMファイルにまとめます(最大5MB、インストールスクリプトは実行しません、ネイティブモジュールは使えません)。一度インストールしたパッケージの組み合わせは再利用するので、2回目からのデプロイは数秒で終わります。 40秒以内に終わらないときは、すぐに status "building" で応答し、サーバーでデプロイを続けます。そのときは get_function をもう一度呼び、build.status が deployed か failed になるまで確認してください。 複数のファイルはfiles({"lib/util.ts": "..."})で一緒に送り、相対パスでimportします。フォルダーを丸ごと送るには、sourceを空にしてindex.tsを含むすべてをfilesに入れます。 Supabaseと同じように、deno.json(またはimport_map.json)のimportsとnpm:・jsr:・URLのimport(例: npm:zod@3、jsr:@supabase/supabase-js@2、https://esm.sh/…、https://deno.land/[email protected]/http/server.ts)を使えます。npm:・jsr:・esm.shはデプロイ時にnpmパッケージとしてインストールし、それ以外のURLはデプロイ時に一度だけ取得してコードと一緒にまとめます(取得したアドレスとSHA-256はget_functionのremote_importsにあり、deno.lockがあればそのハッシュと一致する必要があります)。実行中には何も取得しません。 Supabaseのsupabase/functions/<名前>/フォルダーのように../_shared/cors.tsをimportするときは、filesに"../_shared/cors.ts"として一緒に入れてください。関数フォルダーの隣のフォルダーまでです。 1回の呼び出しは150秒まで実行できます(Supabaseと同じ)。変えるにはset_function_limitsを使ってください。 呼び出した人のAuthorizationヘッダー(このプロジェクトのキーの場合)がそのまま関数に届くので、createClient(url, anonKey, { global: { headers: { Authorization: req.headers.get('Authorization') } } })がその人として動作します。 バンドルされた関数を変更するときは、get_functionが返したpackage_jsonとfilesをそのまま送り直してください。省くとファイル1つだけの関数になります。 ネットワークは既定で無効で、set_function_egressで有効にできます。 プロダクションの環境変数がprocess.envに入ります。関数のデプロイはオーナーと管理者のみ行えます。 呼び出せる人: 非公開(既定)の関数には、このプロジェクトのキーが必要です: 公開キー(claims.role anon)、ログインしたユーザーのトークン(authenticated)、シークレットキー(service_role)。Supabaseのverify_jwtと同じなので、supabase.functions.invokeと公開キーを付けたfetchはそのまま動きます。ログインしたユーザーだけを受け付けるには、関数の中でrequest.claims.roleを確認してください。 publicをtrueにすると、キーなしでも誰でも呼び出せます。決済事業者のWebhookのように、キーなしで届くリクエストにだけ使ってください。 呼び出し: POST https://<ref>.<zone>/functions/v1/<name>、ヘッダーAuthorization: Bearer <公開キー、ユーザートークンまたはシークレットキー>。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"source":"export default async () => new Response(\"ok\")","public":true,"package_json":"value","package_lock":"value","dependencies":{},"files":{},"entry":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"source": "export default async () => new Response(\"ok\")",
"public": true,
"package_json": "value",
"package_lock": "value",
"dependencies": {},
"files": {},
"entry": "value"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/functions/{name}
関数の時間制限 再デプロイせずに、関数の 1 回の呼び出しにかけられる時間(timeout_seconds)と SQL 1 文にかけられる時間(sql_timeout_seconds)を秒で設定します。既定は 150 秒(Supabase のエッジ関数と同じ)と 8 秒で、このサーバーの最大は get_function の timeout_cap_seconds です。null で既定値に戻り、省略すると今の値のままです。次の呼び出しから適用されます。制限を超えた呼び出しは 504 で打ち切られます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"public":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"public": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/functions/{name}
関数の削除 関数を削除します。そのアドレスは404を返し、その関数を呼び出す予約ジョブは失敗します。元に戻せないので、ユーザーがはっきり求めたときだけ使い、confirm に関数名をそのまま入れてください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/functions/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/function-egress
関数の外部リクエスト 関数がfetch()で公開されたHTTPSアドレスを呼び出すことを許可またはブロックします。今の状態はlist_functionsのegressです。30秒以内に反映されます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-egress" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-egress', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/function-secrets
関数シークレットの一覧 関数だけが見るシークレットの名前と変更日時です。値はどのツールでも読み返せません。readable が false の値は開けないため関数に入りません。もう一度保存してください。表示できるのはオーナーと管理者のみです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/function-secrets
関数シークレットの保存 関数だけが見るシークレットを1つ以上保存します(Webhook の署名キー、メールサービスの API キーなど)。サイトのビルドには入らず、同じ名前の環境変数より優先されます。関数は次の呼び出しから process.env で読みます。同じ名前があれば上書きし、1つでも誤りがあれば何も保存しません。保存した値は読み返せず、応答には名前だけが返ります。SUPABASE_ と BLACKWALL で始まる名前、NODE_ENV・HOME・PATH・NODE_OPTIONS・TZ は使えません。1プロジェクト100個、値1つ32KBまでです。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"secrets":{},"dotenv":"API_URL=https://example.com"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"secrets": {},
"dotenv": "API_URL=https://example.com"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/function-secrets/copy
関数シークレットのコピー 自分の別のプロジェクト(from)にある関数シークレットを、名前を指定してこのプロジェクト(ref)にコピーします。値はサーバーの中だけで移り、応答には名前だけが返るので、同じキーを貼り直す必要はありません。このプロジェクトにすでにある名前はスキップし(skipped)、overwrite が true なら置き換えます。from にない名前は missing で知らせ、残りはコピーします。一度に50個までです。両方のプロジェクトでオーナーか管理者である必要があります(組織が違っても構いません)。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets/copy" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"from":"value","names":["my-name"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets/copy', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"from": "value",
"names": [
"my-name"
]
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/function-secrets/{name}
関数シークレットの削除 関数シークレットを1つ削除します。値は元に戻せず、関数は次の呼び出しからこの値なしで動きます。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/function-secrets/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
ドメインとエッジ
GET /api/v1/projects/{ref}/domains
ドメイン このプロジェクトに接続したドメインを表示します。それぞれの用途(site/api)、追従するブランチ、リダイレクト先、検証状態(未検証なら追加すべきTXTレコード)、証明書の状態が含まれます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/domains
ドメインの接続 ドメインを接続します。返されたverification_record(TXT)をDNSに追加すると、数分以内に検証されます。target=apiにすると、そのアドレスはプロジェクトAPI(データ、ログイン、ストレージ)として応答します。branchを指定すると、そのブランチのプレビューに追従します。*.example.comのようなワイルドカードも使えます。pair_www=trueにするとwwwのアドレスも接続し、一方をもう一方へリダイレクトします。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"hostname":"app.example.com"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"hostname": "app.example.com"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/domains/{hostname}
ドメインの接続解除 ドメインの接続を解除します。そのアドレスは数秒以内に応答しなくなります。ユーザーがはっきり求めたときだけ使い、confirm にドメインをそのまま入れてください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/domains/{hostname}/redirect
ドメインのリダイレクト このドメインを同じプロジェクトの別のドメインへリダイレクトさせます。toを空にすると、再びサイトを配信します。toにパスを付けると(example.com/vision)、アクセスしたパスがその後ろに付き、クエリ文字列もそのまま引き継がれます: vision.example.com/x?y=1 → example.com/vision/x?y=1、トップページは example.com/vision。toのドメインは、このプロジェクトに接続した、リダイレクトではないドメインである必要があります。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com/redirect" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"to":"https://example.com","status":308}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com/redirect', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"to": "https://example.com",
"status": 308
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/edge
ファイアウォールとキャッシュ このプロジェクトのIP拒否リストと許可リスト、1つのアドレスからの1分あたりのリクエスト上限、その適用対象、最後にキャッシュを消去した時刻を表示します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/edge
ファイアウォールの変更 IP拒否リスト、許可リスト(空なら全員を許可)、1分あたりのリクエスト上限(10〜100000、nullならプラットフォームの既定値)、適用対象(all/site/api)を変更します。指定した項目だけが変わります。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"deny":["value"],"allow":["value"],"rate_per_minute":1,"scope":"all"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"deny": [
"value"
],
"allow": [
"value"
],
"rate_per_minute": 1,
"scope": "all"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/edge/purge
キャッシュの消去 サーバーデプロイがs-maxageで共有を許可したためにエッジに保存されている応答をすべて破棄します。次のリクエストから、デプロイが再び応答します。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge/purge" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge/purge', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/domains/{hostname}/certificate
証明書のアップロード 接続済みのドメインに独自のTLS証明書を使います。certificateはPEMのチェーン(サーバー証明書が先頭)、keyはPEMの秘密鍵です。ドメイン名が証明書に含まれている必要があります。1分以内に反映されます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com/certificate" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"certificate":"-----BEGIN CERTIFICATE-----\n…","key":"API_URL"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com/certificate', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"certificate": "-----BEGIN CERTIFICATE-----\n…",
"key": "API_URL"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/domains/{hostname}/certificate
アップロードした証明書の削除 アップロードした証明書を削除し、自動発行の証明書に戻します。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com/certificate" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/domains/app.example.com/certificate', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
ネットワーク
GET /api/v1/projects/{ref}/network
ネットワークアドレス プロジェクトがリクエストを受けるアドレス(inbound、カスタムドメインのAレコード)と、固定アウトバウンドIPをオンにしたプロジェクトなら外部へ送信する固定アドレス(outbound.addresses)を返します。オンにしていないプロジェクトの送信アドレスは固定されていない共有アドレスのため返しません。許可リストには追加しないでください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/network/ips
ネットワークアドレス プロジェクトがリクエストを受けるアドレス(inbound、カスタムドメインのAレコード)と、固定アウトバウンドIPをオンにしたプロジェクトなら外部へ送信する固定アドレス(outbound.addresses)を返します。オンにしていないプロジェクトの送信アドレスは固定されていない共有アドレスのため返しません。許可リストには追加しないでください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network/ips" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network/ips', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/network/static-outbound-ip
固定アウトバウンドIP 有料オプションの固定アウトバウンドIPをオンまたはオフにします。オンにすると、サーバーデプロイ、関数のfetch()、データベースWebhookが固定アドレスから送信され、月額料金が利用期間に応じて請求されます。Pro以上のプランで、オーナー・管理者・請求担当者だけが実行できます。料金がかかるため、ユーザーがはっきり求めたときだけ使ってください。料金と今の状態はget_networkにあります。アドレスがまだないリージョンでは outcome が provisioning になります。アドレスを作成中(通常1時間以内)で、準備ができるまで料金は発生せず、アドレスも返されません。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network/static-outbound-ip" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network/static-outbound-ip', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/network/static-outbound-ip
固定アウトバウンドIP 有料オプションの固定アウトバウンドIPをオンまたはオフにします。オンにすると、サーバーデプロイ、関数のfetch()、データベースWebhookが固定アドレスから送信され、月額料金が利用期間に応じて請求されます。Pro以上のプランで、オーナー・管理者・請求担当者だけが実行できます。料金がかかるため、ユーザーがはっきり求めたときだけ使ってください。料金と今の状態はget_networkにあります。アドレスがまだないリージョンでは outcome が provisioning になります。アドレスを作成中(通常1時間以内)で、準備ができるまで料金は発生せず、アドレスも返されません。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network/static-outbound-ip" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network/static-outbound-ip', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
スケジュールジョブ
GET /api/v1/projects/{ref}/jobs
予約ジョブ 予約ジョブ(cron)を、スケジュール、次回の実行、前回の結果とともに表示します。プロジェクトのSQLでcron.scheduleにより作ったジョブはsourceがsqlです。limitはプランのジョブ数の上限です。時刻はすべてUTCです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/jobs/{job}
予約ジョブの作成・変更 スケジュールに従って関数を呼び出すか、SQL文を1つ実行します。同じ名前のジョブがあれば変更します。 scheduleはUTCの5フィールドcron(分 時 日 月 曜日)です。韓国と日本はUTC+9なので、現地時間の0時は "0 15 * * *" です。 kindがfunctionならtargetはデプロイ済みの関数名(本文が{}のPOSTで呼び出します)、sqlならtargetはservice roleで実行するSQLです。 外部URLは呼び出せません。関数を作成するか、SQLでnet.http_postを使ってください。SQLはtimeout_seconds(既定120秒)以内に終わる必要があり、SQLが自分でstatement_timeoutを延ばすとその分待ちます。どちらでもプランの最大(Free 300秒、Pro・Enterprise 3600秒)までです。 SQLのcron.scheduleで作ったジョブもsource=sqlとして一覧に出ます。SQL(cron.alter_job、cron.unschedule)またはset_job_enabled・remove_jobで変更します。 プランごとにプロジェクトあたりのジョブ数の上限があります(list_jobsのlimit)。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"schedule":"0 3 * * *","kind":"function","target":"hello"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"schedule": "0 3 * * *",
"kind": "function",
"target": "hello"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/jobs/{job}
予約ジョブのオン・オフ 予約ジョブをオフにする、またはオンに戻します。オンに戻しても、逃した実行を取り戻すことはなく、次の予定時刻から実行します。jobはidまたは名前です。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/jobs/{job}/run
予約ジョブを今すぐ実行 スケジュールを待たずに、1分以内にジョブを1回実行します。結果はlist_job_runsで確認してください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly/run" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly/run', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/jobs/{job}/runs
予約ジョブの実行履歴 ジョブの最近の実行と結果を新しい順に表示します。失敗した場合はエラーも含みます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly/runs?limit=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly/runs?limit=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/jobs/{job}
予約ジョブの削除 予約ジョブとその実行履歴を削除します。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/jobs/nightly', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
データベース Webhook
GET /api/v1/projects/{ref}/webhooks
データベースWebhook テーブルの変更を知らせるWebhookと、最近の送信を表示します。attachedがfalseの場合は、テーブルが削除されてWebhookが止まったことを意味します。署名キー(signing_secret)は作成時(create_db_webhook)に一度だけ表示します。一覧にはsigning_secret_setと末尾4文字(signing_secret_last4)だけを載せます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/webhooks
データベースWebhookの作成 テーブルに行が追加、変更、削除されたときにPOSTを送ります。コミットされた変更だけを、数秒以内に送ります。 kindがurlならtargetは公開されたhttpsアドレス(プライベートアドレスや内部アドレスは不可、リダイレクトは追いません)、functionならこのプロジェクトの関数名です。 本文: { type: "INSERT"|"UPDATE"|"DELETE", table, schema: "public", record, old_record, hook, delivery, occurred_at }。 ヘッダーx-blackwall-signature: t=<秒>,v1=<HMAC-SHA256(signing_secret, "<t>.<body>")の16進数> で検証してください。 signing_secretはこの応答にだけ含まれ、あとから読み直せないので、受信側にすぐ保存してください。 失敗した場合(2xx以外の応答、または10秒超過)は、10秒、1分、5分、30分後に再送し、5回目で諦めます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","table":"notes","events":["insert"],"kind":"url","target":"hello"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"table": "notes",
"events": [
"insert"
],
"kind": "url",
"target": "hello"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/webhooks/{webhook}
データベースWebhookのオン・オフ Webhookをオフまたはオンにします。オフの間に起きた変更は送られません。webhookはidまたは名前です。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks/orders" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks/orders', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/webhooks/{webhook}
データベースWebhookの削除 Webhookと、その送信履歴、まだ送っていない変更を削除します。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks/orders" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks/orders', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/webhooks/{webhook}/deliveries
データベースWebhookの送信履歴 Webhookの最近の送信を、応答ステータスと失敗の理由とともに新しい順に表示します。7日間保存されます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks/orders/deliveries?limit=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/webhooks/orders/deliveries?limit=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
バックアップと復元
GET /api/v1/projects/{ref}/backups
バックアップ プロジェクトのバックアップ(毎晩プロジェクトのリージョンの現地時刻03:00〜05:00の自動、手動、復元の直前に作成されたもの)と復元の履歴を表示します。retention_daysは保存期間です。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/backups
今すぐバックアップ テーブル、ユーザー、ファイルを今バックアップします。大きな変更(マイグレーション、大量の削除)の前に作成してください。7日間保存されます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/backups/{backup_id}/restore
バックアップの復元 プロジェクトのテーブル、ユーザー、ファイルをバックアップを作成した時点に戻します。backup_idの代わりにat(ISO形式の時刻)を指定すると、その時点に秒単位で戻します(Pro以上、list_backupsのpoint_in_timeの範囲内)。この場合ファイルは、ファイルバケットを使うサーバーでだけその時点の行が指すもの(過去14日以内に削除したものも含みます)に戻し、それ以外では今のままにします。その時点以降の変更はすべて失われるため、ユーザーがはっきり求めたときだけ使ってください。復元の直前の状態を先にバックアップするので、undo_backup_idで再び戻せます。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups/BACKUP_ID/restore" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups/BACKUP_ID/restore', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/backups/restore-to-time
バックアップの復元 プロジェクトのテーブル、ユーザー、ファイルをバックアップを作成した時点に戻します。backup_idの代わりにat(ISO形式の時刻)を指定すると、その時点に秒単位で戻します(Pro以上、list_backupsのpoint_in_timeの範囲内)。この場合ファイルは、ファイルバケットを使うサーバーでだけその時点の行が指すもの(過去14日以内に削除したものも含みます)に戻し、それ以外では今のままにします。その時点以降の変更はすべて失われるため、ユーザーがはっきり求めたときだけ使ってください。復元の直前の状態を先にバックアップするので、undo_backup_idで再び戻せます。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups/restore-to-time" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"at":"2026-10-01T14:59:00+09:00"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/backups/restore-to-time', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"at": "2026-10-01T14:59:00+09:00"
}),
})
const result = await response.json()
ログと監視
GET /api/v1/projects/{ref}/logs
ログ プロジェクトで起きたことを新しい順に表示します。サイト、API、ログイン、関数へのリクエスト(メソッド、パス、ステータス、所要時間)と、デプロイしたサーバーや関数が出力した行です。アプリが500を返す場合は、まずlevelをerrorにしてここを見てください。次のページは、応答のnext_beforeをbeforeに渡します。クエリ文字列は保存しません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/logs?source=site&level=warn" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/logs?source=site&level=warn', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/log-drains
ログドレイン ログの送信先(httpsまたはdatadog)、送るソース、最後の送信とエラーです。署名キー(signing_secret)は作成時(create_log_drain)に一度だけ表示します。一覧にはsigning_secret_setと、オーナーと管理者には末尾4文字(signing_secret_last4)だけを載せます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/log-drains
ログドレインの追加 このプロジェクトのログを外部へ送ります。作成した後に書き込まれたログから送ります。kind=httpsは署名付きのJSONをPOSTし、kind=datadogはsecretにAPIキーが必要です。httpsドレインのsigning_secretはこの応答にだけ含まれるので、受信側にすぐ保存してください。プロジェクトごとに5個までです。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","kind":"https","url":"https://example.com/hook"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"kind": "https",
"url": "https://example.com/hook"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/log-drains/{id}
ログドレインのオン・オフ 設定を残したまま、送信を止めるか再開します。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains/ID', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/log-drains/{id}
ログドレインの削除 ログドレインを削除します。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/log-drains/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/metrics
メトリクス リクエスト数、失敗数、レイテンシ(p50/p95/p99)を対象別と時間別に、データベースのサイズ、接続数、キャッシュヒット率とともに返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/metrics?range=1h" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/metrics?range=1h', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/audit
監査ログ tab=activityは組織で誰が何を変更したか、tab=accessは誰が個人情報にアクセスしたかです。新しい順に一度に最大200件まで返り、has_moreがtrueならoffsetを増やして再度呼び出してください。fromとtoはYYYY-MM-DD(韓国時間の日付)です。この操作はオーナーと管理者のみ行えます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/audit?tab=activity&from=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/audit?tab=activity&from=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
チームと通知
GET /api/v1/projects/{ref}/team
チームメンバー このプロジェクトを所有する組織のメンバーを、役割、2段階認証を使っているかどうか、まだ承諾されていない招待とともに返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/team/invitations
メンバーの招待 招待リンクをメールで送ります。リンクを開くと参加するため、すぐに追加される人はいません。すでにメンバーのアドレスなら、役割だけを変更します。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/invitations" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"email":"[email protected]"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/invitations', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"email": "[email protected]"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/team/invitations/{id}
招待の取り消し 送った招待を取り消します。そのリンクはすぐに開けなくなります。idはlist_teamのinvitationsにあります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/invitations/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/invitations/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/team/members/{email}
メンバーの役割の変更 すでにメンバーである人の役割を変更します。オーナーの役割は変更できません。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/members/person%40example.com" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"role":"admin"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/members/person%40example.com', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"role": "admin"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/team/members/{email}
メンバーの削除 組織から人を外します。オーナーは外せません。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/members/person%40example.com" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/members/person%40example.com', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/team/mfa
2段階認証の必須化 組織のすべてのメンバーに2段階認証を必須にする、または必須をやめます。オンにするには、このトークンの所有者が先に2段階認証をオンにしている必要があります。2段階認証がないメンバーは、オンにするまでこの組織を開けず、応答のwithout_mfaに表示されます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/mfa" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"required":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/team/mfa', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"required": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/channels
通知チャンネル デプロイ、ドメイン、使用量、請求のお知らせを受け取るSlack、KakaoWork、Webhookのチャンネルを、最後の送信結果とともに返します。組織全体の設定です。Webhookチャンネルの署名キー(signing_secret)は作成時(create_channel)に一度だけ表示します。一覧にはsigning_secret_setと末尾4文字(signing_secret_last4)だけを載せます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/channels
通知チャンネルの追加 Slack(Incoming Webhookのアドレス)、KakaoWork(ボットのWebhookアドレス)、署名付きWebhook、またはメール(emailsに1〜10件のアドレス)に通知を送ります。メールチャンネルはアドレスごとに確認リンクを送り、リンクを開いたアドレスにだけ通知を送ります。noticesを空にするとすべての種類を受け取ります(usageには使用量の上限警告とトラフィック急増の通知が含まれます)。Webhookチャンネルのsigning_secretはこの応答にだけ含まれるので、受信側にすぐ保存してください。作成後にtest_channelで確認してください。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"kind":"slack","name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"kind": "slack",
"name": "my-name"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/channels/{id}/test
通知チャンネルのテスト そのチャンネル1つにだけテストメッセージを送ります。メールチャンネルでは確認済みのアドレスにだけ送り、確認待ちのアドレスには確認メールを再送します。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels/ID/test" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels/ID/test', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/channels/{id}
通知チャンネルのオン・オフ 設定を残したまま、通知を止めるか再開します。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels/ID', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/channels/{id}
通知チャンネルの削除 通知チャンネルを削除します。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/channels/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
料金と使用量
GET /api/v1/projects/{ref}/usage
使用量 テーブル、行、ユーザー、ファイルの数、使用しているストレージ容量、今月の計量値、1分あたりの上限(limits.outbound_requests_per_minute: 関数・pg_net・HTTPジョブが共有する外部リクエスト。自分のAPIへの呼び出しは数えません)を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/usage" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/usage', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/billing/plan
料金プラン 組織の今の料金プラン、予約された変更、選べるプランと月額料金、組織で有効な有料オプション(addons)です。無料プランなら free にその制限(1 人、独自ドメインなし、1 日のデプロイ回数、3 日間未使用で一時停止、ビルド時間と転送量)と Pro だけの機能があります。オプションはそれぞれのツール(set_static_outbound_ip)でオン・オフします。プランの変更は支払いが必要なので、コンソールの請求画面でのみ行えます。オーナー、管理者、請求担当のメンバーだけが見られます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/plan" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/plan', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/billing/spend
支出の上限 支出キャップ(オンにすると無料枠を超える使用を止め、超過料金を請求しません)、月の超過料金の上限と通知Webhook、今月の使用量を表示します。オーナー、管理者、請求担当のメンバーだけが見られます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/spend" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/spend', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/billing/spend-cap
支出キャップのオンとオフ 有料プランの支出キャップをオンまたはオフにします。オンなら無料枠で止まり、超過料金はありません(コンソールの支出上限の「含まれる量まで」)。オフなら超えた分が請求されるため、オフにするときは confirm にプロジェクト名(list_projectsのname)をそのまま入れてください。オーナー、管理者、請求担当のメンバーだけが行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/spend-cap" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/spend-cap', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/billing/spend-limit
月の支出上限 1か月の超過料金の上限(通貨の最小単位、ウォン)と、上限に近づいたときに通知するWebhookアドレスを決めます。支出キャップがオフのとき、コンソールの支出上限の「決めた金額まで許可」(nullなら「無制限」)と同じです。spend_limit_minorをnullにすると上限をなくします。webhook_urlを省くと今のアドレスのままです。新しい通知先は通知チャネル(create_channel)で受け取ることをおすすめします。オーナー、管理者、請求担当のメンバーだけが行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/spend-limit" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"spend_limit_minor":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing/spend-limit', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"spend_limit_minor": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/billing
請求と使用量 1か月分の請求(項目ごとの使用量、無料枠、料金)と日別の使用量です。periodが空なら今月(UTC)です。金額は currency の最小単位です(KRW はウォン、USD はセント)。included は今月実際に使ったプランの無料枠(変更日までの日数で按分)、list_included は Pro の無料枠です。amount_minor・total_minor は請求される金額、list_amount_minor・list_total_minor は定価です。billing_exempt が true の組織(運営会社自身のアカウント)は請求額が0で、支払いを理由に止まりません。定価は Pro プランの料金表によるものです。カードとお支払い履歴はコンソールでのみ確認できます。オーナー、管理者、請求担当のメンバーだけが見られます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing?period=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/billing?period=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
その他
GET /api/v1/projects/{ref}/transfer
移管できる組織 このプロジェクトを移管できる別の組織(自分がオーナーか管理者の組織)の id、名前、プランです。can_transfer は、現在の組織のオーナーとして移管できるかどうかです。transfer_project の organisation に id を入れてください。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/transfer" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/transfer', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/transfer
プロジェクトの移管 プロジェクトを別の組織へ移します。現在の組織のオーナーであり、受け取る組織のオーナーか管理者である必要があり、受け取る組織のプランにプロジェクトの空きが必要です。移管後の使用量は受け取る組織に請求され、今月の請求は移管した時点で分かれます。元の組織のメンバーに個別に与えたアクセスはなくなり、戻すには受け取る組織のオーナーがもう一度移管する必要があります。アドレス、キー、データ、デプロイはそのままです。ユーザーがはっきり求めたときだけ使い、confirm にプロジェクト名をそのまま入れてください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/transfer" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"organisation":"My team","confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/transfer', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"organisation": "My team",
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/server
専用サーバー プロジェクトの専用サーバーを表示します: サイズ(tier)、場所、状態、アドレス、月額、待機サーバー、自動切り替え、復元できる期間、次に移動できる日、進行中の作業(jobs)。server が null なら共用サーバーを使っています。offered が false ならまだ提供していません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/server
専用サーバーを借りる このプロジェクトだけが使うサーバーを借ります。サイズと場所ごとの月額は先に list_server_sizes で見せ、ユーザーが選んだものだけを渡してください。通常 10 分以内に準備でき、データベースとアプリを移してからアドレスを切り替えます。Pro プランから。オーナーと管理者だけが実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"tier":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"tier": "value"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/server
サーバーサイズを変更 専用サーバーのサイズを変更します。when=now は今すぐ、tonight はサーバーの場所の時刻で 3〜5 時。待機サーバーがなければ 3〜5 分応答せず、あれば切り替えの数秒だけ止まります。サイズ変更は無料で、月額は新しいサイズの価格です(list_server_sizes)。オーナーと管理者だけが実行できます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"tier":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"tier": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/server
専用サーバーを返却 専用サーバーを返却します: 最後のバックアップを取り、データベースとアプリを共用サーバーに移してから、サーバー(と待機サーバー)を削除します。移動中は書き込みが止まります。ユーザーが求めたときだけ使い、confirm に ref をそのまま入れてください。オーナーと管理者だけが実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/server/standby
待機サーバー 同じ場所・同じサイズの待機サーバーをオンまたはオフにします。データベースを継続的に複製し、月額はそのサイズと同じです(list_server_sizes)。auto_failover=true なら、主サーバーが 60 秒応答しないとき自動で待機サーバーに切り替えます(待機サーバーが必要)。オーナーと管理者だけが実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server/standby" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"standby":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server/standby', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"standby": true
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/server/move
サーバーの場所を移動 専用サーバーを別の場所に移します。無料で月に 1 回です(next_move_at)。新しい場所にサーバーを作って複製し、アドレスを切り替える瞬間に書き込みが数秒止まります。古いサーバーは 7 日間残します。月額は新しい場所の価格です(list_server_sizes)。オーナーと管理者だけが実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server/move" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"region":"kr"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server/move', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"region": "kr"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/server/restore-days
復元できる期間 特定の時刻に戻せる期間を 7 日または 28 日にします。28 日は専用サーバーでのみ使え、月額の追加料金があります(get_server の options、get_billing)。オーナーと管理者だけが実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server/restore-days" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"days":7}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/server/restore-days', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"days": 7
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/s3-keys
S3 アクセスキー一覧 S3 エンドポイント(endpoint、region、force_path_style)と TUS による再開可能なアップロードのアドレス、そして各 S3 アクセスキーの名前、アクセスキー ID、最終使用日時、失効状態です。シークレットアクセスキーは返しません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/s3-keys" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/s3-keys', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/s3-keys
S3 アクセスキーを作成 AWS SDK、aws CLI、rclone が /storage/v1/s3 へのリクエストに署名するアクセスキー ID とシークレットアクセスキーを作成します。サービスロールとして動き、アクセスルールを無視するので、サーバーにだけ置いてください。シークレットアクセスキーはこの応答にしかなく、二度と見られません。作成できるのはオーナーと管理者だけで、プロジェクトごとに 20 個までです。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/s3-keys" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/s3-keys', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/s3-keys/{id}
S3 アクセスキーを失効 S3 アクセスキーを 1 つ失効させます。30 秒以内に、そのキーで署名したリクエストは拒否されます。他のキーには影響しません。元に戻せません。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/s3-keys/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/s3-keys/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/storage/policies
ファイルのアクセスルールの作成 ファイルテーブル(objects)にアクセスルールを 1 つ追加します。name、command(select・insert・update・delete・all)、roles、using、check を受け取ります。プロジェクトのログインはファイルテーブルの所有者ではないため SQL ではルールを作れません。このルートを使います。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/storage/policies" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/storage/policies', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/storage/copy-from-import
取り込み元からファイルをコピー import_sources で接続した Supabase アカウントで、そのプロジェクトのバケットとファイルをこのサーバーのプロジェクト(ref)にコピーします。ここにないバケットは Supabase と同じ公開設定・サイズ上限・形式で作り、ファイルは upload_object と同じストレージに同じ上限で入れます。ここに同じサイズのファイルがあれば飛ばすので、呼び直しても大丈夫です。1 回でファイル 200 個(max_files)、45 秒までコピーし、残りがあれば答えの next を渡して done が true になるまで呼び直します。答えはバケットごとの created、copied、skipped、failed、bytes と、失敗したファイルの一部です。Supabase のキーは会話に出ません。バケットのアクセスルールはコピーしません。dry_run なら何も変えずに数だけ表示します。オーナー・管理者・開発者のみ実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/storage/copy-from-import" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"buckets":["value"],"rename":{},"dry_run":true,"max_files":1}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/storage/copy-from-import', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"buckets": [
"value"
],
"rename": {},
"dry_run": true,
"max_files": 1
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/deployment-retention
デプロイの保存期間 キャンセル・失敗・プレビュー・本番のデプロイを何日残すかを返します。いま適用される日数(days)、プロジェクトが決めた値(project_days、null ならプランに従う)、プランの既定値(plan_days)。期間にかかわらず残すデプロイ(always_kept)と、削除したデプロイを復元できる日数(restore_days)もあります。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployment-retention" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployment-retention', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/deployment-retention
デプロイの保存期間を変更 デプロイの種類ごとの保存期間を変えます。期間を過ぎたデプロイは削除され、3日間は restore_deployment で復元できます。直近のデプロイと配信中のデプロイは期間にかかわらず残ります。プロジェクト管理者だけが実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployment-retention" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"canceled_days":"value","error_days":"value","preview_days":"value","production_days":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/deployment-retention', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"canceled_days": "value",
"error_days": "value",
"preview_days": "value",
"production_days": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/schemas
プロジェクトのスキーマ public以外にプロジェクトがSQLで作ったスキーマ(create schema blackquant)と、それぞれをデータAPIが公開しているか(exposed)を表示します。データベース内の名前はapp_<ref>_名前ですが、SQLとクライアントでは作った名前をそのまま使います。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/schemas" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/schemas', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/schemas/exposed
公開スキーマの設定 データAPI(/rest/v1)がpublic以外に応答するスキーマの一覧を丸ごと設定します(SupabaseのExposed schemas)。公開したスキーマはAccept-Profile・Content-Profileヘッダー、supabase-jsのdb: { schema }または.schema()で使います。アクセスルール(RLS)とanon・authenticated・service_roleの権限はpublicと同じく適用されます。空の一覧ならpublicのみ公開します。30秒以内に反映されます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/schemas/exposed" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"exposed":["value"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/schemas/exposed', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"exposed": [
"value"
]
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/data-api
データAPIの設定を見る データAPI(/rest/v1)がオンか、1回に返す最大行数(max_rows、nullなら上限なし)、公開スキーマ、検索パス(search_path)を見ます。search_path_choicesは検索パスに入れられるスキーマです:public、プロジェクトがcreate schemaで作ったスキーマ、extensions。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/data-api" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/data-api', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/data-api
データAPIの設定を変える データAPI(/rest/v1)をオンまたはオフにし、最大行数と検索パスを設定します。指定したものだけを変えます。検索パスに入れたスキーマは要求したスキーマの後ろに付き、関数やビューがスキーマ名なしでその中のテーブルと関数を見つけます。30秒以内に反映されます。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/data-api" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true,"max_rows":1,"search_path":["value"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/data-api', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true,
"max_rows": 1,
"search_path": [
"value"
]
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/{param0}/{param1}
SAML SSOの追加 IdPのメタデータ(httpsのURLかXML)からSAML IdPを登録します。メタデータにはHTTP-Redirectのログインアドレスと署名証明書が必要です。domainsのメールドメインでsignInWithSSOを呼ぶと、このIdPに進みます。1つのドメインは1つのIdPにだけ設定できます。新しいIdPはエンタープライズプランでのみ追加できます(list_sso_providersのnew_providers_allowed)。登録済みのIdPはプランに関係なくそのまま動作します。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/value/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"metadata_url":"value","metadata_xml":"value","domains":["value"],"attribute_mapping":{}}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/value/value', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"metadata_url": "value",
"metadata_xml": "value",
"domains": [
"value"
],
"attribute_mapping": {}
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/{param0}/{param1}/{param2}
SAML SSOの追加 IdPのメタデータ(httpsのURLかXML)からSAML IdPを登録します。メタデータにはHTTP-Redirectのログインアドレスと署名証明書が必要です。domainsのメールドメインでsignInWithSSOを呼ぶと、このIdPに進みます。1つのドメインは1つのIdPにだけ設定できます。新しいIdPはエンタープライズプランでのみ追加できます(list_sso_providersのnew_providers_allowed)。登録済みのIdPはプランに関係なくそのまま動作します。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/value/value/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"metadata_url":"value","metadata_xml":"value","domains":["value"],"attribute_mapping":{}}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/value/value/value', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"metadata_url": "value",
"metadata_xml": "value",
"domains": [
"value"
],
"attribute_mapping": {}
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/config/auth
ログイン設定をすべて見る このプロジェクトのログイン設定すべてを、Supabase の auth config と同じキー(小文字)で返します。登録(disable_signup、mailer_autoconfirm、security_manual_linking_enabled、external_anonymous_users_enabled)、メールプロバイダーとパスワードのルール、電話番号と SMS プロバイダー(sms_*)、SAML(saml_*)、Web3、ソーシャルプロバイダーごとの external_<プロバイダー>_enabled・client_id・secret・url・email_optional、カスタムプロバイダーのスイッチ。シークレットは ••••abcd のように末尾4文字だけを返し、この値を update_auth_config にそのまま返すと保存済みの値は変わりません。callback_url はプロバイダーのコンソールに貼り付けるアドレスです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/config/auth
ログイン設定を変える 指定したキーだけを変えます(GoTrue の大文字の名前も使えます)。コンソールのサインイン / プロバイダー画面と同じルールで確認します: 有効にしたプロバイダーには必要な値がすべて要り(external_google_client_id、Keycloak のレルム url など)、Apple のシークレットは残り7日を超える ES256 の JWT、SMS の本文には {{ .Code }} が必要です。1つでも誤りがあれば何も保存せず、キーごとに理由を返します。カカオの同意項目は external_kakao_scopes(profile_nickname、account_email、gender などをカンマ区切り)、NAVER で保存する情報は external_naver_scopes、Google と GitHub の追加スコープは external_<プロバイダー>_additional_scopes です。シークレットに空文字列を渡すと削除します。オーナー・管理者・開発者だけが実行できます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/config/auth/custom-providers
カスタムログインプロバイダーを見る プロジェクトが自分で定義した OAuth・OIDC プロバイダー(custom:<識別子>)と、プランの上限(max_providers)、スイッチ(enabled)を返します。アプリでは signInWithOAuth({ provider: "custom:<識別子>" }) で使います。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/config/auth/custom-providers
カスタムログインプロバイダーを作る OAuth・OIDC プロバイダー(custom:<識別子>)を1つ作って有効にします。set_auth_provider と同じ場所に保存します。provider_type が oidc なら issuer だけで、{issuer}/.well-known/openid-configuration からエンドポイントと jwks_uri を読み込み、id_token の署名・発行者・対象・有効期限・nonce をその鍵で確認します。oauth2 なら issuer か authorization_url・token_url が必要で、空欄のエンドポイントは {issuer}/oauth/authorize、/oauth/token、/oauth/userinfo になります。claim_map は応答のどのフィールドが id・email・email_verified・name・avatar・phone か(ドットでつないだパス)です。PKCE は既定でオンです。プランの上限を超えると拒否されます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"identifier":"value","name":"my-name","provider_type":"oidc","client_id":"CLIENT_ID","client_secret":"CLIENT_SECRET"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"identifier": "value",
"name": "my-name",
"provider_type": "oidc",
"client_id": "CLIENT_ID",
"client_secret": "CLIENT_SECRET"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/config/auth/custom-providers/{identifier}
カスタムログインプロバイダーを変える カスタムプロバイダーを1つ変更します。識別子は変えられません。client_secret を空文字列にすると保存済みのシークレットを使い続けます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"identifier":"value","name":"my-name","provider_type":"oidc","client_id":"CLIENT_ID"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers/value', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"identifier": "value",
"name": "my-name",
"provider_type": "oidc",
"client_id": "CLIENT_ID"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/config/auth/custom-providers/{identifier}
カスタムログインプロバイダーのオンとオフ カスタムプロバイダーを1つオフまたはオンにします。オフにしても既存のセッションはそのままですが、新しいログインは再度オンにするまで失敗します。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers/value', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/config/auth/custom-providers/{identifier}
カスタムログインプロバイダーを削除 カスタムプロバイダーを1つ削除します。元に戻せず、このプロバイダーでログインしていたユーザーは入れなくなります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers/value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/custom-providers/value', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/config/auth/copy-from-import
取り込み元からログイン設定をコピー import_sources で接続した Supabase アカウントで、そのプロジェクトのログイン設定をこのサーバーのプロジェクト(ref)にコピーします。オンにしたソーシャルプロバイダー(Client ID、シークレットなど。update_auth_config と同じ確認)、戻り先アドレスの一覧(uri_allow_list。add_redirect_url と同じ)、空のときだけ site_url。シークレットは会話に出ません。答えはプロバイダーごとの copied と理由です。答えの callback_url を各プロバイダーのコンソールに登録するまで、ログインは失敗します。dry_run なら何も変えずに表示だけします。オーナー・管理者・開発者のみ実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/copy-from-import" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"providers":["google"],"dry_run":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/copy-from-import', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"providers": [
"google"
],
"dry_run": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/config/auth/third-party-auth
サードパーティ認証を見る Data API が受け付ける他の認証サービス(Firebase、Clerk、WorkOS、Auth0、Amazon Cognito、OpenID 発行者)のトークンの一覧です。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/third-party-auth" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/third-party-auth', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/config/auth/third-party-auth
サードパーティ認証を追加 他の認証サービスの JWT をこのプロジェクトのログインとして受け付けます。value は type によって異なります: firebase はプロジェクト ID、clerk は https://clerk.<ドメイン> か https://<名前>.clerk.accounts.dev、workos は発行者 URL、auth0 はテナント名(<名前>.auth0.com の前半)、cognito はユーザープール ID(region も)、oidc は発行者 URL。Auth0 と Cognito では audiences の指定をおすすめします。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/third-party-auth" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"type":"firebase","value":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/third-party-auth', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"type": "firebase",
"value": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/config/auth/third-party-auth/{id}
サードパーティ認証を削除 サードパーティ認証を1つ削除します。そのサービスでログインしたユーザーのリクエストは30秒以内に 401 で拒否されます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/third-party-auth/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/config/auth/third-party-auth/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/analytics
ウェブ分析 日ごとのページビューと訪問者を、よく見られたページ、参照元、国、デバイス、ブラウザ、OSとあわせて返します。個人を識別できる値は保存しないため、合計だけです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics?days=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics?days=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/analytics/breakdown
Web Analytics の内訳 キャンペーン(utm_source・utm_medium・utm_campaign)、ルート、カスタムイベント、除外したボットの数を返します。event を指定すると、そのイベントのプロパティごとの値も返します。合計のみです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/breakdown?days=1&event=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/breakdown?days=1&event=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/analytics/previews
プレビューの訪問を数える プレビューデプロイと dpl- アドレスの訪問を Web Analytics で数えるかを設定します。オフ(既定)ではプレビューにスクリプトを入れず、送られたものも捨てます。オーナーと管理者のみ実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/previews" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"include_previews":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/previews', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"include_previews": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/analytics/export
Web Analytics をエクスポート 期間の合計を日付・項目・値ごとの CSV 文字列で返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/export?days=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/export?days=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/analytics/reports
カスタムレポート一覧 保存した Web Analytics のレポートと、レポートに入れられるグラフの名前を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/analytics/reports/{id}
カスタムレポートを表示 保存したレポート 1 つを、その期間の合計、内訳、速度とあわせて返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports/ID', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/analytics/reports
カスタムレポートを保存 レポートを作成するか、id で指定したレポートを変更します。開発者以上が実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","widgets":["views"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"widgets": [
"views"
]
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/analytics/reports
カスタムレポートを保存 レポートを作成するか、id で指定したレポートを変更します。開発者以上が実行できます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","widgets":["views"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"widgets": [
"views"
]
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/analytics/reports/{id}
カスタムレポートを削除 レポートだけを削除します。分析の記録はそのままです。開発者以上が実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/analytics/reports/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/speed-insights
速度インサイト 実際の訪問者のブラウザが測った Core Web Vitals (LCP、INP、CLS、FCP、TTFB) の75パーセンタイルと評価、遅いページを返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/speed-insights?days=1&device=all" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/speed-insights?days=1&device=all', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/insights
分析のオン・オフ ウェブ分析と速度インサイトをオン・オフします。オンにするとサイトの HTML に /_oneend/insights/script.js が入ります。Vercel の @vercel/analytics・@vercel/speed-insights を使うアプリは、コードを変えずに同じ場所で集計されます。Cookie を使わず、IP アドレスも保存しません。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/insights" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"analytics":true,"speed_insights":true,"vitals_sample_percent":1}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/insights', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"analytics": true,
"speed_insights": true,
"vitals_sample_percent": 1
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/remote-cache
リモートキャッシュ Turborepo リモートキャッシュのアドレス、保存された結果の数と容量、直近 30 日のヒットとアップロード、今月計量された保存容量(remote_cache_gb_hour)と単価を返します。ダウンロードしたデータは egress_gb として数えます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/remote-cache" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/remote-cache', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/remote-cache/artifacts
リモートキャッシュを空にする 保存された結果をすべて削除します。次のビルドから再び溜まり、削除した分だけ保存容量の計量が減ります。開発者以上が実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/remote-cache/artifacts" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/remote-cache/artifacts', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/flags
機能フラグ一覧 プロジェクトの機能フラグと、エッジ設定に置いたフラグの形の値をあわせて返します。source はどこにあるか、shadows は同じキーのエッジ設定の値を隠しているかを示します。同じキーならフラグが決めます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/flags" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/flags', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/flags/evaluate
機能フラグを評価 アプリが受け取る値を返します。コンテキスト(例: {"user": {"id": "u1"}})と環境を指定するとフラグのルールで、そのキーのフラグがなければエッジ設定の値で決まります。source がどちらで決まったかを示します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/flags/evaluate?key=API_URL&environment=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/flags/evaluate?key=API_URL&environment=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/flags/{key}/environments/{environment}
機能フラグのオン・オフ 1 つの環境でフラグをオン・オフします。本番はオーナーと管理者、その他の環境は開発者以上が実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/flags/API_URL/environments/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/flags/API_URL/environments/value', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/edge-config
エッジ設定を読む プロジェクトのエッジ設定 (デプロイせずに変える値と機能フラグ) 全体を、バージョン、サイズ、上限とあわせて返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/edge-config/tokens
エッジ設定の読み取りトークン このプロジェクトのエッジ設定を別のプロジェクトが読む読み取りトークンと、連携したプロジェクト(変数名、環境)、このプロジェクトに連携した別のプロジェクトのエッジ設定を返します。トークン自体は返しません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/edge-config/tokens
エッジ設定の読み取りトークンを作成 読み取りトークンを作成し、connect を渡すと同じ組織のプロジェクトに連携します。連携したプロジェクトのデプロイには、次のデプロイから接続文字列(https://<ref>.<zone>/config/v1?token=…)が変数として入ります。トークンは今回だけ表示されます。プロジェクト管理者だけが実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/edge-config/tokens/{id}
読み取りトークンを失効 読み取りトークンを失効させます。すぐに読めなくなり、連携したプロジェクトでは次のデプロイから変数がなくなります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/edge-config/tokens/{id}/connections/{ref}
読み取りトークンをプロジェクトに連携 読み取りトークンを、同じ組織の別のプロジェクトのデプロイに変数として連携します。すでに連携していれば変数名と環境を変えます。そのプロジェクトの開発者以上(本番はオーナー・管理者)が必要です。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens/ID/connections/abcdefghijklmnopqrst" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"variable":"value","targets":["production"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens/ID/connections/abcdefghijklmnopqrst', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"variable": "value",
"targets": [
"production"
]
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/edge-config/tokens/{id}/connections/{ref}
読み取りトークンの連携を解除 読み取りトークンを 1 つのプロジェクトから外します。そのプロジェクトの次のデプロイから変数がなくなります。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens/ID/connections/abcdefghijklmnopqrst" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/tokens/ID/connections/abcdefghijklmnopqrst', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/edge-config/history
エッジ設定の変更履歴 誰がいつどのキーを何から何に変えたかを、新しい順に返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/history?limit=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config/history?limit=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/edge-config
エッジ設定を変える キーを保存または削除します。数秒以内にすべてのサーバーに反映され、変更履歴が残ります。フラグは true/false、または {"enabled": true, "percent": 20}、{"enabled": true, "allow": ["user-1"]} の形です。開発者以上が行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"set":{},"delete":["value"]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/edge-config', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"set": {},
"delete": [
"value"
]
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/rolling-releases
段階的リリースの状態 段階的リリースの設定と、進行中のリリース (新しいデプロイが受け取る訪問者の割合)、最近の履歴を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rolling-releases" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rolling-releases', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/rolling-releases
段階的リリースの設定 新しい本番デプロイを段階的な割合で出すかを決めます。stages は大きくなる割合のリスト (例: [10, 50])、stage_minutes は段階の長さで、auto_advance が false なら段階ごとに承認が必要です。abort_error_rate (0.05 = 5%) を超えると自動で戻します。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rolling-releases" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true,"stages":["value"],"stage_minutes":1,"auto_advance":true,"abort_error_rate":0.001}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rolling-releases', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true,
"stages": [
"value"
],
"stage_minutes": 1,
"auto_advance": true,
"abort_error_rate": 0.001
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/rolling-releases/{action}
段階的リリースを次の段階へ 進行中のリリースを次の段階の割合に上げます。最後の段階なら全員にリリースします。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rolling-releases/value" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"reason":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/rolling-releases/value', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"reason": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/kv
KV キーの一覧 KV ストアのキーを接頭辞で50個ずつ返します。使用量、上限、REST のアドレスもあわせて返します。シークレットを見られるロールのみ行えます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv?prefix=value&cursor=value" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv?prefix=value&cursor=value', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/kv/{id}
KV の値を読む キー1つの値と残り秒数 (ttl、-1 は期限なし) を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv/ID', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/kv/{id}
KV の値を保存 キーに JSON の値を保存します。ttl は有効期限までの秒数です。開発者以上が行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"value":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv/ID', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"value": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/kv/{id}
KV キーを削除 キーを削除します。開発者以上が行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/kv/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/ai-gateway
AI ゲートウェイ AI ゲートウェイの OpenAI 互換アドレス、設定、プロバイダー (キーは末尾4文字のみ)、直近30日の使用量を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/ai-gateway
AI ゲートウェイの設定 AI ゲートウェイのオン・オフ、ログインしたユーザーの許可、キャッシュ (秒)、1分あたりの上限、プラットフォームのプロバイダーへのフォールバック (トークン課金)、アプリのユーザー1人あたりの1日のリクエスト・トークン上限を決めます。ユーザーはログインしたユーザーの id、または secret キーで呼ぶときの x-oneend-user ヘッダーか本文の user です。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true,"allow_users":true,"cache_seconds":0,"rate_per_minute":1,"platform_fallback":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true,
"allow_users": true,
"cache_seconds": 0,
"rate_per_minute": 1,
"platform_fallback": true
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/ai-gateway/logs
AI ゲートウェイの呼び出し履歴 最近の呼び出しのプロバイダー、モデル、状態、トークン、レイテンシ、フォールバックの有無を返します。会話の内容は保存しません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/logs?limit=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/logs?limit=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/ai-gateway/providers
AI プロバイダーを追加 プロバイダーをキーとあわせて追加します。OpenAI 互換、Anthropic(Messages API と相互に変換)、Google Gemini を選べます。アドレスは公開された https のみです。キーは封印して保存し、二度と表示しません。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/providers" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","kind":"openai"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/providers', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"kind": "openai"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/ai-gateway/providers/{id}
AI プロバイダーのオン・オフ 設定とキーは残したまま、プロバイダーの使用を止めたり再開したりします。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/providers/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/providers/ID', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/ai-gateway/providers/{id}
AI プロバイダーを削除 プロバイダーと封印されたキーを削除します。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/providers/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/providers/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/ai-gateway/budgets
AI ゲートウェイの予算 プロジェクトの AI ゲートウェイの予算をドルで設定します(日・週・月、UTC)。使い切ると次の期間まで呼び出しを拒否します。指定しない値はそのままです。オーナーと管理者のみ実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/budgets" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"daily_usd":"value","weekly_usd":"value","monthly_usd":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/budgets', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"daily_usd": "value",
"weekly_usd": "value",
"monthly_usd": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/ai-gateway/keys
AI ゲートウェイキー一覧 ゲートウェイキーの名前、先頭部分、予算、今月の支出、最終使用時刻を返します。キーそのものは返しません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/ai-gateway/keys
AI ゲートウェイキーを作成 アプリ 1 つ、またはプロジェクトが AI を再販する顧客 1 人に渡すゲートウェイキー(bwai_…)を、予算・タグ・1 分あたりの上限付きで作成します。キーはこの応答で一度だけ表示されます。タグ(external_ref)付きのキーはプロジェクトごとの 50 個の上限に数えません。オーナーと管理者のみ実行できます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/ai-gateway/keys/{id}/limits
AI ゲートウェイキーの上限 ゲートウェイキー 1 つの 1 分あたりのリクエスト数とトークン数の上限を変更します。すべてのサーバーが同じ数を数えます。指定しない値はそのまま、null で上限をなくします。オーナーと管理者のみ実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys/ID/limits" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"rate_per_minute":"value","tokens_per_minute":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys/ID/limits', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"rate_per_minute": "value",
"tokens_per_minute": "value"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/ai-gateway/aliases
AI モデルの別名 呼び出す側が使うモデル名(別名)と、実際に送るモデルを設定します。別名ごとに先頭に入れるシステム指示を置けます。応答の model は別名で返ります。送った一覧が今の一覧をまるごと置き換えます。aliases_only を有効にすると別名以外は呼び出せず、/models も別名だけを返します。オーナーと管理者のみ実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/aliases" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"aliases":[{"alias":"value","target":"hello","system_prompt":"value"}]}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/aliases', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"aliases": [
{
"alias": "value",
"target": "hello",
"system_prompt": "value"
}
]
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/ai-gateway/hooks
AI ゲートウェイのフック ゲートウェイキーで呼び出すたびに問い合わせ、知らせる https アドレスを設定します。ai.before が timeout_ms 以内に 2xx を返さなければ呼び出しを拒否します(402 は残高不足としてそのまま伝えます)。ai.after は使用量・費用・状態を送り、受け取られるまで 1 日のあいだ再送します。応答に署名用のシークレットがあります。url を null にすると無効になります。オーナーと管理者のみ実行できます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/hooks" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"url":"https://example.com/hook","timeout_ms":200}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/hooks', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"url": "https://example.com/hook",
"timeout_ms": 200
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/ai-gateway/keys/{id}
AI ゲートウェイキーの予算 ゲートウェイキー 1 つの予算を変更します。指定しない値はそのままです。オーナーと管理者のみ実行できます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"daily_usd":"value","weekly_usd":"value","monthly_usd":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys/ID', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"daily_usd": "value",
"weekly_usd": "value",
"monthly_usd": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/ai-gateway/keys/{id}
AI ゲートウェイキーを無効化 ゲートウェイキーを無効化します。30 秒以内にすべてのサーバーで拒否されます。オーナーと管理者のみ実行できます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys/ID" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/keys/ID', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/ai-gateway/spend
AI ゲートウェイの支出 今日・今週・今月の支出と予算、日別・モデル別・キー別の支出をドルで返します。自分のキーで呼び出したプロバイダーは定価で計算した推定です。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/spend?days=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/ai-gateway/spend?days=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/middleware
ミドルウェアの設定 サイトのミドルウェア (middleware.ts) を実行するかと、時間制限を返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/middleware" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/middleware', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/middleware
ミドルウェアの設定を変える サイトのミドルウェアをオン・オフし、時間制限 (100〜5000ms) を決めます。オフにするとデプロイし直さなくてもミドルウェアなしで配信します。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/middleware" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"enabled":true,"timeout_ms":100}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/middleware', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"enabled": true,
"timeout_ms": 100
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/branches
データベースブランチの一覧 このプロジェクトのデータベースブランチです。名前、ブランチ自身のプロジェクトref(ほかのすべてのツールにそのまま使います)、紐づくgitブランチ、状態(creating、ready、merging、resetting、failed、deleting)、サイズ、期限を返します。自動ブランチの設定も返します。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/branches
データベースブランチを作成する プロジェクトのスキーマからプレビュー用のデータベースを作ります。プロジェクトのマイグレーション(apply_migrationsが記録した履歴)を順に再実行し、シードを入れます。データはwith_dataを指定したときだけコピーします。ブランチは独自のrefを持つプロジェクトで、run_sqlやget_project_keysなどすべてのツールにそのrefを使います。git_branchを指定すると、そのブランチのプレビューデプロイがこのデータベースを使います。Proプランから使えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","git_branch":"value","with_seed":true,"with_data":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"git_branch": "value",
"with_seed": true,
"with_data": true
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/branching
自動データベースブランチの設定 プレビューとしてデプロイされるgitブランチごとにデータベースブランチを自動で作るか、すべてのブランチに入れるシードSQL、使われていないブランチを残す日数(1から90日、デプロイのたびに延長)を設定します。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branching" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"automatic":true,"seed_sql":"value","lifetime_days":1}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branching', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"automatic": true,
"seed_sql": "value",
"lifetime_days": 1
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/branches/{name}/merge
データベースブランチをマージする ブランチにだけあるマイグレーションを、バージョン順にプロジェクト(本番)へ適用します。1つずつ独自のトランザクションで実行し、失敗したらそれだけを元に戻して止まります。データは移しません。ブランチでスキーマを変えるときは、マージされるようにrun_sqlではなくapply_migrationsを使ってください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches/my-name/merge" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches/my-name/merge', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/branches/{name}/reset
データベースブランチを初期化する ブランチのデータベースを削除し、プロジェクトのマイグレーションとシードから作り直します。ブランチのデータとユーザーはすべて失われ、バックアップは残りません。confirm にブランチ名をそのまま入れてください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches/my-name/reset" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches/my-name/reset', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/branches/{name}
データベースブランチを削除する ブランチと、そのデータベースやキーを削除します。元に戻せないので、confirm にブランチ名をそのまま入れてください。gitブランチを削除するかプルリクエストを閉じると自動で削除されます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/branches/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/queues
キューの一覧 キュー(pgmqと同じSQL関数: pgmq.send、pgmq.read、pgmq.pop、pgmq.archive、pgmq.delete)と、それぞれのメッセージ数、今読める数、アーカイブされた数、最も古いメッセージの経過時間を返します。enabledはpgmqがインストールされているか、exposedはデータAPI(pgmq_public)から呼べるかです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/queues/metrics
キューの指標 5 分ごとに測ったキューの記録から、各キューの現在の待機数・読めるメッセージ数・最長待ち時間・アーカイブ数と、キュー全体の時間ごとの待機数・送信数・処理数を返します。既定は 24 時間、最大 168 時間。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/metrics?hours=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/metrics?hours=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/queues
キューを作成する キューを1つ作ります(pgmq.create)。初回はpgmqもインストールします。メッセージはpgmq.q_<名前>テーブルに保存され、SQLではpgmq.send(名前, メッセージ)で入れ、pgmq.read(名前, 秒, 件数)で読みます。専用データベースでのみ使えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name"
}),
})
const result = await response.json()
PUT /api/v1/projects/{ref}/queues/api
キューをデータAPIに公開する trueならpgmq_publicスキーマ(send、send_batch、read、pop、archive、delete)を作り、データAPIからsupabase.schema("pgmq_public").rpc("send", ...)で呼べるようにします。呼び出した人の権限で実行されるため、公開キーやログインユーザーが使うには、キューのテーブルに権限とアクセスルールを与えてください。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/api" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"exposed":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/api', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"exposed": true
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/queues/{name}
キューを削除する キューと、そのメッセージ、アーカイブを削除します(pgmq.drop_queue)。元に戻せないので、confirm にキュー名をそのまま入れてください。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/queues/{name}/purge
キューを空にする キューのメッセージをすべて削除します(pgmq.purge_queue)。アーカイブは残します。元に戻せないので、confirm にキュー名をそのまま入れてください。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name/purge" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"confirm":"my-project"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name/purge', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"confirm": "my-project"
}),
})
const result = await response.json()
POST /api/v1/projects/{ref}/queues/{name}/messages
キューにメッセージを入れる JSONのメッセージを1つキューに入れます(pgmq.send)。delay秒の間は読めません。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name/messages" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"message":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name/messages', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"message": "value"
}),
})
const result = await response.json()
GET /api/v1/projects/{ref}/queues/{name}/messages
キューのメッセージを見る キューの先頭のメッセージを、取り出さずに見ます。読み取り回数も可視性の時刻も変えないため、ワーカーが受け取るはずのメッセージを横取りしません。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name/messages?limit=1" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/queues/my-name/messages?limit=1', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/vault
Vaultのシークレットの一覧 Vaultに保存したシークレットの名前と説明です。値は返しません。プロジェクトのコードはシークレットキーでselect decrypted_secret from vault.decrypted_secrets where name = ...として読みます。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
POST /api/v1/projects/{ref}/vault
Vaultにシークレットを保存する シークレットを1つ暗号化し、プロジェクトのデータベースのvault.secretsに保存します(vault.create_secret)。鍵はプラットフォームが持ち、データベースには保存されないため、ダンプやバックアップには暗号文だけが残ります。初回はVaultを有効にします。この操作はオーナーと管理者のみ行えます。
curl -X POST "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"name":"my-name","value":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault', {
method: 'POST',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"name": "my-name",
"value": "value"
}),
})
const result = await response.json()
PATCH /api/v1/projects/{ref}/vault/{name}
Vaultのシークレットを変更する シークレットの値や説明を変更します(vault.update_secret)。この操作はオーナーと管理者のみ行えます。
curl -X PATCH "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"value":"value","description":"value"}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault/my-name', {
method: 'PATCH',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"value": "value",
"description": "value"
}),
})
const result = await response.json()
DELETE /api/v1/projects/{ref}/vault/{name}
Vaultのシークレットを削除する シークレットを1つ削除します。この操作はオーナーと管理者のみ行えます。
curl -X DELETE "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault/my-name" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/vault/my-name', {
method: 'DELETE',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
GET /api/v1/projects/{ref}/network-restrictions
データベースの接続制限 データベースに直接(5432と6543)接続できるアドレスと、TLSを必須にしているかです。restrictedがfalseならすべてのアドレスが接続できます。your_address_allowedは、このリクエストを送ったアドレスが許可されているかです。
curl "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network-restrictions" \
-H "Authorization: Bearer $ONEEND_TOKEN"
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network-restrictions', {
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}` },
})
const result = await response.json()
PUT /api/v1/projects/{ref}/network-restrictions
データベースの接続制限を変更する 直接接続を許可するアドレス(CIDRの一覧、100個まで)と、TLSを必須にするかを変更します。allow_allならすべてのアドレスを再び許可します。このリクエストを送ったアドレスが一覧にないと、confirmなしでは拒否されます。コンソール、API、run_sqlは接続プーラーを通らないため、制限をかけても元に戻せます。この操作はオーナーと管理者のみ行えます。
curl -X PUT "https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network-restrictions" \
-H "Authorization: Bearer $ONEEND_TOKEN" \
-H "content-type: application/json" \
-d '{"allowed_cidrs":["value"],"allow_all":true,"enforce_ssl":true,"confirm":true}'
const response = await fetch('https://end.blackall.ai/api/v1/projects/abcdefghijklmnopqrst/network-restrictions', {
method: 'PUT',
headers: { authorization: `Bearer ${process.env.ONEEND_TOKEN}`, 'content-type': 'application/json' },
body: JSON.stringify({
"allowed_cidrs": [
"value"
],
"allow_all": true,
"enforce_ssl": true,
"confirm": true
}),
})
const result = await response.json()