Rate limits
Limits apply per principal and workspace in clock-aligned, fixed one-minute windows.
Responses evaluated against an operation’s limit include
X-RateLimit-Limit and X-RateLimit-Remaining. A limited request returns 429 RATE_LIMITED and a Retry-After header measured in seconds. Wait for that interval, then retry with exponential backoff and jitter.
These limits protect service reliability. They are not fixed customer quotas and can become more specific while preserving the operation’s public contract.
Idempotent writes
Create, archive, restore, generation, and approval operations require anIdempotency-Key header. Choose an opaque value that is unique to one logical operation, such as a UUID.
Floral retains a completed result for 24 hours. An exact retry by the same token, workspace, and operation replays the original status, response body, ETag, Location, and X-Request-ID. Within that operation, reusing the key with a different canonical target, parsed body, or If-Match value returns 409 IDEMPOTENCY_CONFLICT. Keys are scoped per operation, but you should still choose a new key for every new logical request.
Optimistic concurrency
Mutable detail responses include a strongETag. Partial updates and state-changing actions require the latest value in If-Match.
ETag from the response. When Floral returns 412 VERSION_CONFLICT, reload the resource, reconcile your intended change with the current state, and retry with the new value. Do not retry a 412 automatically without reconciling.
Request IDs and audit expectations
Send a uniqueX-Request-ID of at most 128 characters for each logical request. Floral returns the effective ID in the response and in every error envelope. Idempotent replays return the original ID so you can correlate all attempts.
Record the following in your integration logs without storing tokens or sensitive body fields:
- the operation identifier, workspace slug, and resource ID;
- the idempotency key or resource version used;
- the response status, error code, and
X-Request-ID; - the time and outcome of each retry.
