Manifest

The JSON document every add-on serves at /manifest.json. It tells wako who you are and what you offer.

The manifest is the first thing wako fetches when a user installs your add-on. It is also the only thing that gets re-fetched periodically (once a day) to pick up upstream changes. Keep it small, stable, and accurate — it defines the contract for every other request.

Endpoint

HTTP
GET https://your-host.example/manifest.json

The response is a single JSON object. Unknown fields are preserved by wako but ignored.

Example

JSON
{
  "id": "com.example.my-addon",
  "name": "My Add-on",
  "description": "Provides curated catalogs and high-quality streams.",
  "version": "1.2.0",
  "logo": "https://my-host.example/logo.png",
  "background": "https://my-host.example/background.jpg",
  "resources": [
    "catalog",
    "meta",
    {
      "name": "stream",
      "types": ["movie", "series"],
      "idPrefixes": ["tt"]
    }
  ],
  "types": ["movie", "series"],
  "catalogs": [
    {
      "type": "movie",
      "id": "top-movies",
      "name": "Top movies",
      "extra": [
        { "name": "search" },
        { "name": "skip" },
        { "name": "genre", "options": ["Action", "Drama"] }
      ]
    }
  ],
  "idPrefixes": ["tt"],
  "behaviorHints": {
    "configurable": true,
    "p2p": false
  },
  "contactEmail": "dev@example.com"
}

Fields

Identity

FieldTypeDescription
id
required
stringA reverse-DNS identifier for the add-on (com.example.my-addon). It is used as part of the persisted ID, but two installs of the same id from different URLs are kept separate, so users running multiple instances (different configurations) do not conflict.
name
required
stringThe display name shown in Settings > Extensions, in the stream list, and in catalog row headers. Keep it short — long names get truncated on phones and TV cards.
descriptionstringA one- to two-sentence summary shown on the add-on detail page in wako.
version
required
stringA SemVer string (1.2.0). Bump it whenever the manifest itself changes — but wako also detects content changes even when the version is the same, so a missed bump will not silently break things.
logostring (URL)Square logo used next to your add-on name. PNG, JPG or WebP. 256×256 renders well across phones, tablets, and TV.
backgroundstring (URL)Wide background image used in the add-on detail screen. 1920×1080 works well.
contactEmailstringPublic email displayed to users who want to report an issue with your add-on.

Resources & types

These two fields tell wako which endpoints to call on your add-on and for which content kinds.

FieldTypeDescription
resources
required
string[] | object[]The list of resource families your add-on serves. Each entry is either a plain string ("catalog", "meta", "stream", "subtitles") or an object with finer scope:
JSON
{
  "name": "stream",
  "types": ["movie", "series"],
  "idPrefixes": ["tt"]
}
When types or idPrefixes is present on a resource entry, it narrows what wako sends to that resource specifically.
types
required
string[]The content kinds your add-on supports across all resources. Common values: movie, series, anime. wako will not send a request whosetype is not in this list.
idPrefixesstring[]Restricts the IDs wako will pass to your add-on. With ["tt"], only IMDb-prefixed IDs reach you (tt0111161). If your add-on handles its own ID scheme, declare your prefix here so wako can route requests correctly.
i
Two ways to scope a resource
Scoping at the resource level ({ name: "stream", types: [...] }) is more precise than scoping at the manifest level. Resource-level types and idPrefixes take priority. The manifest-level fields are the fallback.

Catalogs

FieldTypeDescription
catalogs
required
object[]An array of catalog definitions — each is a row that can appear on the home screen and inside the explore section. Empty array is valid for add-ons that only provide streams or subtitles. See the Catalog page for the full structure.
addonCatalogsobject[]Reserved for advanced uses where an add-on lists other add-ons. Not required for normal add-ons.

Behavior hints

FieldTypeDescription
behaviorHints.adultbooleanMarks the add-on as adult-only. wako can apply parental restrictions to it.
behaviorHints.p2pbooleanSet to true when the add-on returns peer-to-peer streams (info-hashes). wako uses this to display the right hint to the user.
behaviorHints.configurablebooleanSet to true when your add-on has user-facing configuration. wako shows a configuration button that opens your configuration URL in the device browser. See wako specifics for the configuration flow.
behaviorHints.configurationRequiredbooleanWhen true, wako forces the user to open the configuration page before the add-on can be used.

Configuration

Many add-ons expose configuration via the URL itself: users open your configuration page in a browser, fill a form, and end up with a URL like https://my-host.example/CONFIG_STRING/manifest.json — that URL is what they paste into wako. This is the most reliable configuration pattern because it makes the configuration part of the installed add-on's identity.

FieldTypeDescription
configobject[]Optional inline configuration descriptor. Each entry has key, type (text, number, password, checkbox, select), and may include default, title, options, required. The URL-based pattern above is generally preferred.
!
Required keeps existing add-ons working
Only id, name, version, resources, types, and catalogs (possibly empty) are strictly required. Every other field is optional and wako applies sensible defaults when absent.

Validation

wako validates the manifest before storing it. Responses that are not valid JSON, or that lack a required field, are rejected with a clear error to the user. Unknown fields are kept verbatim — wako uses a passthrough parser, so your add-on can ship extra metadata that future wako versions might pick up without breaking compatibility today.

Updates

wako re-fetches every installed manifest at most once every 24 hours, and only writes the new copy to storage when the JSON is structurally different (not just a version bump). The user can also trigger an immediate refresh from the add-on detail page, which bypasses any CDN cache.