# Game Ad Studio

> Agent skillpack on puras — published by puras. An AI UA creative studio for mobile games: playable ads, video ads, end cards, karaoke captions, and aspect-ratio cuts — from a store link, a brief, or the game art you already have.

- **Skillpack path:** `puras/game-ad-studio`
- **Skillpack ID:** `0dac04f5-5e73-44d7-8c47-adc9977250e5`
- **Deployment version:** v74
- **Skills in pack:** 5
- **Human page:** https://puras.co/skills/puras/game-ad-studio
- **API base:** `https://api.puras.co`

## Use these skills

puras runs these skills on its own backend — you send inputs and get the result back. Three ways to call, fastest first:

### 1. MCP server — recommended for coding agents, no API key

Connect the puras MCP server; auth is OAuth in the browser on first call, so there is nothing to paste.

```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). Then ask the agent to run `<skill>` from skillpack `puras/game-ad-studio` with your inputs.

### 2. CLI / Python SDK — `pip install puras`

```bash
pip install puras
puras login            # or set PURAS_API_KEY
puras run puras/game-ad-studio/<skill> -i key=value
```

From Python:

```python
import puras

client = puras.Client()   # PURAS_API_KEY from env
result = client.run("puras/game-ad-studio/<skill>", {})
```

### 3. HTTP API

`wait=true` blocks until the run reaches a terminal status and returns the result inline.

```bash
curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/game-ad-studio&wait=true" \
  -H "Authorization: Bearer $PURAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"skill":"<skill>","inputs":{}}'
