The BlooBank API uses a single time representation everywhere: UTC ISO 8601 with millisecond precision. There are no time zones in the API contract — the burden of localization sits on your client.Documentation Index
Fetch the complete documentation index at: https://developers.bloobank.com/llms.txt
Use this file to discover all available pages before exploring further.
Timestamps in responses
Every timestamp returned by the API is formatted:Z (denoting UTC) is always present. The API never emits offsets like -03:00.
Parsing
All mainstream languages parse this format natively:| Language | Idiom |
|---|---|
| JavaScript | new Date(response.createdAt) |
| Python | datetime.fromisoformat(response['createdAt'].replace('Z', '+00:00')) (3.10+) |
| Go | time.Parse(time.RFC3339Nano, response.CreatedAt) |
| Java | OffsetDateTime.parse(response.getCreatedAt()) |
| Rust | chrono::DateTime::parse_from_rfc3339(&response.created_at) |
Display
Format with the user’s locale on the client side:Timestamps in requests
Most request bodies do not carry timestamps — those are server-assigned. The single exception is the signedX-Access-Timestamp header carrying the request time.
X-Access-Timestamp: milliseconds, not seconds
The signing protocol uses Unix epoch milliseconds, not seconds. A 2026-era timestamp is 13 digits, not 10:
Clock-skew tolerance: ±10 seconds
The Access Protocol rejects any request whoseX-Access-Timestamp is more than ±10 seconds from server time. This is tighter than typical cloud SDKs (which allow minutes), and it is non-negotiable.
Why so strict?
Tight clock-skew tolerance reduces the window in which a captured request can be replayed. Combined with the 1-hour deduplication ofX-Access-Request-Id, the protocol is robust against replay attacks without requiring nonce challenges or session tokens.
Common failure modes
| Symptom | Cause | Fix |
|---|---|---|
TIMESTAMP_INVALID (HTTP 400) | Sent seconds instead of milliseconds. | Multiply by 1000. |
TIMESTAMP_SKEW_EXCEEDED (HTTP 401) | Host clock drifted. | Enable chronyd / ntpd; verify with chronyc tracking. |
Random intermittent TIMESTAMP_SKEW_EXCEEDED | NTP refresh interval too long, or virtualized hosts with paused clocks. | Force a re-sync (chronyc makestep); check VM clock-drift settings. |
TIMESTAMP_SKEW_EXCEEDED only at deploy | Generating the timestamp at code-build time, not request-send time. | Read the clock once per request, immediately before signing. |
Server time as a fallback
If you cannot run NTP (e.g., shared CI runners), you can approximate by reading server time once and computing an offset. The server time is conveyed in theDate response header on every response — including error responses — so you can extract it from a previous call.
Time zones
The API contract has no notion of time zones. Every absolute moment is UTC. Convert at the edges:- Server → User: UTC timestamp → user’s local time on the client.
- User → Server: parse user input in their local timezone → UTC ISO 8601 → send.
filter expression:
Next
Sign a request
Where
X-Access-Timestamp fits in the canonical request.Filtering
How to filter list endpoints by date ranges.