Conventions
Versioning, media types, identifiers, decimal and timestamp formats, envelopes, pagination, and reliability rules shared by every endpoint.
Draft v0.1 — design contract, not yet a live service
This documentation set defines a proposed Time Seventeen protocol for review and implementation planning. https://api.t17.capital is the approved and reserved REST origin, but neither that origin nor any documented endpoint is claimed to be live. The WebSocket origin remains unspecified. Credentials, chain IDs, contract addresses, rate limits, and SLAs remain unapproved; IDs, prices, and timestamps shown throughout are illustrative, not real production data.
Every REST endpoint in this reference shares the conventions on this page. Endpoint-specific pages document only what differs.
Base URL and versioning
https://api.t17.capital/v1/v1 is the major version and appears in every path. Breaking schema or signed-payload changes require a new major version (see Compatibility). The base host is a production configuration placeholder — Draft v0.1 does not publish a real domain.
Media type
All requests and responses use application/json unless an endpoint explicitly documents otherwise. Request bodies use UTF-8 JSON.
Identifiers
- Resource IDs are stable, opaque strings with a human-readable type prefix (for example
idx_,mkt_,ord_,fill_). Clients MUST NOT derive semantics from the prefix. - Slugs and symbols are mutable presentation fields, never foreign keys.
- Counters and sequence numbers are JSON integers, used only while guaranteed to stay within an interoperable integer range.
Field naming
All JSON fields use snake_case.
Fixed-point decimal strings
Monetary values, probabilities, index levels, quantities, weights, rates, fees, and P&L are base-10 strings, never floating-point JSON numbers, plus explicit scale/unit metadata where ambiguity is possible.
{
"level": "128.4500000000",
"unit": "index_points",
"quantity": "150.00",
"price": "0.6400",
"fee": "0.32"
}Binary market probabilities/prices fall within [0, 1]; Time Seventeen does not assume an integer-cent representation.
Timestamps
Primary human-readable timestamps are RFC 3339 UTC with a trailing Z. Latency-sensitive events additionally include a Unix epoch millisecond integer in a *_ts_ms field.
{
"published_at": "2026-08-31T12:00:00Z",
"published_at_ts_ms": 1788350400000
}Missing vs. zero
Missing means unavailable or not applicable. Zero means a measured zero. Endpoints do not coerce missing data to zero — a missing field is omitted or explicitly null, never silently defaulted.
Response envelopes
Single resource:
{
"data": {},
"meta": {
"request_id": "req_demo_001",
"published_at": "2026-08-31T12:00:00Z",
"schema_version": "1.0"
}
}Collection:
{
"data": [],
"page": {
"next_cursor": null,
"has_more": false
},
"meta": {}
}Every response includes meta.request_id, which also appears as the T17-Request-Id response header and inside every error envelope for support/trace correlation.
Query behavior
- Cursor pagination is used for mutable or high-volume collections. Cursors are opaque and bound to the filters/sort in effect when they were issued — changing filters invalidates a cursor.
- Default ordering and supported sort fields are documented per endpoint; unsupported sort fields return a validation error.
- Time ranges use an inclusive
start_timeand an exclusiveend_time. as_ofrequests a point-in-time view and MUST NOT silently return the current version.expandembeds named related resources inline; otherwise relationships are represented as IDs/links only.- Unknown filters, enum values, expansion paths, and sort fields return a
VALIDATION_*error rather than being silently ignored.
GET /markets?status=open&venue=ven_demo_001&cursor=opaque_cursor_abc&limit=50
GET /indexes/idx_demo_conflict_001/prices?start_time=2026-08-01T00:00:00Z&end_time=2026-08-31T00:00:00Z
GET /indexes/idx_demo_conflict_001/versions/ver_demo_001/constituents?expand=marketReliability
- Safe (read) requests are retryable with bounded exponential backoff and jitter.
- Mutating requests require an
Idempotency-Keyheader. An identical replay of the same key and canonical body returns the original semantic result; reuse of the same key with a different canonical body returnsIDEMPOTENCY_CONFLICT. Idempotency-key retention is a production configuration value, not fixed by Draft v0.1. - Rate-limit headers expose limit class, remaining capacity, reset/retry timing, and request cost. Draft v0.1 defines the header shape only — no numeric quota is specified.
T17-RateLimit-Limit-Class: market_data
T17-RateLimit-Remaining: 42
T17-RateLimit-Reset: 1788350460
T17-RateLimit-Cost: 1- Public immutable data (published Index Versions, superseded price observations, historical ratings/severity records) permits long-lived caching and
ETag/If-None-Matchconditional requests. Current prices and states instead expose an explicit freshness indicator such asmax_age_msso a client can judge how live a “current” read is.
Batch semantics
Batch endpoints are item-addressable: each item in the request maps to an independently reported success or failure in the response, so a partial failure never hides which items succeeded.
{
"data": [
{ "index": 0, "status": "accepted", "order_id": "ord_demo_001" },
{ "index": 1, "status": "rejected", "error": { "code": "ORDER_TICK_SIZE_INVALID" } }
],
"meta": { "request_id": "req_demo_002" }
}Errors
See Errors for the full structured error model and code families.
Compatibility and evolution
- The major version lives in the URL path and, for signed order/authorization payloads, in the EIP-712 domain.
- Additive response fields are allowed within a major version. Clients ignore unknown fields but MUST NOT ignore unknown enum values that change economic behavior (for example an unrecognized order status or time-in-force value).
- Stream messages carry an independent event schema version (see WebSocket).
- Deprecation announcements and coexistence windows are production policy, not fixed by this draft.
- Historical records remain readable using the schema and methodology version that produced them.