```

Mint an API key (for CLI / SDK / API) from https://puras.co/api-keys.

## Skills

- `2d-playable-ad` — AI Playable Ad Generator: An AI playable ad generator that turns a short brief plus your game's logo and sprites into a real HTML5 mini-game playable ad. The agent researches your game, designs the core mechanic itself, and engineers it on a purpose-built 2D engine — shipping one self-contained, MRAID-ready HTML file (under 5 MB, assets inlined) you can drop straight into AppLovin, Unity, Meta, TikTok, or any ad network. No coding, no QA cycles, no HTML5 dev team.
- `aspect-ratio-converter` — Aspect Ratio Converter: Resizes a single image to the aspect ratios you need (9:16, 4:5, 1:1, 16:9). Pick a clean center-crop, or let it intelligently re-compose the scene to fill the new frame — no bars, no empty edges.
- `auto-caption` — Auto-Caption Burner: Burns word-synced karaoke captions onto your video — the whole line stays on screen and each word lights up as it's spoken, the look built for muted TikTok, Reels, and Shorts feeds. Add your brand or product names and it spells them correctly every time.
- `end-card-generator` — AI End Card Maker: An AI end card maker for mobile game ads. Drop in your game's logo, a few reference images, and a call-to-action and it pulls the characters, colors, and mood from your art into polished, install-driving end card creatives — in the placement sizes UA networks need (9:16 by default, plus optional 1:1 and 16:9).
- `game-ad-generator` — AI Game Ad Generator: Turn a game's store link — or whatever media you have — into a finished, captioned mobile-game video ad. Paste an App Store / Google Play URL or drop screenshots and gameplay footage, and it builds a thumb-stopping UA creative (hook, mid payoff, and CTA end card) with burned-in captions for sound-off feeds. A store-link-to-video and gameplay-to-ad generator for mobile-game user acquisition.

### AI Playable Ad Generator (`2d-playable-ad`)

An AI playable ad generator that turns a short brief plus your game's logo and sprites into a real HTML5 mini-game playable ad. The agent researches your game, designs the core mechanic itself, and engineers it on a purpose-built 2D engine — shipping one self-contained, MRAID-ready HTML file (under 5 MB, assets inlined) you can drop straight into AppLovin, Unity, Meta, TikTok, or any ad network. No coding, no QA cycles, no HTML5 dev team.

Spec: https://puras.co/skills/puras/game-ad-studio/2d-playable-ad.md

**Input schema**

```json
{
  "type": "object",
  "required": [
    "logo",
    "sprites",
    "game_name",
    "cta_text",
    "store_url"
  ],
  "properties": {
    "logo": {
      "type": "image",
      "description": "The game's logo (transparent PNG preferred). Shown on the end card."
    },
    "brief": {
      "type": "string",
      "description": "Free-form direction for the playable: what the game is and what to feature — the core fantasy, the genre, the one mechanic and hook you want, the feeling to convey. The engineer researches the game (and the store listing) and designs the core concept itself, so this is guidance, not a fixed menu. Leave empty to let it infer the best concept from the game name, store URL, and the assets.\n"
    },
    "sprites": {
      "type": "array",
      "items": {
        "type": "image"
      },
      "maxItems": 12,
      "minItems": 1,
      "description": "Transparent PNG sprites of the game's objects. Order matters."
    },
    "cta_text": {
      "type": "string",
      "maxLength": 24,
      "minLength": 2,
      "description": "CTA button text, e.g. \"Play Now\", \"Install\"."
    },
    "headline": {
      "type": "string",
      "maxLength": 40,
      "description": "Short end-card hook (2–5 words). Auto-written if empty."
    },
    "game_name": {
      "type": "string",
      "maxLength": 40,
      "description": "The game's name (used for the title and end card)."
    },
    "store_url": {
      "type": "string",
      "description": "App Store / Google Play URL the CTA opens."
    },
    "brand_color": {
      "type": "color",
      "description": "Accent color for the CTA. Derived from the logo if empty."
    },
    "orientation": {
      "enum": [
        "portrait",
        "landscape",
        "both"
      ],
      "type": "string",
      "description": "Target orientation. Default both."
    }
  }
}
```

**Output schema**

```json
{
  "type": "object",
  "properties": {
    "playables": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "playable_url": {
            "type": "file",
            "description": "Drive path to the single-file .html playable; served to readers as a stable media URL. Rendered inline as a live HTML preview.",
            "contentMediaType": "text/html"
          }
        }
      },
      "maxItems": 1,
      "minItems": 1,
      "description": "The produced playable (exactly one)."
    }
  }
}
```

**Adorable Gardens — tap-to-merge**

A tap-to-merge garden playable on a grid, built from the game's logo, six transparent produce sprites, and a one-line brief — shipped as one self-contained HTML file.

Inputs:

```json
{
  "logo": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/logo.png",
  "brief": "A simple tap-to-merge garden on a GRID. Tap two adjacent matching plants to merge them up the chain (strawberry → tomato → … → watermelon), fill a small goal, then the install end card. Keep a soft PASTEL/light background and cute art — this deliberately stresses readable HUD text on a light background. One control verb: tap. Lay the board inside the safe area so the score/hint never overlap it.",
  "sprites": [
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/strawberry.png",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/tomato_small.png",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/tomato_big.png",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/carrot.png",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/cabbage.png",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/watermelon.png"
  ],
  "cta_text": "Play Free",
  "headline": "Grow your garden!",
  "game_name": "Adorable Gardens",
  "store_url": "https://play.google.com/store/apps/details?id=com.example.adorablegardens",
  "brand_color": "#ff5fa2"
}
```

Outputs:

```json
{
  "playables": [
    {
      "playable_url": "https://api.puras.co/v1/jobs/48cba2e9-41da-4cf6-82c2-a48da9862e7e/assets/2d-playable-ad/48cba2e9/playable.html?sig=728ecc887a8c1c52d228bd66fb97c64876490c7af22eaae01eaa1993ba18cf11"
    }
  ]
}
```

**Call**

```bash
curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/game-ad-studio&wait=true" \
  -H "Authorization: Bearer $PURAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"skill":"2d-playable-ad","inputs":{"logo":"https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/logo.png","brief":"A simple tap-to-merge garden on a GRID. Tap two adjacent matching plants to merge them up the chain (strawberry → tomato → … → watermelon), fill a small goal, then the install end card. Keep a soft PASTEL/light background and cute art — this deliberately stresses readable HUD text on a light background. One control verb: tap. Lay the board inside the safe area so the score/hint never overlap it.","sprites":["https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/strawberry.png","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/tomato_small.png","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/tomato_big.png","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/carrot.png","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/cabbage.png","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/2d-playable-ad/adorable-gardens/watermelon.png"],"cta_text":"Play Free","headline":"Grow your garden!","game_name":"Adorable Gardens","store_url":"https://play.google.com/store/apps/details?id=com.example.adorablegardens","brand_color":"#ff5fa2"}}'
