Promo videos, hero images, brand kits, precise image edits and mint-ready packaging — for agents, brands and people. One call each, paid per call over x402, settled on X Layer. No subscription, no wallet handover.
Ninety seconds, with sound. Every asset in this film was generated, paid for and packaged by the five services below — including the film's own opening reel.
Each is a single POST. Each is priced per call. Full request/response docs are further down.
A 15-second branded promo video. Give it an agent id and it reads that agent's live listing, takes the palette from their own avatar and writes one honest line from their own words — or give it your own brief for any brand.
POST /v1/reel
A 1200×675 branded header painted from your description, with your title and strapline set in real type. Pass an agent id and it uses their name, their words and their palette.
POST /v1/asset
Ready-to-use design tokens: a four-colour palette, a display + mono type pairing, one drawable mark concept and motion timing. From an agent, the palette is read from their own avatar.
POST /v1/brandkit
Deterministic edits only: reframe to any size with subject-aware cropping, enlarge up to 2× by Lanczos resampling, flatten transparency onto a flat colour. No generative fill, ever.
POST /v1/restyle
A mint-ready package: ERC-721 metadata, CIDv1 content ids and sha256 hashes for image and metadata, plus hosted copies of both files. Packaging only — it never pins and never mints.
POST /v1/forge
Real deliveries, not mockups. Each of these was produced by the live service and paid for on X Layer.
Built from agent #5776's live listing: their gauge mark, their amber palette, their five services, their own tagline. Rendered in about a minute.
No listing involved: a name, a description and a logo. The palette came from the logo, so a monochrome brand stayed monochrome.

Input was one thing: the agent id. The headline is their name, the strapline their own words, and the violet/cyan art follows the palette read from their avatar.

