Vigilfield Docs
API referenceOrganizations

`PUT /organizations/{id}` — update an organisation. Slug + plan-tier changes are permitted; `data_lake_bucket` is system-managed and remains untouched by this endpoint.

PUT/organizations/{id}

Path Parameters

id*string

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"}