```

---

### Aspect Ratio Converter (`aspect-ratio-converter`)

Resizes a single image to the aspect ratios you need (9:16, 4:5, 1:1, 16:9). Pick a clean center-crop, or let it intelligently re-compose the scene to fill the new frame — no bars, no empty edges.

Spec: https://puras.co/skills/puras/game-ad-studio/aspect-ratio-converter.md

**Input schema**

```json
{
  "type": "object",
  "required": [
    "image",
    "mode",
    "target_ratios"
  ],
  "properties": {
    "mode": {
      "enum": [
        "generative",
        "crop"
      ],
      "type": "string",
      "default": "generative",
      "description": "`generative` re-composes the scene with AI; `crop` center-crops, no AI."
    },
    "image": {
      "type": "image",
      "description": "Source image to convert — any aspect ratio."
    },
    "notes": {
      "type": "string",
      "maxLength": 200,
      "description": "Optional — subject to keep, or element to emphasize."
    },
    "target_ratios": {
      "type": "array",
      "items": {
        "enum": [
          "9:16",
          "4:5",
          "1:1",
          "16:9"
        ],
        "type": "string"
      },
      "minItems": 1,
      "description": "Target ratios to produce. Pick one or more.",
      "uniqueItems": true
    }
  }
}
```

**Output schema**

```json
{
  "type": "object",
  "properties": {
    "conversions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "output_url": {
            "type": "image",
            "description": "Drive path to the converted image; served to readers as a stable media URL. The playground renders it with <img>."
          },
          "aspect_ratio": {
            "enum": [
              "9:16",
              "4:5",
              "1:1",
              "16:9"
            ],
            "type": "string"
          }
        }
      },
      "minItems": 1,
      "description": "The image produced for each selected target ratio — one per ratio."
    }
  }
}
```

**Generative · landscape → vertical**

Re-composes the 16:9 key art for 9:16.

Inputs:

```json
{
  "mode": "generative",
  "image": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_output_4x3.webp",
  "target_ratios": [
    "9:16"
  ]
}
```

Outputs:

```json
{
  "conversions": [
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_converted_9x16.png",
      "aspect_ratio": "9:16"
    }
  ]
}
```

**Crop · landscape → vertical**

Inputs:

```json
{
  "mode": "crop",
  "image": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/mergedragons_screenshot.webp",
  "target_ratios": [
    "9:16"
  ]
}
```

Outputs:

```json
{
  "conversions": [
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/md_converted_9x16.png",
      "aspect_ratio": "9:16"
    }
  ]
}
```

**Call**

```bash
curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/game-ad-studio&wait=true" \
  -H "Authorization: Bearer $PURAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"skill":"aspect-ratio-converter","inputs":{"mode":"generative","image":"https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_output_4x3.webp","target_ratios":["9:16"]}}'
```

---

### Auto-Caption Burner (`auto-caption`)

Burns word-synced karaoke captions onto your video — the whole line stays on screen and each word lights up as it's spoken, the look built for muted TikTok, Reels, and Shorts feeds. Add your brand or product names and it spells them correctly every time.

Spec: https://puras.co/skills/puras/game-ad-studio/auto-caption.md

**Input schema**

```json
{
  "type": "object",
  "required": [
    "video"
  ],
  "properties": {
    "video": {
      "type": "video",
      "description": "Video to caption. Clear speech, short clips (≤60s) work best."
    },
    "captions": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "text"
        ],
        "properties": {
          "end": {
            "type": "number",
            "description": "Optional end time in seconds."
          },
          "text": {
            "type": "text",
            "description": "The caption line to show."
          },
          "start": {
            "type": "number",
            "description": "Optional start time in seconds. Omit to auto-distribute evenly across the clip."
          }
        }
      },
      "description": "Pre-written caption lines, for a video that has NO spoken audio (e.g. a visual montage carrying on-screen copy like \"Lvl 1 → Lvl 50\"). When set, transcription is skipped and these lines are burned directly with the same high-contrast renderer. Omit for spoken videos — those are transcribed automatically. Give timing per line, or omit it to auto-distribute evenly.\n"
    },
    "text_color": {
      "type": "color",
      "default": "#FFFFFF",
      "description": "Color of the caption line text."
    },
    "brand_terms": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 50,
        "minLength": 1
      },
      "maxItems": 100,
      "description": "Optional brand/product/proper-noun names to keep verbatim and spell correctly. One entry per name.",
      "uniqueItems": true
    },
    "language_code": {
      "type": "string",
      "maxLength": 8,
      "description": "Optional language hint (e.g. \"en\", \"tr\"). Empty = auto-detect."
    },
    "max_line_chars": {
      "type": "integer",
      "default": 32,
      "maximum": 60,
      "minimum": 12,
      "description": "Max characters per caption line. Smaller = snappier cuts."
    },
    "caption_position": {
      "enum": [
        "bottom",
        "center",
        "top"
      ],
      "type": "string",
      "default": "bottom",
      "description": "Where the caption band sits. Bottom by default."
    },
    "highlight_enabled": {
      "type": "boolean",
      "default": true,
      "description": "Light up the currently-spoken word with a colored pill (karaoke look). Turn off for a plain, static line in text_color with no per-word highlight.\n"
    },
    "highlight_bg_color": {
      "type": "color",
      "default": "#A855F7",
      "description": "Background color of the pill behind the currently-spoken word."
    },
    "highlight_text_color": {
      "type": "color",
      "default": "#FFFFFF",
      "description": "Text color of the currently-spoken word while it sits on the pill."
    }
  }
}
```

**Output schema**

```json
{
  "type": "object",
  "properties": {
    "video_url": {
      "type": "video",
      "description": "Drive path to the captioned video; served to readers as a stable media URL. The playground renders it with a <video> player."
    },
    "transcript": {
      "type": "text",
      "description": "The transcript shown in the captions (with brand corrections applied, if any)."
    }
  }
}
```

**Caption a UGC hook**

Burn bottom captions onto a spoken-to-camera clip.

Inputs:

```json
{
  "video": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/chordie_source.mp4",
  "max_line_chars": 32,
  "caption_position": "bottom"
}
```

Outputs:

```json
{
  "video_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/chordie_captioned.mp4",
  "transcript": "[guitar strumming] Still can't play? I'm trying. It's just not working. Chordie will fix that"
}
```

**Call**

```bash
curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/game-ad-studio&wait=true" \
  -H "Authorization: Bearer $PURAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"skill":"auto-caption","inputs":{"video":"https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/chordie_source.mp4","max_line_chars":32,"caption_position":"bottom"}}'