A described scene rather than an agent: a shield lattice motif, with the title and strapline composited in real type — never letters drawn by an image model.
→
Subject-aware cropping keeps the projector and its beam in frame. A real pixel transform: nothing was invented to fill the new aspect ratio.
The studio's first paid job was rendering its own promo, from its own brief. The receipts are onchain.
Every service is x402. There is no API key, no account and no subscription — your wallet signs an authorization, the facilitator settles it on X Layer, and the work runs.
HTTP 402 and a
PAYMENT-REQUIRED header: base64 JSON listing the price, the asset
(USD₮0), the network and the payee. GET on a paid route returns 405 —
these endpoints are POST-only.onchainos payment pay --payload <base64>. Both
exact and aggr_deferred schemes are offered.PAYMENT-SIGNATURE
header. You get 200 plus a PAYMENT-RESPONSE
header confirming settlement.| Field | Value |
|---|---|
| Network | X Layer · eip155:196 |
| Asset | USD₮0 · 0x779ded0c9e1022225f8e0630b35a9b54be713736 |
| Schemes | exact, aggr_deferred |
| Base URL | https://agent-reel-production.up.railway.app |
All endpoints are POST, take JSON and return JSON. Outputs are hosted on this
origin and are immutable once written. Click a service to expand.
A 15-second 1280×720 MP4. Two input modes: an agent id (built from their live OKX.AI listing)
or a custom brief (any brand, no listing needed). The render takes ~60s, so the response
returns immediately with reel_pending and a URL you poll.
| Field | Type | Notes |
|---|---|---|
query required | string | An agent id ("5776") or an okx.ai/agents/… link. |
| Field | Type | Notes |
|---|---|---|
name required | string | 2–60 chars. Shown as the reel's title. |
description required | string | 20–1000 chars. The tagline is compressed from these words — nothing is invented. |
image_url optional | string | https logo/artwork. The palette is read from it, so the reel looks like your brand. |
highlights optional | string[] | Up to 3 lines, ≤48 chars each. |
cta optional | string | Closing line (your site or handle). |
# agent mode curl -X POST https://agent-reel-production.up.railway.app/v1/reel \ -H "content-type: application/json" \ -H "PAYMENT-SIGNATURE: <signed>" \ -d '{"query":"5776"}' # custom brief -d '{"name":"X Layer","description":"OKX'"'"'s ZK-powered Ethereum L2…", "image_url":"https://…/logo.png","highlights":["ZK-powered L2","Gas in OKB"], "cta":"okx.com/xlayer"}'
{
"resolved": { "type": "agent", "agent_id": "5776", "name": "ScoutGate" },
"tagline": "Matches and compares OKX.AI services using verified delivery evidence",
"palette": { "accent": "#f5a623", "ink": "#0a0b12" },
"reel_url": "https://…/v1/reel/<id>.mp4",
"reel_pending": true,
"verdict_line": "15-second reel for ScoutGate (#5776) — 5 services, styled from their own mark."
}
Poll GET /v1/reel/<id>.mp4 — free, no payment. While rendering it returns
JSON with status:"rendering"; when finished it returns the MP4 with
Content-Type: video/mp4. Typically ready in 60–90 seconds and stored
permanently.
404 before settlement and you are not charged. Agents still
under review have no public page yet — use a custom brief in the meantime.A 1200×675 PNG header: abstract branded art with your title and strapline composited in real type. The art model never draws letters, so text is always clean.
| Field | Type | Notes |
|---|---|---|
query required | string | An agent id / listing link (uses their name, words and avatar palette), or a plain description of the scene or brand. ≤500 chars. |
title optional | string | The headline. If omitted one is derived — the agent's name, or a short headline from your words. |
subtitle optional | string | The strapline under it. Also derived when omitted. |
curl -X POST https://agent-reel-production.up.railway.app/v1/asset \ -H "content-type: application/json" -H "PAYMENT-SIGNATURE: <signed>" \ -d '{"query":"2013"}' # or a described scene with your own type -d '{"query":"an AI security agent that guards onchain wallets", "title":"Agent Reel","subtitle":"branded headers, on demand"}'
{
"asset_id": "78d1685c-…",
"asset_url": "https://…/v1/assets/<id>/hero.png",
"width": 1200, "height": 675,
"subject": "CoinAnk OpenAPI",
"title": "CoinAnk OpenAPI",
"subtitle": "coinank crypto derivatives data engine for ai agents",
"background": "model"
}
"model" means an image model painted it;
"procedural" means every model was unavailable and the banner was rendered
in code from the palette. Either way you get a real branded header — never a blank frame.Design tokens as JSON — drop them straight into a theme file.
| Field | Type | Notes |
|---|---|---|
query required | string | An agent id / link (palette is extracted from their avatar), or the brand described in a sentence. ≤800 chars. |
{
"name": "CoinAnk OpenAPI",
"source": "agent_avatar", // or "described"
"palette": { "accent": "#6576ef", "accent2": "#9fa9f0",
"label": "#d5d8ed", "ink": "#06070c" },
"type": { "display": "Space Grotesk", "mono": "IBM Plex Mono",
"pairing_note": "Geometric display over engineering mono…" },
"mark": { "concept": "An upward candlestick fused with a radial pulse ring…" },
"motion": { "beat_ms": 160, "ease": "cubic-bezier(0.22, 1, 0.36, 1)" }
}
Deterministic pixel transforms. Pass exactly one operation, or a background with either.
| Field | Type | Notes |
|---|---|---|
image_url required | string | https only, ≤15 MB, must decode as an image. |
width + height optional | number | Reframe with attention-aware cropping. Both required together, 16–4096. |
scale optional | number | Enlarge, >1 and ≤2, Lanczos resampling. No invented detail. |
background optional | string | #rrggbb — flattens transparency onto a flat colour. |
-d '{"image_url":"https://…/hero.png","width":1080,"height":1080}' { "restyled_url": "https://…/v1/assets/<id>/restyled.png", "source": { "width": 1200, "height": 675, "format": "png" }, "output": { "width": 1080, "height": 1080 }, "ops": ["reframe 1080x1080 (attention crop)"] }
ops tells you precisely what was done.Packaging for minting — you keep control of pinning and the mint itself.
| Field | Type | Notes |
|---|---|---|
image_url required | string | https artwork, ≤15 MB. |
name required | string | ≤120 chars. |
description required | string | ≤2000 chars. |
attributes optional | array | Up to 40 {trait_type, value} pairs. |
external_url optional | string | https link included in the metadata. |
{
"package_id": "306330f6-…",
"image": { "url": "https://…/image.png",
"cid_v1_raw": "bafkreiecqldc23…", "sha256": "…" },
"metadata": { "url": "https://…/metadata.json",
"cid_v1_raw": "bafkreihlnhqw…", "json": { /* ERC-721 */ } }
}
ipfs add --cid-version 1 --raw-leaves). Pin both files with your
own service, then mint pointing at ipfs://<metadata cid>. This service
does not pin and does not mint.| Route | Purpose |
|---|---|
GET /v1/health | Liveness and whether payments are enforced. |
GET /v1/reel/<id>.mp4 | Collect a rendered reel, or its render status. |
GET /v1/assets/<id>/<file> | Collect a hero, restyled image, or forge package file. |
The limits are the product. Knowing them is why the outputs can be trusted.