概要
Jstore は「JSON を保存して、そのまま返す」ンプルなサービスです。 サーバー側で JSON の意味や構造を解釈せず、保存された内容をそのまま配信します。
向いている用途
- アプリやWebサイトの設定 JSON
- 機種一覧やマスターデータ
- たまに更新する公開データ
- 限定共有したい protected JSON
向いていない用途
- 高頻度な書き込みや同時更新
- 個人情報や認証情報の保存
- 秘匿性が必要な機密データ
- 複雑な検索や大量ユーザーデータ管理
Jstore は公開向け JSON ホスティングを基本としつつ、ヘッダー指定で protected モードを選べます。
共通仕様
| 保存形式 | JSON のみ |
|---|---|
| リクエスト Content-Type | application/json |
| レスポンス形式 | 取得系は保存された JSON をそのまま返却。作成・更新・削除系はメタ情報 JSON を返却。 |
| 公開範囲 | public または protected |
| 更新・削除認証 | X-Edit-Key ヘッダー必須 |
| protected 取得 | X-Access-Key ヘッダー必須 |
| サイズ制限 | 10MB |
| editKey / accessKey 保存方式 | 平文は返却のみ。保存時は SHA-256 ハッシュ化 |
Jstore は JSON の中身を解釈しません。通常の JSON でも、暗号化済み文字列を含む JSON でも、JSON として有効なら保存できます。
Visibility モード
public
デフォルトの保存モードです。追加ヘッダーなしで保存されます。
- GET / HEAD でそのまま取得可能
visibility: "public"を保存accessKeyは発行されません
protected
X-Jstore-Visibility: protected を付けて保存すると有効になります。
- GET / HEAD に
X-Access-Keyが必要 visibility: "protected"を保存accessKeyが発行されます
protected モードでは、作成時レスポンスでのみ
accessKey を取得できます。後から復元はできません。
エンドポイント
ROOT
/
ドキュメントへリダイレクトします。
GET
/api
API の状態確認用エンドポイントです。利用可能な基本情報を JSON で返します。
レスポンス例
{
"name": "Jstore",
"status": "ok",
"endpoints": {
"create": "POST /api/json",
"apiGet": "GET /api/json/:id",
"rawGet": "GET /get/:id",
"headApi": "HEAD /api/json/:id",
"headRaw": "HEAD /get/:id",
"update": "PATCH /api/json/:id",
"remove": "DELETE /api/json/:id"
},
"limits": {
"maxJsonBytes": 10485760
}
}
POST
/api/json
JSON を新規保存します。保存後、取得用 URL と更新・削除用の editKey を返します。
リクエストヘッダー
| Content-Type | application/json |
|---|---|
| X-Jstore-Visibility | protected を指定した場合のみ protected モードで保存 |
public 保存の例
{
"hello": "world",
"items": [1, 2, 3]
}
public レスポンス例
{
"id": "xa41fz8b",
"editKey": "550e8400-e29b-41d4-a716-446655440000-a1b2c3",
"visibility": "public",
"rawUrl": "https://jstore.ulab.workers.dev/get/xa41fz8b",
"apiUrl": "https://jstore.ulab.workers.dev/api/json/xa41fz8b",
"size": 49,
"createdAt": "2026-03-22T12:00:00Z",
"updatedAt": "2026-03-22T12:00:00Z",
"type": "object"
}
protected レスポンス例
{
"id": "kp92mn4q",
"editKey": "550e8400-e29b-41d4-a716-446655440000-a1b2c3",
"accessKey": "660e8400-e29b-41d4-a716-446655440000-z9x8y7",
"visibility": "protected",
"rawUrl": "https://jstore.ulab.workers.dev/get/kp92mn4q",
"apiUrl": "https://jstore.ulab.workers.dev/api/json/kp92mn4q",
"size": 49,
"createdAt": "2026-03-22T12:00:00Z",
"updatedAt": "2026-03-22T12:00:00Z",
"type": "object"
}
JSON を新規保存した時点で、利用者は利用規約およびプライバシーポリシーに同意したものとみなされます。
editKey と accessKey はこのレスポンスでのみ取得できます。
GET
/get/{id}
保存済み JSON をそのまま返します。public ならそのまま取得でき、protected なら X-Access-Key が必要です。
パスパラメータ
| id | 保存時に発行された JSON ID |
|---|
protected 取得ヘッダー
| X-Access-Key | protected データ取得時に必須 |
|---|
レスポンス例
{
"hello": "world",
"items": [1, 2, 3]
}
主なレスポンスヘッダー例
Content-Type: application/json; charset=utf-8 Cache-Control: public, max-age=86400 X-JSON-Size: 49 X-Created-At: 2026-03-22T12:00:00Z X-Updated-At: 2026-03-22T12:00:00Z X-JSON-Type: object X-Revision: 1 X-Jstore-Id: xa41fz8b
HEAD
/get/{id}
body なしでメタ情報ヘッダーのみ取得します。protected の場合は X-Access-Key が必要です。
レスポンスヘッダー例
Content-Type: application/json; charset=utf-8 Cache-Control: public, max-age=86400 X-JSON-Size: 49 X-Created-At: 2026-03-22T12:00:00Z X-Updated-At: 2026-03-22T12:00:00Z X-JSON-Type: object X-Revision: 3 X-Jstore-Id: xa41fz8b
GET
/api/json/{id}
/get/{id} と同様に JSON を取得します。API パスに統一したい場合に利用できます。
HEAD
/api/json/{id}
/get/{id} の HEAD と同様に、body なしでメタ情報ヘッダーのみ取得できます。
PATCH
/api/json/{id}
既存 JSON を上書き更新します。対象 JSON の X-Edit-Key が必要です。
リクエストヘッダー
| Content-Type | application/json |
|---|---|
| X-Edit-Key | 必須。作成時に発行された編集キー |
レスポンス例
{
"message": "JSON updated successfully",
"id": "xa41fz8b",
"rawUrl": "https://jstore.ulab.workers.dev/get/xa41fz8b",
"apiUrl": "https://jstore.ulab.workers.dev/api/json/xa41fz8b",
"size": 57,
"createdAt": "2026-03-22T12:00:00Z",
"updatedAt": "2026-03-22T13:00:00Z",
"type": "object"
}
DELETE
/api/json/{id}
既存 JSON を削除します。対象 JSON の X-Edit-Key が必要です。
リクエストヘッダー
| X-Edit-Key | 必須。作成時に発行された編集キー |
|---|
レスポンス例
{
"message": "JSON deleted successfully",
"id": "xa41fz8b"
}
使用例
1. public JSON を保存
curl -X POST https://jstore.ulab.workers.dev/api/json \
-H "Content-Type: application/json" \
-d '{"hello":"world","items":[1,2,3]}'
2. public JSON を取得
curl https://jstore.ulab.workers.dev/get/xa41fz8b
3. protected JSON を保存
curl -X POST https://jstore.ulab.workers.dev/api/json \
-H "Content-Type: application/json" \
-H "X-Jstore-Visibility: protected" \
-d '{"hello":"secret"}'
4. protected JSON を取得
curl https://jstore.ulab.workers.dev/get/kp92mn4q \ -H "X-Access-Key: <accessKey>"
5. protected JSON を HEAD で確認
curl -I https://jstore.ulab.workers.dev/get/kp92mn4q \ -H "X-Access-Key: <accessKey>"
6. JSON を更新
curl -X PATCH https://jstore.ulab.workers.dev/api/json/xa41fz8b \
-H "Content-Type: application/json" \
-H "X-Edit-Key: <editKey>" \
-d '{"hello":"updated"}'
protected モードでは、閲覧用の
accessKey と更新用の editKey を分けて管理できます。
エラー仕様
エラー時は基本的に以下の形式で返します。
{
"error": "invalid_json",
"message": "Body must be valid JSON"
}
主なステータスコード
| 400 Bad Request | empty_body / invalid_json / missing_access_key / invalid_access_key |
|---|---|
| 401 Unauthorized | missing_edit_key |
| 403 Forbidden | invalid_edit_key |
| 404 Not Found | not_found |
| 405 Method Not Allowed | method_not_allowed |
| 413 Payload Too Large | payload_too_large |
| 415 Unsupported Media Type | unsupported_media_type |
accessKey エラー例
{
"error": "missing_access_key",
"message": "X-Access-Key header is required"
}
利用上の注意
重要事項
- 保存されたデータは public または protected として扱われます
- 個人情報、認証情報、機密情報は保存しないでください
- accessKey / editKey は利用者自身で安全に管理してください
- データの永続保存は保証されません
免責
- データ消失・破損・漏洩の可能性があります
- 当サービスは保存データの完全性や可用性を保証しません
- 利用により生じた損害について責任を負いません
- 必要に応じてサービス仕様は変更されることがあります
Jstore は「安全な秘密保管庫」ではありません。protected モードでも、取り扱うデータは慎重に選んでください。