```

---

### AI End Card Maker (`end-card-generator`)

An AI end card maker for mobile game ads. Drop in your game's logo, a few reference images, and a call-to-action and it pulls the characters, colors, and mood from your art into polished, install-driving end card creatives — in the placement sizes UA networks need (9:16 by default, plus optional 1:1 and 16:9).

Spec: https://puras.co/skills/puras/game-ad-studio/end-card-generator.md

**Input schema**

```json
{
  "type": "object",
  "required": [
    "logo",
    "references",
    "cta_text"
  ],
  "properties": {
    "logo": {
      "type": "image",
      "description": "The game's logo (transparent PNG preferred)."
    },
    "style": {
      "enum": [
        "auto",
        "bold",
        "playful",
        "minimal",
        "premium"
      ],
      "type": "string",
      "description": "Visual tone. `auto` decides based on the game's genre."
    },
    "cta_text": {
      "type": "string",
      "maxLength": 24,
      "minLength": 2,
      "description": "Button text, e.g. \"Play Now\", \"Install\"."
    },
    "headline": {
      "type": "string",
      "maxLength": 40,
      "description": "Short hook (2–5 words). Auto-written if empty."
    },
    "references": {
      "type": "array",
      "items": {
        "type": "image"
      },
      "maxItems": 5,
      "minItems": 1,
      "description": "Game reference images — key art, screenshots, characters, icons."
    },
    "brand_color": {
      "type": "color",
      "description": "Accent color for the CTA button. Derived from logo if empty."
    },
    "social_proof": {
      "type": "string",
      "maxLength": 40,
      "description": "Optional social proof, e.g. \"4.8★ · 10M+ players\". Never fabricated."
    },
    "aspect_ratios": {
      "type": "array",
      "items": {
        "enum": [
          "9:16",
          "1:1",
          "16:9"
        ],
        "type": "string"
      },
      "default": [
        "9:16"
      ],
      "minItems": 1,
      "description": "Which placements to render. Pick one or more; defaults to vertical 9:16 only.",
      "uniqueItems": true
    }
  }
}
```

**Output schema**

```json
{
  "type": "object",
  "properties": {
    "end_cards": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "output_url": {
            "type": "image",
            "description": "Drive path to the generated end card; served to readers as a stable media URL. The playground renders it with <img>."
          },
          "aspect_ratio": {
            "enum": [
              "9:16",
              "1:1",
              "16:9"
            ],
            "type": "string"
          }
        }
      },
      "minItems": 1,
      "description": "The produced end cards — one per selected aspect ratio."
    }
  }
}
```

**Clash of Clans**

Inputs:

```json
{
  "logo": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_logo.webp",
  "style": "playful",
  "cta_text": "Play Free",
  "headline": "Build a village!",
  "references": [
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss1.webp",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss2.webp",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss3.webp"
  ],
  "aspect_ratios": [
    "9:16"
  ]
}
```

Outputs:

```json
{
  "end_cards": [
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_output_9x16.webp",
      "aspect_ratio": "9:16"
    }
  ]
}
```

**1010!**

Inputs:

```json
{
  "logo": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/1010_logo.webp",
  "style": "premium",
  "cta_text": "Play Now",
  "headline": "Fill the grid!",
  "references": [
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/1010_screenshot.webp"
  ],
  "aspect_ratios": [
    "1:1",
    "9:16",
    "16:9"
  ]
}
```

Outputs:

```json
{
  "end_cards": [
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/1010_output_1x1.webp",
      "aspect_ratio": "1:1"
    },
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/1010_output_9x16.webp",
      "aspect_ratio": "9:16"
    },
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/1010_output_4x3.webp",
      "aspect_ratio": "16:9"
    }
  ]
}
```

**Merge Dragons**

Inputs:

```json
{
  "logo": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/mergedragons_logo.webp",
  "style": "playful",
  "cta_text": "Install",
  "headline": "Merge. Hatch. Heal.",
  "references": [
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/mergedragons_screenshot.webp"
  ],
  "brand_color": "#7B3FF2",
  "social_proof": "4.7★ · 100M+ players",
  "aspect_ratios": [
    "9:16",
    "1:1"
  ]
}
```

Outputs:

```json
{
  "end_cards": [
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/md_output_9x16.webp",
      "aspect_ratio": "9:16"
    },
    {
      "output_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/md_output_1x1.webp",
      "aspect_ratio": "1:1"
    }
  ]
}
```

**Call**

```bash
curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/game-ad-studio&wait=true" \
  -H "Authorization: Bearer $PURAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"skill":"end-card-generator","inputs":{"logo":"https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_logo.webp","style":"playful","cta_text":"Play Free","headline":"Build a village!","references":["https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss1.webp","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss2.webp","https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss3.webp"],"aspect_ratios":["9:16"]}}'
