Publish/Export API

The integration contract for external platforms that receive work published from Inkroost. Version 1.

1. Overview

Inkroost creators can publish a series or a single chapter directly to your platform. The creator authorizes the link between their Inkroost account and your platform once (OAuth2, below); after that, each publish is one HTTPS request from Inkroost to your ingest endpoint, carrying a JSON manifest and a ZIP package of the artwork.

To integrate, your platform implements three endpoints — an OAuth2 authorization page, an OAuth2 token endpoint, and an ingest endpoint — and registers our callback URL. No code is deployed on the Inkroost side per partner: an administrator enters your three endpoint URLs and OAuth client credentials, and creators can start publishing to you.

2. OAuth2 authorization

Inkroost is a standard OAuth2 client using the authorization-code grant. You issue us a client_id and client_secret for your platform.

Tokens are stored encrypted at rest, per creator and per platform, and are never written to logs.

3. The ingest endpoint

Each publish is one POST to the ingest URL you provide, authenticated with the creator's OAuth2 access token as a bearer token:

POST /your/ingest/endpoint HTTP/1.1
Authorization: Bearer <creator access token>
Content-Type: multipart/form-data

manifest = <JSON string, the manifest described in section 5>
package  = <ZIP file, the package described in section 4>

Respond with:

Uploads can be large (see limits, section 6) — accept streamed multipart bodies and allow several minutes for a full-series publish.

4. The package

package is a ZIP archive. Entry names are chosen so a plain lexical sort reproduces reading order:

manifest.json                 — the same JSON as the manifest form field
cover.png | cover.jpg | cover.webp   — series cover artwork, when one exists
chapter-001/page-001.png      — page artwork, zero-padded, in reading order
chapter-001/page-002.png
chapter-010-5/page-001.png    — fractional chapter numbers (10.5) use a dash

Asset technical specifications

5. The manifest

The manifest form field and the manifest.json archive entry are the same JSON document:

{
  "generator": "Inkroost",
  "manifest_version": 1,
  "published_at": "2026-08-30T12:00:00+00:00",
  "scope": "series",                  // or "chapter"
  "series": {
    "title": "…",
    "slug": "…",
    "synopsis": "…",
    "reading_direction": "ltr",       // "ltr" or "rtl" (manga)
    "reading_mode": "paged",          // "paged" or "vertical" (webtoon)
    "maturity_rating": "all_ages",    // "all_ages", "teen" or "mature"
    "genres": ["Fantasy", "Action"],
    "content_origin": "…",            // how the artwork was made, e.g. AI-assisted or hand-drawn
    "cover": "cover.png",             // archive entry name, or null
    "source_url": "https://…"         // canonical URL on Inkroost, or null
  },
  "creator": {
    "name": "…",                      // the creator's public name — attribute the work to it
    "profile_url": "https://…"        // or null
  },
  "chapters": [
    {
      "number": 1,
      "title": "…",
      "folder": "chapter-001",        // where this chapter's pages live in the ZIP
      "page_count": 24,               // pages actually in the ZIP
      "pages_missing": 0,
      "published": true,              // false = still a draft on Inkroost
      "access_mode": "free",          // or "supporter_only"
      "source_url": "https://…"
    }
  ],
  "chapter_count": 1,
  "page_count": 24,
  "pages_missing": 0
}

Fields may be added in future versions; unknown fields must be ignored. A breaking change increments manifest_version.

6. Limits

7. Security expectations

8. Becoming a partner

Implement the three endpoints, then send your authorization URL, token URL, ingest URL, scopes (if any) and OAuth client credentials to [email protected]. We register the integration and it appears on every creator's Integrations page.