Developer guide
Errors & troubleshooting
Resolve Workroomly API authentication, scope, event, OData and MCP failures using actual error contracts.
On this page
Capture the right evidence
Check both the HTTP status and the response body. Save X-Request-ID when present, the endpoint, time and a redacted description of the request. Do not paste keys, OAuth tokens or customer records into logs or support messages.
Public Query/Search/Events and OData errors use this envelope. For example, a permission failure returns:
{
"error": {
"code": "external_access_permission_denied",
"message": "The API key does not allow this operation."
}
}Public validation messages can be intentionally general. Use the authenticated Query/Search/Event Explorer to inspect current fields and valid workroom choices. Their signed-in management responses do not necessarily have the same shape as external responses.
API credentials and permissions
| HTTP / code | What it means | Next action |
|---|---|---|
| 401 · external_access_authentication_failed | Missing, malformed or invalid credential. | Send the full key as Bearer; check for whitespace, a copied prefix or the wrong environment. |
| 403 · external_access_permission_denied | The credential cannot perform this request. | Check activity/revocation, module permission, Data Access subspace grants and Developer-tools entitlement. |
| 403 · data_access_key_read_only | A Data Access key attempted to send an event. | Use an explicitly scoped Integration key for the intended business operation. |
| 403 · data_transfer_exhausted | The workroom has exhausted its external Data Transfer allowance. | Review usage in Billing/Data Access; add allowance or wait for reset. Repeated retries will not restore access. |
| 503 · external_access_billing_unavailable | The service cannot resolve required external-access billing. | Retry later and contact support with the request ID if it persists. |
Revoked or inactive keys are rejected with 403, not always 401. A key from another workroom cannot be repointed with X-Workroom-ID; create/use the intended workroom’s credential. The ordinary app login token is not an external API key.
Invalid requests and rate limits
| HTTP / code | What to check |
|---|---|
| 422 · external_access_validation_failed | Query/Search fields, filter operators/value types, resource names and required scope keys; or an invalid event envelope/business payload. |
| 409 on Event Ingress | The same API key/idempotency key was used for a different normalized payload. The current public wrapper uses external_access_validation_failed for this conflict too. |
| 429 · external_access_throttled | Reduce concurrency and request frequency; use bounded exponential backoff with jitter. |
| 500 · external_access_server_error | Retry a read or the exact same idempotent event submission with a bounded policy; retain the request ID. |
Do not assume a Retry-After header exists. A 422 may mean a space UUID was supplied where a stable crm_space_key was needed. Copy the request scope from Query Explorer. An empty result is not necessarily an error: check the key’s workroom, subspace, filters, archive state and dataset visibility rules.
Events accepted but no record appears
HTTP 202 only acknowledges queuing. Find the returned event_id in Settings → Developers → Event Activity, in the same workroom as the key. Inspect pending, processing, succeeded, failed or dead_letter, then open the detail view to read the result.
A permanent business validation failure enters dead_letter. Transient/unexpected processing failures are retried up to five times. An owner/admin can replay an eligible failed/dead-letter event after resolving its cause. Do not create a new idempotency key to force another copy of the same business operation.
For Flow+ outgoing HTTP calls, inspect the workflow’s run history and destination response. Check configured authentication, public destination reachability, body mapping and the actual method’s retry behavior. The Events API does not provide an outgoing subscription-delivery log or generic webhook replay endpoint.
OData query and client failures
| HTTP / code | Resolution |
|---|---|
| 400 · odata_option_unsupported | Remove unsupported options such as $expand, $apply or $search and custom query parameters. |
| 400 · odata_invalid_filter | Use an exposed filterable field, supported operator/function and correctly typed literal. |
| 400 · odata_invalid_select / odata_invalid_orderby | Check allowed property names and ordering fields; remove duplicate or unknown columns. |
| 400 · odata_invalid_skiptoken | Restart the query. The continuation may be expired, changed, or tied to a different key/grant. |
| 400 · odata_skip_limit_exceeded | Use returned nextLink URLs instead of a direct offset above 10,000. |
| 404 · odata_entity_set_not_found | Discover the exact entity-set spelling at the service root. |
| 404 · odata_entity_not_found | Check the canonical UUID, key workroom/scopes and whether the record is still visible. |
| 403 · odata_permission_denied | The key does not permit the requested dataset. |
| 405 · odata_read_only | Use GET for analytics; perform supported business changes through an Integration event or authorized MCP tool. |
| 429 · external_access_throttled | Reduce refresh/request frequency. |
| 429 · odata_concurrency_exceeded | Reduce concurrent requests in this workroom. |
| 503 · odata_capacity_unavailable / odata_throttle_capacity_unavailable | Capacity controls are temporarily unavailable. Retry later. |
| 504 · odata_query_timeout | Narrow filters/columns and reduce the requested work before retrying. |
If an analytics client repeatedly prompts for credentials, use Basic with a Data Access key as the password, and replace cached credentials after rotation. Integration keys cannot authenticate OData. Start from the service root and inspect metadata before adding filters. Power BI setup and refresh notes distinguish desktop import from online refresh.
MCP connection and execution failures
Use https://mcp.workroomly.com/mcp with a client that supports Streamable HTTP and OAuth. Allow the browser sign-in window to open, then sign in to Workroomly and authorize the connection. Use the remote server URL in your client’s configuration; an API-key header cannot replace OAuth consent.
If a tool is missing, check the connection’s read/write scopes, current membership and chosen product/subspaces. Some deployments use searched discovery. Reconnect to change granted permissions; do not substitute another workroom ID to bypass the grant.
Tool execution errors contain code, message, request_id, retryable and details. For permission_denied, inspect the grant and current native role. For validation_failed, inspect the arguments and discovered schema. invalid_backend_response means the service could not validate a backend result; retain the request ID for support. The MCP framework may report malformed tool input separately.
For a revision conflict, retrieve the current record and review changes before issuing a new mutation. After a network timeout, retain the original idempotency key and arguments. A pending approval is a business result, not a failed connection. Consult MCP results and safety guidance before retrying writes.
Keep the request ID, endpoint and time of the failure. Remove credentials and private records before contacting Workroomly.