For developers

A model call isn't an ad.
A skill call is.

A skill is a pipeline you deploy once — it researches, scripts, renders, and cuts server-side, then hands back finished files. You write a typed manifest and a prompt; you call it from anywhere.

$10 free credit, no card, no subscription.

Build · ship · call

Write it once.
Call it anywhere.

A skill is a tiny skill.yaml manifest plus a SKILL.md prompt — or a Python function. Deploy it with the puras CLI and call it from any app with import puras — Python or TypeScript.

ugc-ad/
SKILL.md

Build your first skillpack — the full guide

Call it from your stack

Two SDKs, one job.

Official clients for Python and JavaScript/TypeScript start the same server-side job and hand back the same typed result — run it in one await, fire-and-check-back, or stream every step live from the JS client.

Python — pip install puras

The full toolkit: the client, the in-skill runtime, and the deploy CLI in one package.

python
import puras

client = puras.Client()   # PURAS_API_KEY from env

job = client.submit(
    "acme/ugc-ads/ugc-ad",
    {"product": product_url, "duration": 15},
)
# ...do other work while it runs...

job = client.wait(job["id"])
print(job["result"]["video"])
Python SDK reference

TypeScript / JavaScript — npm install puras

Zero-dependency client for Node, React, and React Native / Expo — anywhere fetch runs.

typescript
import { Puras } from "puras";

// Publishable key — safe to ship in a web or mobile app
const puras = new Puras({ apiKey: "puras_pub_…" });

const job = await puras.submit("acme/ugc-ads/ugc-ad", {
  product: photoUrl,
});

for await (const ev of puras.events(job.id)) {
  console.log(ev.type, ev.payload); // feed your progress UI
}

const done = await puras.get(job.id);
console.log(done.result);
JS/TS SDK reference

MCP

Or just tell your coding agent.

puras lives where you already work — Claude Code, Cursor, VS Code, and any MCP-capable client. Connect once; OAuth runs in the browser on the first call, so there's no key to paste. Your agent can scaffold a skillpack, deploy it, run skills, and tail jobs through the same server.

bash
claude mcp add --transport http puras https://mcp.puras.co/mcp

Any MCP client works — point it at https://mcp.puras.co/mcp (HTTP transport).

What you get

The backend around the job.

One job, the whole pipeline

A skill runs server-side as a single long-running job — it researches, generates media, and assembles the deliverable. Your app sends one request and gets the result: async, sync (wait=true), or streamed over SSE.

Versioned deploys & rollback

Every puras deploy is an immutable version. Activating one is a rolling switch — in-flight jobs finish on the version they started on — and rolling back is activating the previous version.

Live logs

Tail a job while it runs: every step, tool call, and model call as it happens — from the dashboard, the CLI, or the SSE stream.

Secrets

Per-skillpack secrets are injected into your skill's environment at run time, so keys for the services your skill calls never live in the bundle.

An exact cost receipt, every run

Each job returns a line-item breakdown — which models ran, how many tokens, what each media call cost — billed to the cent from a prepaid balance.

Models pinned in skill.yaml

The text, image, video, and audio models a skill uses are listed and pinned in its manifest. You see exactly what runs and what it costs — and you can override per run.

Publishable keys for client apps

puras_pub_ keys are built to ship in a web or mobile bundle: they can only submit jobs and read the jobs they submitted — and can be fenced to a skill allowlist and a daily spend cap when you mint them.

A drive for the outputs

Every run's files land in your workspace drive under a per-run folder and are served by stable signed URLs — download them, or hand them straight to your app.

Ship your first skill
today.

$10 free credit, no card, no subscription.