Making requests
Every procedure is a typed function grouped under a router, namespaced as router.procedure, for example release.byId or search.releases. Reads are queries (GET); writes are mutations (POST).
The response envelope
Every successful response wraps the procedure’s return value in result.data:
Errors use a different envelope; see Errors.
Two dialects over one API
You can speak to the API two ways over HTTPS. Both hit the same engine and return the same envelope.
REST facade
Native tRPC
The friendly dialect for humans and curl. Replace the dot in a procedure name with a slash, and pass input as ordinary query parameters (GET) or a JSON body (POST):
Numeric inputs are coerced from strings, so ?id=895 validates against a number schema.
The split is unambiguous: a single dotted path segment (release.byId) is native tRPC; two or more slash segments (release/byId) is the REST facade. Every procedure is namespaced, so a real REST path is always at least two segments.
Pagination
List, search and discover procedures return a paged envelope. The page size is fixed at 20. Pass page (1-based, default 1) to walk the results:
Caching
Static reference data, configuration.details and the enum fields it describes (mediums, region codes, video standards, packaging styles), rarely changes. Cache it on your side rather than fetching it on every request.
TypeScript SDK
For end-to-end type safety in TypeScript, install the SDK. Every procedure is typed in and out, and calls made in the same tick are batched into one request.
The client is a standard tRPC client. If you’d rather build your own (e.g. with @trpc/tanstack-react-query), the SDK also exports the AppRouter type.

