> ## Documentation Index
> Fetch the complete documentation index at: https://docs.kynva.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Quickstart

> From signup to a rendered PNG in five minutes.

By the end of this guide you'll have made your first authenticated render against the Kynva API and have a URL to the finished PNG.

<Note>
  You'll need a terminal and either `curl`, Node 18+, or Python 3.9+.
</Note>

## 1. Sign up and grab an API key

<Steps>
  <Step title="Create an account">
    Go to [www.kynva.ai/sign-up](https://www.kynva.ai/sign-up) and sign up. The free tier includes 50 renders/month to try the API.
  </Step>

  <Step title="Create an API key">
    Open [Settings → API Keys](https://www.kynva.ai/api-keys) and click **Create key**. Pick a descriptive name like `quickstart-local`.

    You'll see a one-time secret that looks like:

    ```
    kyn_live_abc123def456...
    ```

    Copy it now — you won't be able to see it again. Treat it like a password.
  </Step>

  <Step title="Export it as an env var">
    <CodeGroup>
      ```bash macOS / Linux theme={null}
      export KYNVA_API_KEY="kyn_live_..."
      ```

      ```powershell Windows (PowerShell) theme={null}
      $env:KYNVA_API_KEY = "kyn_live_..."
      ```
    </CodeGroup>
  </Step>
</Steps>

## 2. Make your first render

Everything in Kynva flows through one endpoint:
[`POST /api/v1/facade/generate`](/api-reference/generate/generate). You send a
`RenderForgeRequestV1` — your content, a brand kit, and an export target — and
with `"operation": "preview"` the response comes back synchronously with the
rendered output.

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST "https://api.kynva.ai/api/v1/facade/generate" \
    -H "Authorization: Bearer $KYNVA_API_KEY" \
    -H "Content-Type: application/json" \
    -H "X-API-Version: 2026-01-01" \
    -H "Idempotency-Key: $(uuidgen)" \
    -d '{
      "spec_type": "renderforge_request",
      "spec_version": "1.0",
      "operation": "preview",
      "generation_type": "image",
      "intent": {
        "identity": {
          "request_id": "quickstart-001",
          "brand_id": "default",
          "source": "direct_api"
        },
        "content": {
          "spec_type": "content",
          "spec_version": "1.0",
          "headline": "Summer Sale",
          "subhead": "Everything 30% off",
          "cta": "Shop now"
        },
        "assets": { "spec_type": "assets", "spec_version": "1.0" },
        "brand_kit": {
          "spec_type": "brand_kit",
          "spec_version": "1.0",
          "brand_id": "default",
          "kit_version": "1.0",
          "status": "active",
          "fonts": [{ "family": "Inter", "weights": [400, 600, 700] }],
          "colors": { "bg": "#ffffff", "text": "#1a1a1a", "accent": "#2563eb" },
          "logos": { "light": "", "dark": "" },
          "safe_profiles": {},
          "policies": {}
        },
        "style_brief": {
          "spec_type": "style_brief",
          "spec_version": "1.0",
          "mode": "auto",
          "tone": ["bold", "vibrant"]
        },
        "export_intent": {
          "spec_type": "export_intent",
          "spec_version": "1.0",
          "primary": {
            "platform": "instagram",
            "format": "png",
            "profile_id": "ig_square_1x1"
          }
        }
      },
      "execution": {
        "execution_mode": "preview",
        "seed": 42,
        "quality_floor": 70
      }
    }'
  ```

  ```typescript Node (SDK) theme={null}
  // npm install @kynva/sdk
  import { KynvaClient } from "@kynva/sdk";

  const kynva = new KynvaClient({ apiKey: process.env.KYNVA_API_KEY! });

  const res = await kynva.generate({
    spec_type: "renderforge_request",
    spec_version: "1.0",
    operation: "preview",
    generation_type: "image",
    intent: {
      identity: { request_id: crypto.randomUUID(), brand_id: "default", source: "direct_api" },
      content: {
        spec_type: "content", spec_version: "1.0",
        headline: "Summer Sale", subhead: "Everything 30% off", cta: "Shop now",
      },
      assets: { spec_type: "assets", spec_version: "1.0" },
      brand_kit: {
        spec_type: "brand_kit", spec_version: "1.0",
        brand_id: "default", kit_version: "1.0", status: "active",
        fonts: [{ family: "Inter", weights: [400, 600, 700] }],
        colors: { bg: "#ffffff", text: "#1a1a1a", accent: "#2563eb" },
        logos: { light: "", dark: "" }, safe_profiles: {}, policies: {},
      },
      style_brief: { spec_type: "style_brief", spec_version: "1.0", mode: "auto", tone: ["bold", "vibrant"] },
      export_intent: {
        spec_type: "export_intent", spec_version: "1.0",
        primary: { platform: "instagram", format: "png", profile_id: "ig_square_1x1" },
      },
    } as never,
    execution: { execution_mode: "preview", seed: 42, quality_floor: 70 },
  });

  console.log(res.outputs?.[0]?.url); // → https://cdn…/….png
  ```

  ```python Python theme={null}
  import json, os, uuid, urllib.request

  request = {
      "spec_type": "renderforge_request",
      "spec_version": "1.0",
      "operation": "preview",
      "generation_type": "image",
      "intent": {
          "identity": {"request_id": str(uuid.uuid4()), "brand_id": "default", "source": "direct_api"},
          "content": {
              "spec_type": "content", "spec_version": "1.0",
              "headline": "Summer Sale", "subhead": "Everything 30% off", "cta": "Shop now",
          },
          "assets": {"spec_type": "assets", "spec_version": "1.0"},
          "brand_kit": {
              "spec_type": "brand_kit", "spec_version": "1.0",
              "brand_id": "default", "kit_version": "1.0", "status": "active",
              "fonts": [{"family": "Inter", "weights": [400, 600, 700]}],
              "colors": {"bg": "#ffffff", "text": "#1a1a1a", "accent": "#2563eb"},
              "logos": {"light": "", "dark": ""}, "safe_profiles": {}, "policies": {},
          },
          "style_brief": {"spec_type": "style_brief", "spec_version": "1.0", "mode": "auto", "tone": ["bold", "vibrant"]},
          "export_intent": {
              "spec_type": "export_intent", "spec_version": "1.0",
              "primary": {"platform": "instagram", "format": "png", "profile_id": "ig_square_1x1"},
          },
      },
      "execution": {"execution_mode": "preview", "seed": 42, "quality_floor": 70},
  }

  req = urllib.request.Request(
      "https://api.kynva.ai/api/v1/facade/generate",
      data=json.dumps(request).encode(),
      headers={
          "Authorization": f"Bearer {os.environ['KYNVA_API_KEY']}",
          "Content-Type": "application/json",
          "X-API-Version": "2026-01-01",
          "Idempotency-Key": str(uuid.uuid4()),
      },
  )
  with urllib.request.urlopen(req) as resp:
      body = json.load(resp)
  print(body["outputs"][0]["url"])
  ```
</CodeGroup>

The response includes an `outputs` array — each entry has the rendered
image's `url`, dimensions, and format:

```json theme={null}
{
  "spec_type": "renderforge_response",
  "status": "ok",
  "outputs": [
    {
      "profile_id": "ig_square_1x1",
      "format": "png",
      "platform": "instagram",
      "url": "https://cdn.kynva.ai/previews/prv-…/ig_square_1x1.png",
      "width": 1080,
      "height": 1080
    }
  ]
}
```

Open the URL — that's your design.

## 3. Run it again — get the same bytes

Run the exact same request a second time. The output is **byte-identical** —
same layout, same pixels. That's the [determinism
contract](/concepts/determinism): same request + seed → same design, forever.
Change `"seed": 42` to another number for a different (but equally
reproducible) layout take.

## Where to go next

<CardGroup cols={2}>
  <Card title="Render with your real brand" icon="palette" href="/guides/render-with-brand">
    Build a brand kit from your website with one call, then render on-brand.
  </Card>

  <Card title="Async render jobs" icon="clock" href="/guides/async-render-jobs">
    Queue renders, poll status, or get webhooks — for pipelines and batches.
  </Card>

  <Card title="Signed image URLs" icon="link" href="/api-reference/generate/sign-url">
    The OG-image primitive: URLs that render on first fetch, cached forever.
  </Card>

  <Card title="Webhooks" icon="webhook" href="/webhooks/overview">
    render.completed / render.failed with HMAC-signed deliveries.
  </Card>
</CardGroup>
