`PUT /organizations/{id}` — update an organisation. Slug + plan-tier changes are permitted; `data_lake_bucket` is system-managed and remains untouched by this endpoint.
/organizations/{id}Path Parameters
Organization id
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
PUT /organizations/{id} body. plan_tier, status and auth_config are
deliberately not settable here; a body still carrying them is ignored, not
rejected.
⚠️ auth_config is absent, and the absence is a security boundary
(rh-r5nxr6). It is the org's Cognito pool binding — user_pool_id,
user_pool_client_id, user_pool_domain, region — seeded once by
org-stack.ts and served to every visitor by the unauthenticated
GET /auth/config, which the sign-in page signs in against. While it was a
free-form Value on this body, require_admin was the only thing between a
compromised admin session and repointing the whole org's login at an
attacker-controlled pool: a credential-harvesting redirect hiding inside a
generic org update.
Removed rather than guarded, because nothing legitimately writes it:
updateOrganization has no production caller in the app, every reader
consumes only the four seeded keys, and IdP configuration lives in the
identity_provider resource rather than in this blob. A field a caller must
not set is better absent than rejected — there is no guard to forget, and
the published schema stops advertising the primitive.
Response Body
application/json
curl -X PUT "https://example.com/organizations/string" \ -H "Content-Type: application/json" \ -d '{}'{ "auth_config": null, "capabilities": [ "string" ], "created_at": "string", "data_lake_bucket": "string", "display_name": "string", "id": "string", "name": "string", "plan_tier": null, "settings": null, "slug": "string", "status": null, "updated_at": "string"}`GET /organizations` — list organisations visible to the caller. GET
Previous Page
`POST /queries/compile` — compile VFQL and return the SQL or the diagnostics. POST
**Creates nothing** (R4): no run, no scheduler dispatch, no credit movement. A refused compile is a **200** carrying `diagnostics` and no `sql` — the request asked "is this valid, and where is it wrong?" and got its answer. The **400** is for an unknown `vfql_version`, which is a fact about the request with no place in the text to point at, and it carries no `diagnostics` key at all (R6). ⚠️ **No `?as_admin=` parameter, unlike every other route in this cluster.** This endpoint's job is to report catalog facts back to the caller, so an override here would be an unaudited catalog-disclosure surface; the catalog is always computed for the acting team with no admin clause (`vigilfield_query::compile_query_for`).