Skip to main content
Kynva is a deterministic design engine. The same input always produces byte-identical pixels. That property — determinism — is what makes the API safe to use in production pipelines, A/B systems, and CI.

The pipeline

Brief  ──►  Compile  ──►  Spec  ──►  Render  ──►  Pixels
 (intent)   (decisions)  (frozen)   (no choices)  (PNG/MP4/...)
StageWhat it doesWhat it doesn’t do
BriefCaptures user intent — copy, mood, audience, brand.Doesn’t specify layout, type sizes, or color values.
CompileResolves intent against your BrandKit and the design system. Every choice is pinned.Doesn’t render pixels.
SpecFrozen JSON contract — colors as hex, fonts as IDs, positions in px.Has no free variables. Identical Specs render identically.
RenderPure transformation from Spec to pixels.Makes no design decisions.

What this means for you

A Spec is content-addressable. If you keep the Spec, you can re-render the exact pixels months later. There are no model temperature surprises.
Every compile step writes a decisions log: why this font, why this color, which fallback fired. Audit trails come for free.
Drafts are versioned. Branch a Draft, tweak the brief, recompile. The expensive part (render) is skipped until you preview.
Style-lock rules in your BrandKit are enforced at compile time. If a brief asks for a color that violates the lock, the compiler rejects it with STYLE_LOCK_VIOLATION — before any pixels render.

The API surface

One canonical endpoint, two modes:

Sync preview

POST /api/v1/facade/generate   { "operation": "preview" }   → 200 + outputs
The response carries the rendered image URLs. Best when someone is waiting.

Async render

POST /api/v1/facade/generate   { "operation": "render" }    → 202 + job
GET  /api/v1/facade/render-jobs/{job_id}                     → status poll
Consume the job via webhooks, the status poll, or the SSE stream. Best for pipelines and batches — see the async guide.

Signed image URLs — the shortcut

POST /api/v1/generate/sign        → signed URLs (batch ≤100)
GET  /api/v1/generate/{template}  → 302 to the rendered PNG
URLs that render on first fetch and cache forever. Built for OG images and no-code embeds — no Authorization header needed at fetch time.

What you’ll meet across every endpoint

Authentication

Authorization: Bearer kyn_live_... on every request.

Idempotency

Idempotency-Key: <uuid v4> on every POST mutation.

Versioning

X-API-Version: 2026-01-01 pins the response shape.

Rate limits

Tiered per endpoint category, surfaced in headers.