Set the webhook
const url = 'https://files.centralcodestation.com/api/v1/tenants/example/applications/example/webhooks';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"url":"https://api.example.com/hooks/files","secret":"example","events":["file.ready","file.failed"],"active":true}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://files.centralcodestation.com/api/v1/tenants/example/applications/example/webhooks \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "url": "https://api.example.com/hooks/files", "secret": "example", "events": [ "file.ready", "file.failed" ], "active": true }'One webhook per application. An active webhook is first sent a signed ping event: unless it answers 2xx within the timeout (5 s by default), nothing is saved and the answer is 422 webhook_unreachable. Leave secret out to keep the stored one. Audited webhook.updated (never the secret).
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The Identity Server tenant id.
The Identity Server application id: a tenant application, or (platform clients) the client’s own platform application.
Request Bodyrequired
Section titled “Request Bodyrequired”object
Https in production; no credentials; not a private, loopback or link-local address.
Example
https://api.example.com/hooks/filesSigns every delivery (X-Files-Signature). Write-only, stored encrypted, never returned. Required the first time; leave it out to keep the stored one.
Example
[ "file.ready", "file.failed"]An active webhook is pinged before it is saved; false stops deliveries without a ping.
Responses
Section titled “Responses”Success.
object
Null when no webhook is set.
False when switched off, or after 20 consecutive failed deliveries.
Whether a secret is stored (the secret itself is never returned).
Consecutive events whose every attempt failed; 20 switch the webhook off. Reset by a delivery or a PUT.
When the failures switched it off.
Example
{ "url": "https://api.example.com/hooks/files", "events": [ "file.ready", "file.failed" ]}Error. error is one of: invalid_request, webhook_url_not_allowed.
object
Stable snake_case error code.
Example
{ "status_code": 400, "error": "invalid_request", "message": "The request is malformed: a required field is missing, a value has the wrong type or format, or a field the route does not accept was sent", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}Error. error is one of: invalid_token.
object
Stable snake_case error code.
Example
{ "status_code": 401, "error": "invalid_token", "message": "The bearer token is missing, malformed, expired, signed by an unknown key, or has the wrong audience (`aud` must be `files-api`).", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}Error. error is one of: not_tenant_member, no_application_access, tenant_not_available, insufficient_scope, client_context_mismatch, files_access_not_granted, missing_capability.
object
Stable snake_case error code.
Example
{ "status_code": 403, "error": "not_tenant_member", "message": "The user is not an active member of the tenant in the URL.", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}Error. error is one of: application_not_found, not_found.
object
Stable snake_case error code.
Example
{ "status_code": 404, "error": "application_not_found", "message": "The application in the URL is not an active application of the tenant.", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}Error. error is one of: webhook_unreachable.
object
Stable snake_case error code.
Example
{ "status_code": 422, "error": "webhook_unreachable", "message": "The webhook URL did not answer the verification ping with a 2xx within 5 seconds.", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}Error. error is one of: rate_limited.
object
Stable snake_case error code.
Example
{ "status_code": 429, "error": "rate_limited", "message": "Too many requests in the current window; `retry_after` (and the `Retry-After` header) says when to retry.", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}Error. error is one of: identity_unavailable.
object
Stable snake_case error code.
Example
{ "status_code": 503, "error": "identity_unavailable", "message": "The service could not reach the Identity Server and has no fresh cached answer.", "path": "/api/v1/tenants/fitness-co/applications/fitness-app/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D", "timestamp": "2026-10-22T09:12:33.120Z"}default
Section titled “default”Error: see error for the code.
object
Stable snake_case error code.
Example
{ "status_code": 403, "error": "invalid_request", "message": "This client is not bound to this tenant/application", "path": "/api/v1/tenants/t1/applications/a1/files/01J9Z6S9Q5F5R6Y2W2GZ3B3K4D"}