```

---

### AI Game Ad Generator (`game-ad-generator`)

Turn a game's store link — or whatever media you have — into a finished, captioned mobile-game video ad. Paste an App Store / Google Play URL or drop screenshots and gameplay footage, and it builds a thumb-stopping UA creative (hook, mid payoff, and CTA end card) with burned-in captions for sound-off feeds. A store-link-to-video and gameplay-to-ad generator for mobile-game user acquisition.

Spec: https://puras.co/skills/puras/game-ad-studio/game-ad-generator.md

**Input schema**

```json
{
  "type": "object",
  "required": [
    "brief"
  ],
  "properties": {
    "logo": {
      "type": "image",
      "description": "The game's logo / icon (transparent PNG preferred). Shown on the end card."
    },
    "brief": {
      "type": "text",
      "maxLength": 2000,
      "description": "What the game is, who it's for, and the angle you want. An App Store / Google Play link on its own also works."
    },
    "style": {
      "enum": [
        "auto",
        "bold",
        "playful",
        "minimal",
        "premium"
      ],
      "type": "string",
      "default": "auto",
      "description": "Visual tone of the end card. `auto` decides from the game's genre."
    },
    "cta_text": {
      "type": "string",
      "default": "Play Now",
      "maxLength": 24,
      "minLength": 2,
      "description": "End-card button text, e.g. \"Play Now\", \"Install\"."
    },
    "language": {
      "type": "string",
      "maxLength": 12,
      "description": "Optional language code for the script / voiceover (e.g. \"en\", \"tr\"). Empty = the brief's language."
    },
    "template": {
      "enum": [
        "auto",
        "fail_to_success",
        "save_the_character",
        "talking_creator",
        "reaction_pip",
        "screen_record_pov",
        "satisfying_asmr",
        "before_after",
        "pattern_interrupt",
        "custom"
      ],
      "type": "string",
      "default": "auto",
      "description": "Which winning ad structure to build. `auto` picks the best fit for your media + genre; `custom` composes a bespoke one. Templates are starting points, not rails. See references/creative-playbook.md for what each does.\n"
    },
    "game_name": {
      "type": "string",
      "maxLength": 60,
      "description": "Optional. The game's name (otherwise read from the store listing / brief)."
    },
    "brand_color": {
      "type": "color",
      "description": "Accent color for the end card / caption highlight. Derived from the logo / art if empty."
    },
    "screenshots": {
      "type": "array",
      "items": {
        "type": "image"
      },
      "maxItems": 10,
      "minItems": 0,
      "description": "Gameplay screenshots / key art. Used as demo footage source, end-card references, and to read the art style."
    },
    "aspect_ratios": {
      "type": "array",
      "items": {
        "enum": [
          "9:16",
          "1:1",
          "16:9"
        ],
        "type": "string"
      },
      "default": [
        "9:16"
      ],
      "minItems": 1,
      "description": "Output frame(s) — 9:16 (vertical), 1:1 (square), or 16:9 (landscape). One ad per selected ratio.",
      "uniqueItems": true
    },
    "gameplay_videos": {
      "type": "array",
      "items": {
        "type": "video"
      },
      "maxItems": 5,
      "minItems": 0,
      "description": "Screen recordings of real gameplay. The strongest proof of gameplay — used as the hero footage of the ad."
    },
    "duration_seconds": {
      "type": "integer",
      "default": 15,
      "maximum": 60,
      "minimum": 8,
      "description": "Target length of each ad, including the end card. 15 s is the sweet spot; longer ads stitch extra segments."
    }
  }
}
```

**Output schema**

```json
{
  "type": "object",
  "properties": {
    "videos": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "video_url": {
            "type": "video",
            "description": "Drive path to the finished, captioned ad (ends on the end card); served to readers as a stable media URL. The playground renders it with a <video> player."
          },
          "aspect_ratio": {
            "enum": [
              "9:16",
              "1:1",
              "16:9"
            ],
            "type": "string"
          }
        }
      },
      "minItems": 1,
      "description": "The finished ad creatives — one per aspect ratio."
    }
  }
}
```

**Play Store URL → Video Ad Creative**

Paste a Google Play / App Store link and get a finished, captioned vertical ad — the game's name, art, and rating are pulled from the listing.

Inputs:

```json
{
  "brief": "https://play.google.com/store/apps/details?id=com.supercell.brawlstars&hl=en",
  "aspect_ratios": [
    "9:16"
  ]
}
```

Outputs:

```json
{
  "videos": [
    {
      "video_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/game-ad-generator/3961bb36/out-videos-0-video_url.mp4",
      "aspect_ratio": "9:16"
    }
  ]
}
```

**Screenshot + Logo → 15s Cozy Puzzle Ad**

One Merge Dragons screenshot, a logo, and a two-line brief — the router picks the template and cuts a captioned 15-second vertical ad.

Inputs:

```json
{
  "logo": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/mergedragons_logo.webp",
  "brief": "Merge Dragons — cozy merge puzzle. Merge eggs and trees, heal the land, hatch dragons. For relaxed puzzle players.",
  "template": "auto",
  "screenshots": [
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/mergedragons_screenshot.webp"
  ],
  "duration_seconds": 15
}
```

Outputs:

```json
{
  "videos": [
    {
      "video_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/game-ad-generator/07b8c3aa/out-videos-0-video_url.mp4",
      "aspect_ratio": "9:16"
    }
  ]
}
```

**Three Screenshots → Competitive Strategy Ad**

Clash of Clans art and a one-line brief become a captioned 9:16 ad aimed at competitive strategy players.

Inputs:

```json
{
  "logo": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_logo.webp",
  "brief": "Clash of Clans — build your village, train troops, raid rivals. Competitive strategy players.",
  "screenshots": [
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss1.webp",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss2.webp",
    "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/coc_ss3.webp"
  ]
}
```

Outputs:

```json
{
  "videos": [
    {
      "video_url": "https://uozfqcfhlhugotnevscg.supabase.co/storage/v1/object/public/puras-public-skills/examples/game-ad-studio/game-ad-generator/595d12db/out-videos-0-video_url.mp4",
      "aspect_ratio": "9:16"
    }
  ]
}
```

**Call**

```bash
curl -X POST "https://api.puras.co/v1/jobs?skillpack=puras/game-ad-studio&wait=true" \
  -H "Authorization: Bearer $PURAS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"skill":"game-ad-generator","inputs":{"brief":"https://play.google.com/store/apps/details?id=com.supercell.brawlstars&hl=en","aspect_ratios":["9:16"]}}'
```

---

## Pricing

Runs are billed usage-based from your workspace credit balance — the cost of a job is the sum of the model token (and any media) usage it incurs. There is no per-call platform fee. The playground and the job result report the exact cost of each run.

- Pricing page: https://puras.co/pricing
- Machine-readable model price registry: `https://api.puras.co/v1/pricing`
