{
  "schema": "snappy-card/1",
  "skill": "snappy-ads",
  "tier": "public",
  "origin_tier": "base",
  "purpose": "This skill runs YouTube paid ads feeding cold traffic into the Snappy VSL funnel.",
  "verbs": [
    {
      "name": "metrics",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-ads/api.ts metrics"
    },
    {
      "name": "targets",
      "args": [],
      "effect": "read",
      "firstCall": "npx tsx ~/.claude/skills/snappy-ads/api.ts targets"
    }
  ],
  "faces": [],
  "agents": [],
  "uses": [
    "snappy-offer",
    "snappy-video",
    "snappy-youtube",
    "snappy-content",
    "snappy-positioning"
  ],
  "used_by": [],
  "checks": {
    "pass": 40,
    "fail": 5,
    "defer": 16,
    "line": "40 of 45 checks pass",
    "failing": [
      {
        "id": 10,
        "rule": "One term names each concept",
        "says": "mixed synonym sets: endpoint/url/route/path"
      },
      {
        "id": 40,
        "rule": "Metadata, skill body, and resources follow three-level budgets",
        "says": "metadata ~181 tokens; body ~4996 tokens"
      },
      {
        "id": 54,
        "rule": "At least three eval scenarios precede ready status",
        "says": "0 eval scenario(s); ready=true"
      },
      {
        "id": 55,
        "rule": "Eval scenarios are multi-call with ground truth",
        "says": "eval manifest missing"
      },
      {
        "id": 57,
        "rule": "Eval manifest contains a disjoint holdout",
        "says": "0 disjoint holdout scenario(s)"
      }
    ]
  },
  "coverage": null,
  "spec": null,
  "evals": null,
  "files": [
    "AGENTS.md",
    "SKILL.md",
    "api.ts",
    "contract.test.ts"
  ],
  "total_size": 32537,
  "checksum": "sha256:637f03dc77b1588262daf84e200213a479f5648bf428f231400b56b9659fc84e",
  "built_at": "2026-09-09T22:07:58.321Z",
  "openapi": {
    "openapi": "3.1.0",
    "info": {
      "title": "snappy-ads",
      "version": "0.0.0",
      "description": "YouTube advertising for Snappy -- paid acquisition for the mastermind/consulting funnel via Google Ads. Covers campaign setup, creative production, custom-intent targeting, launch checklists, kill/keep rules, vertical/horizontal/creative scaling, true-ROI calculation via Hyros + FreshBooks, and ad disapproval recovery. Based on WeTube SS Week 5 (all 9 lessons). Triggers on: youtube ads, google ads, ad campaign, ad creative, custom intent audience, ad targeting, ad spend, launch ads, scale ads, ad metrics, CPL, cost per lead, CP-call, ROAS, hyros, ad disapproval, ad rejection, ad testing, A/B test ads, ad optimization, ad budget, video ad, skippable in-stream, remarketing ads, VSL funnel traffic, paid acquisition."
    },
    "x-snappy-transport": "cli",
    "servers": [
      {
        "url": "npx tsx ~/.claude/skills/snappy-ads/api.ts",
        "description": "The hand itself. Every path is a verb word, every query or body key an argument."
      }
    ],
    "paths": {
      "/metrics": {
        "get": {
          "operationId": "snappy_ads_metrics",
          "summary": "snappy-ads metrics",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      },
      "/targets": {
        "get": {
          "operationId": "snappy_ads_targets",
          "summary": "snappy-ads targets",
          "x-snappy-effect": "read",
          "x-snappy-annotations": {
            "readOnlyHint": true,
            "destructiveHint": false,
            "idempotentHint": false,
            "openWorldHint": false
          },
          "parameters": [],
          "responses": {
            "200": {
              "description": "The verb's own answer, as printed by `--json`."
            }
          }
        }
      }
    },
    "components": {
      "schemas": {
        "SnappyRefusal": {
          "type": "object",
          "required": [
            "outcome",
            "code",
            "message"
          ],
          "properties": {
            "outcome": {
              "type": "string",
              "const": "refused"
            },
            "code": {
              "type": "string",
              "description": "A row of the closed refusal table."
            },
            "message": {
              "type": "string"
            },
            "fix": {
              "type": "string"
            }
          }
        }
      }
    },
    "x-snappy-requires": [
      "GOOGLE_ADS_TOKEN"
    ]
  }
}