Repository navigation
EN Reference Control Plane
English · Türkçe · Languages / Diller
Scope: JSON API Forge 0.5.1 · Source review: 17 September 2026 · Language: English
The control-plane prefix is /__forge/editor/v1. Project API keys cannot substitute for this session. Routes other than setup/login/register are subject to session and relevant policy/permission checks. An endpoint list grants no access; follow the remote Editor guide for network, resource and role boundaries.
Prepend /__forge/editor/v1 to every path below. The status column reports explicit decorator success settings; handlers can also return other Response types and errors. Handler names identify the implementation at the pinned commit.
| Method | Path | Handler | Success/status override |
|---|---|---|---|
| GET | /setup/status |
setup_status |
200 |
| POST | /setup/founder |
setup_founder |
HTTP_201_CREATED |
| POST | /auth/login |
login |
200 |
| POST | /auth/register |
register |
HTTP_201_CREATED |
| POST | /auth/logout |
logout |
HTTP_204_NO_CONTENT |
| GET | /capabilities |
capabilities |
200 |
| GET | /me |
me |
200 |
| PATCH | /me |
update_me |
200 |
| GET | /roles |
roles |
200 |
| POST | /roles |
create_role |
HTTP_201_CREATED |
| PUT | /roles/{role_id} |
update_role |
200 |
| GET | /members |
members |
200 |
| PUT | /members/{user_id} |
update_member |
HTTP_204_NO_CONTENT |
| POST | /invitations |
invitation |
HTTP_201_CREATED |
| GET | /projects |
projects |
200 |
| POST | /projects |
create_project |
HTTP_201_CREATED |
| GET | /projects/{project_name}/documents |
documents |
200 |
| GET | /projects/{project_name}/documents/{document_path:path} |
read_document |
200 |
| PUT | /projects/{project_name}/documents/{document_path:path} |
write_document |
200 |
| POST | /projects/{project_name}/validate |
validate_project |
200 |
| GET | /projects/{project_name}/databases |
databases |
200 |
| GET | /projects/{project_name}/databases/{alias}/tables/{table_name}/rows |
database_rows |
200 |
| GET | /areas |
areas |
200 |
| POST | /areas |
create_area |
HTTP_201_CREATED |
| GET | /areas/{area_id}/messages |
messages |
200 |
| POST | /areas/{area_id}/messages |
post_message |
HTTP_201_CREATED |
| GET | /notes |
notes |
200 |
| POST | /notes |
create_note |
HTTP_201_CREATED |
| POST | /areas/{area_id}/attachments |
upload_attachment |
HTTP_201_CREATED |
| GET | /areas/{area_id}/attachments |
attachments |
200 |
| GET | /attachments/{attachment_id} |
download_attachment |
200 |
| POST | /calls |
create_call |
HTTP_201_CREATED |
| POST | /calls/{call_id}/ticket |
create_call_ticket |
200 |
| GET | /call-client/{call_id} |
call_client |
200 |
| WEBSOCKET | /ws/calls/{call_id} |
call_socket |
WebSocket |
| GET | /audit |
audit |
200 |
Runtime rules supplement schema bounds: document SHA must be new or 64 lowercase hexadecimal characters, passwords must satisfy Settings policy, and invitation roles must remain within delegation authority. A field typed as str does not mean every value is accepted.
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
content |
string |
Yes | — | — |
expected_sha256 |
string |
Yes | — |
minLength=3; maxLength=64
|
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
name |
string |
Yes | — | — |
slug |
string |
Yes | — | — |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
username |
string |
Yes | — |
minLength=3; maxLength=32
|
password |
string |
Yes | — |
minLength=1; maxLength=256
|
display_name |
string |
Yes | — |
minLength=1; maxLength=80
|
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
username |
string |
Yes | — |
minLength=1; maxLength=64
|
password |
string |
Yes | — |
minLength=1; maxLength=256
|
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
username |
string |
Yes | — |
minLength=3; maxLength=32
|
password |
string |
Yes | — |
minLength=1; maxLength=256
|
display_name |
string |
Yes | — |
minLength=1; maxLength=80
|
invitation |
string |
Yes | — |
minLength=32; maxLength=512
|
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
display_name |
string | null |
No | null |
maxLength=80 |
title |
string | null |
No | null |
maxLength=120 |
bio |
string | null |
No | null |
maxLength=2000 |
timezone |
string | null |
No | null |
maxLength=64 |
status |
string | null |
No | null |
maxLength=160 |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
name |
string |
Yes | — |
minLength=1; maxLength=64
|
rank |
integer |
Yes | — |
min=1; max=999
|
permissions |
list[string] |
Yes | — | maxItems=100 |
document_allow |
list[string] |
No | [] |
maxItems=100 |
document_deny |
list[string] |
No | [] |
maxItems=100 |
database_allow |
list[string] |
No | [] |
maxItems=100 |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
memberships |
list[dict[str, string]] |
Yes | — |
minItems=1; maxItems=32
|
expires_hours |
integer |
No | 24 |
min=1; max=168
|
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
memberships |
list[dict[str, string]] |
Yes | — | maxItems=32 |
active |
boolean |
No | true |
— |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
project |
string |
Yes | — | — |
name |
string |
Yes | — |
minLength=1; maxLength=96
|
description |
string |
No | "" |
maxLength=500 |
visibility |
string |
No | "open" |
— |
minimum_rank |
integer |
No | 0 |
min=0; max=999
|
allowed_role_ids |
list[string] |
No | [] |
maxItems=100 |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
body |
string |
Yes | — | minLength=1 |
kind |
string |
No | "message" |
— |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
project |
string |
Yes | — | — |
area_id |
string | null |
No | null |
— |
title |
string |
Yes | — |
minLength=1; maxLength=160
|
body |
string |
No | "" |
— |
visibility |
string |
No | "open" |
— |
minimum_rank |
integer |
No | 0 |
min=0; max=999
|
allowed_role_ids |
list[string] |
No | [] |
maxItems=100 |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
area_id |
string |
Yes | — | — |
mode |
string |
Yes | — | — |
These models belong to project security endpoints, not Editor roles or sessions.
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
name |
string |
Yes | — |
minLength=1; maxLength=128
|
roles |
list[string] |
No | [] |
maxItems=64 |
permissions |
list[string] |
No | [] |
maxItems=256 |
tenant_id |
string | null |
No | null |
maxLength=128 |
rate_requests |
integer | null |
No | null |
min=1; max=10000000
|
rate_window_seconds |
integer | null |
No | null |
min=1; max=86400
|
rate_burst |
integer | null |
No | null |
min=1; max=10000000
|
expires_at |
string | null |
No | null |
format="date-time" |
| Field | Type | Required | Default | Schema constraints |
|---|---|---|---|---|
subject |
string |
Yes | — |
minLength=1; maxLength=256
|
roles |
list[string] |
No | [] |
maxItems=64 |
permissions |
list[string] |
No | [] |
maxItems=256 |
tenant_id |
string | null |
No | null |
maxLength=128 |
exp_minutes |
integer | null |
No | null |
min=1; max=43200
|
| Role | Rank | Permissions | Document scope | Database scope |
|---|---|---|---|---|
| Founder | 1000 | * |
["*"] |
["*"] |
| Administrator | 800 | * |
["*"] |
["*"] |
| Developer | 600 |
projects.readprojects.validatedocuments.readdocuments.writedocuments.graphs.writedatabases.metadata.readdatabases.rows.readprofiles.readprofiles.write.ownmembers.readareas.readmessages.readmessages.writenotes.readnotes.writeattachments.readattachments.writecalls.joincalls.start
|
["app.json","config/*.json","graphs/*.forgegraph.json"] |
["*"] |
| Analyst | 400 |
projects.readdocuments.readdatabases.metadata.readdatabases.rows.readprofiles.readprofiles.write.ownmembers.readareas.readmessages.readmessages.writenotes.readnotes.writeattachments.readcalls.join
|
["*"] |
["*"] |
| Collaborator | 200 |
projects.readdocuments.readprofiles.readprofiles.write.ownmembers.readareas.readmessages.readmessages.writenotes.readnotes.writeattachments.readattachments.writecalls.join
|
["*"] |
[] |
| Viewer | 100 |
projects.readdocuments.readdatabases.metadata.readprofiles.readmembers.readareas.readmessages.readnotes.readattachments.read
|
["*"] |
["*"] |
areas.manageareas.readattachments.readattachments.writeaudit.readcalls.joincalls.startdatabases.metadata.readdatabases.rows.readdatabases.undeclared.readdocuments.graphs.writedocuments.hooks.writedocuments.readdocuments.writeinvitations.managemembers.managemembers.readmessages.readmessages.writenotes.readnotes.writeprofiles.readprofiles.write.ownprojects.createprojects.readprojects.validateroles.manageroles.read
Even higher-ranked roles containing * do not override disabled policies or founder-specific restrictions. Allow/deny and project memberships can be more restrictive than rank comparison alone.
This page describes the behavior at the pinned commits below. Recheck these contracts when upgrading.