Success envelopes

REST reads return JSON with an outer data key. The payload inside it depends on the endpoint: Current game odds use this structure (illustrative empty payload):
Use the endpoint’s response schema instead of assuming every list is a bare array or recursively unwrapping every property named data. Canonical reads commonly use snake_case, while some soccer analytics and provider-derived statistics retain camelCase.

Metadata

Authenticated catalog handlers include _meta.request_id but generally omit cache metadata. Service metadata, token/tenant introspection, and public coverage have separate schemas and may omit _meta. The endpoint reference expands nested response attributes by default. For a directory, read data.items[] for the entity’s fields; for a single entity, read data. The generated response example also shows nested fields. Team and player views retain their canonical identity, names, league-specific attributes, timestamps, and asset metadata, then add a resolved logo_url or headshot_url. Soccer competition views and Proto mapped fixtures likewise retain their embedded canonical fields. These added fields do not replace the underlying entity. Optional fields may be absent; nullable fields or uninitialized collections can be null. Neither omission nor null means zero. Preserve numeric zero when explicitly present.

Errors

Branch on error.code and HTTP status. Messages can change. details is optional and varies by code; it may be absent, null, or a context object. See each operation for its statuses. The public reads do not share a general 204, 409, or field-validation response contract beyond these behaviors.

Empty and unavailable data

Empty results retain the endpoint’s own shape: data: [], data.items: [], data.data.markets: {}, or another documented collection. A successful list can be empty because of filters, ingestion coverage, an off-season, or a provider limitation. Soccer analytics can return data.available=false with a reason when a competition or measure cannot be resolved. KBL injury reads instead return data.availability="provider_unavailable" and data.reason="dated_injury_feed_not_exposed". These are successful availability responses, not evidence that every player is healthy. See IDs, Assets & Availability and Rate Limits & Quota before deciding whether to retry or count a response as complete.