Skip to main content
The manifest is the document your app reads to find its translations. This page is the contract: its exact shape, the cache headers, and the status codes. For how to use it, see Using a distribution in your app.

Endpoints

Both are public and unauthenticated — the manifest URL is the credential, so treat it as you would any unlisted URL. Both send Access-Control-Allow-Origin: *, so they work from a browser app on any origin. You never construct the blob URL yourself — take files[].url from the manifest. It’s absolute, so a distribution publishing to a customer-owned bucket or CDN needs no client change. Both appear in the generated API Reference under Content delivery.

The manifest

Fields

files[]

languageDetails[]

Always fall back — the field is optional and releases published before it existed don’t carry it:

Shape notes

  • files is an array, not a map keyed by language. A distribution split by module has several files per language, and keeping it an array made that an additive change rather than a breaking reshape.
  • The manifest is a bare JSON document, deliberately not the {success, data} envelope the rest of /api/v1 uses. The identical bytes are also written to object storage and read by clients that know nothing about TextSetu.

Caching

Files are content-addressed: the URL contains the content hash, so it never needs revalidating and a browser will not re-request it. Only the manifest is invalidated on publish — one path per release. stale-if-error=86400 means your app keeps working from the last good manifest for a day if the origin is unreachable. This is the main reason to read the manifest rather than hardcoding file URLs.

Conditional requests

Both endpoints support ETag. Send If-None-Match to get a 304:

Response headers


Status codes

A paused distribution and an unknown key return the identical 404 on purpose — the endpoint is unauthenticated, and distinguishing them would turn it into an oracle for probing valid keys. Going over quota does not black out your app by default: TextSetu keeps serving and sets X-TextSetu-Quota: exceeded.

Compatibility

What you can rely on:
  • New fields may be added to the manifest and to files[] at any time. Ignore what you don’t recognise.
  • minAppVersion, maxAppVersion and bundles are reserved. They’re always null/[] today so that version pinning and grouping can be added without breaking a client shipped now.
  • schema gets a new major version if anything breaking changes. Check it and refuse an unknown major rather than guessing.
  • languageDetails is optional. Always keep a fallback.