Every resource in the BlooBank API carries a consistent set of identifier and metadata fields. Learning this shape once gives you a mental model that applies to every endpoint — wallets, payment orders, and any resource added in the future.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.
The standard envelope
Every resource includes these fields:| Field | Type | Purpose |
|---|---|---|
id | string | Server-assigned, opaque, immutable primary key. Prefixed by resource type (wal_, ord_). Safe for logs, audit trails, and database foreign keys. |
kind | string | Resource type discriminator (Tenant.Wallet, Payment.Order). Useful when polymorphic events or logs include resources of mixed types. |
<resource>Version | integer | Monotonic snapshot version. Increments on every content mutation. Used for ordering historical snapshots. |
name | string | Human-readable, caller-supplied identifier (e.g., the DNS label of a wallet). Unique within the resource type. |
selfName | string | Canonical relative resource name in the URL hierarchy (e.g., wallets/production-main/paymentOrders/ord_…). |
createdAt / updatedAt | string (ISO 8601) | UTC timestamps in YYYY-MM-DDTHH:mm:ss.sssZ format. |
etag | string (hex) | Content fingerprint of the resource. Reserved for optimistic concurrency control via If-Match in a future release. |
Two flavors of identifier
Most BlooBank resources expose two identifiers, and choosing the right one for your use case matters.id
Server-assigned. Opaque (
wal_2NhVqRtYbHmRdZ4vG6qAeL). Immutable. Use as your database key.name
Caller-supplied during creation. Human-readable (
production-main). Use in URLs and human-facing flows.id or name in path parameters for most endpoints — e.g., GET /wallets/{wallet} works with both wal_… and production-main. Internally, the API resolves the name to the id before processing.
Naming rules
name follows RFC 1035 DNS label rules:
| Rule | Detail |
|---|---|
| Length | 1–63 characters |
| Allowed characters | a-z, 0-9, - |
| First character | Must be a letter |
| Last character | Must be alphanumeric |
| Case | Lowercase only |
| Uniqueness | Globally unique within the resource type |
| Mutability | Immutable after creation. Attempting to change it returns LABEL_IMMUTABLE. |
Versioning fields
Different resources expose different*Version fields — walVersion for wallets, ordVersion for payment orders. The pattern is the same:
- Starts at
1on creation. - Increments by
1on every mutation of the resource’s tracked content. - Useful when reasoning about historical snapshots from event streams.
*Version is for tracking content changes, not concurrency control. For optimistic concurrency, use etag with the If-Match header (when the feature lands).The selfName convention
selfName is the canonical relative name of the resource — the path you would use to reference it inside the API.
Examples:
| Resource | selfName |
|---|---|
| Wallet | wallets/production-main |
| Payment order | wallets/production-main/paymentOrders/ord_3KpFvBwYzNqMxA7eHbRdJ |
selfName is what you would log or persist when you need a portable, base-URL-agnostic reference.
Timestamps
All timestamps are ISO 8601 in UTC with millisecond precision:Z is required. The API never returns timestamps in local time. See Date & time for client-side parsing notes.
etag — reserved
Every resource carries an etag — a hex-encoded SHA-256 fingerprint of the resource content. Today it is informational only. In a future release, it will support optimistic concurrency control via the If-Match request header:
etag will fail fast with a clear error rather than overwriting a concurrent modification.
Next
Amounts & currency
How money is represented across the API.
Date & time
UTC, ISO 8601, and request-signing clock skew.