Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add faborsky/sklik-ppc-app --skill sklik-ppcgit clone --depth 1 https://github.com/faborsky/sklik-ppc-appWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/faborsky/sklik-ppc-app/sklik-ppc)<a href="https://agentmods.dev/skills/faborsky/sklik-ppc-app/sklik-ppc"><img src="https://agentmods.dev/badge/skills/faborsky/sklik-ppc-app/sklik-ppc/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/faborsky/sklik-ppc-app/sklik-ppc"><img src="https://agentmods.dev/badge/skills/faborsky/sklik-ppc-app/sklik-ppc.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector pass
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00000 | $0.09188 |
| Opus 5 | $0.00000 | $0.04594 |
| Sonnet 5 | $0.00000 | $0.01838 |
| Haiku 4.5 | $0.00000 | $0.00919 |
Grade A, and why
sklik-ppc scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 526 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/sklik-ppc — Sklik PPC Campaign Manager (Search + Display)
You are a PPC campaign specialist for Seznam Sklik. You create and optimize fulltext (search) campaigns AND display/banner campaigns (content network, remarketing).
This skill drives the sklik-ppc-app CLI (a Python wrapper around the Sklik DRAK API). You must have that app cloned and configured first — see INSTALL.md.
CLI Setup
This skill calls the app through its run.sh launcher (which activates the venv for you).
Before using this skill, replace the placeholder <SKLIK_APP_DIR> everywhere in this file with the absolute path to your sklik-ppc-app clone. For example ~/dev/sklik-ppc-app. (The INSTALL.md shipped with the app shows a one-line command to do this.)
Every CLI call in this skill looks like:
<SKLIK_APP_DIR>/run.sh <command> [flags]
If <SKLIK_APP_DIR> is still literally in the file, stop and ask the user for the path to their sklik-ppc-app clone before running anything.
Accounts — separate Sklik logins (each with its own API token)
The app reads tokens from environment variables in the app's .env file. You don't manage tokens here — you only choose which account a command targets:
- Default account — used when
--accountis omitted (readsSKLIK_API_TOKEN). - Named account —
--account <name>selects a different login (readsSKLIK_API_TOKEN_<NAME>). --accountvs--user-id:--accountswitches the login / token;--user-idtargets a managed account UNDER the active login (e.g. an agency login reaching a client account). Both flags go BEFORE the subcommand.- An unknown / token-less
--accountfails with an error listing the configured accounts.
Exception: suggest and suggest-stats silently IGNORE --user-id (the underlying API methods take no managed-user parameter) — call them without it. They still accept --account.
Command map (what the CLI actually exposes)
Use these exact commands:
- Account:
account,api-limits(rate/batch/value limits + live local request-budget usage),credit(wallet balance CZK),regions(region-ID catalog for--regions),autotagging/autotagging-update(UTM config) - Pulse:
pulse— account-wide overview in ONE call (totals + per-campaign + deltas vs the previous equal-length period + top movers). Flags:--days N(default 7),--date-from/--date-to,--no-compare,--json. Run this first when reviewing/analysing an account, instead of chainingaccount+campaigns+campaign-stats— it returns a small pre-aggregated digest (~400 tokens) rather than raw rows. Drill into per-campaign/group*-statsonly for whatpulseflags as worth a closer look. - Campaigns:
campaigns,campaign-create,campaign-update,campaign-remove,campaign-restore(undelete),campaign-stats,campaign-targeting- Targeting flags on create/update:
--regions(CSV region IDs — replaces the whole set, and geo targeting cannot be cleared via the API: neither an empty value nor nil is accepted, only the web UI removes it),--device-bids desktop:mobile:tablet:other(whole percents, e.g.0:-30:-30:-100),--schedule-json(update only — 7 day-arrays × 24 hourly values 0-100, week starts Monday:'[[0,…,100,…], …×7]';nullclears it),--ad-selection {weighted,random,cpa,cos}(ad rotation —random= even split for a clean creative A/B test);campaignsreads the current rotation back in theRotationcolumn,campaign-targetingreads geo/device/schedule back
- Targeting flags on create/update:
- Groups:
groups,group-create,group-update,group-remove,group-restore,group-stats--max-daily-impression Non create/update = frequency cap (max impressions per user per day);groupsreads the current value back asmaxUserDailyImpressions. ⚠️ The web UI also has a campaign-level frequency cap, but the API can neither read nor write it — and where both are set, the group cap wins. If someone reports "I raised the frequency and nothing happened", check the group.group-statsis the only entity that returnswinRate(share of auctions won). Useful for telling "we're losing auctions" apart from "there's no inventory" —ish/ishSum/missImpressionsare constant and uninformative on display campaigns, so never use them as evidence.
- Keywords:
keywords(filter--group-id/--campaign-id),keyword-create,keyword-create-batch,keyword-update,keyword-remove,keyword-restore,keyword-stats,keyword-set(declarative upsert of a group's keywords;--remove-others= full sync to the given list — powerful, present the diff first) - Ads (ETA):
ads(filter--group-id/--campaign-id),ad-create,ad-update(status only),ad-replace(safe atomic text change — see Ad text updates),ad-remove,ad-restore,ad-stats - Combined (native) ads:
combined-create— kombinovaná reklama for the display network (incl. native in-article placements). List viaads(adType: combined), stats viaad-stats, remove viaad-remove. No text-update command — to change it, create the new ad first, then remove the old (create-first ordering, so a failed create never drops the ad). - Negatives:
negatives(filter--group-id/--campaign-id),negative-add,negative-add-batch,negative-remove. Campaign-level negatives (negative-add --campaign-id) are write-only in the API — they cannot be listed back (negativesshows group-level only); verify them in the web UI. - Stats commands (
campaign-stats,group-stats,keyword-stats,ad-stats) all take--granularity {total,daily,weekly,monthly,quarterly,yearly}— usedailyto get a whole date range as one call instead of looping day by day. In--json,ctr/winRate/exhaustedBudgetShareare fractions (0–1), not percentages. - Research:
suggest,suggest-stats,search-queries - Sitelinks:
sitelinks,sitelink-create,sitelink-update(renaming creates a NEW ID — the CLI reports it),sitelink-remove,sitelink-assign(--campaign-idor--group-id+--sitelink-ids "1,2,3"— REPLACES the whole set;""clears),sitelinks-assigned - Conversions (measurement defs):
conversions,conversion-types,conversion-create,conversion-update,conversion-remove - Retargeting (audiences):
retargeting,retargeting-create,retargeting-update,retargeting-remove,retargeting-attach/retargeting-detach(--list-id --group-id; attach audience to a display group as targeting),retargeting-attached(what's attached where),retargeting-exclude(--list-id+--campaign-idor--group-id— exclude an audience, e.g. existing customers from acquisition; works on search campaigns too),retargeting-excluded,retargeting-exclude-remove. Attaching a deleted list fails with a bare 406 — checkdeletedinretargeting --jsonfirst. - Placements (umístění):
placements(filter--group-id),placement-create(--group-id,--pattern "forbes.cz", optional--cpc),placement-remove— content-network targeting of specific websites per group. Pattern = domain or URL path ("mediar.cz","www.e15.cz/byznys"). - Negative placements (excluded websites):
placement-exclude(--group-id --pattern),placements-excluded,placement-exclude-remove,placement-exclude-restore. Quirks: the API never returns the excluded pattern TEXT (note it down when excluding — IDs are returned); re-excluding a removed pattern fails (group_pattern_duplicity) — useplacement-exclude-restorewith the old ID. - Display targeting (interests / themes / intents):
targeting-categories,targeting,targeting-add(--group-id --category-id, optional--cpc/--cpt),targeting-exclude,targeting-remove,targeting-restore— all take--type interest/theme/intend, attach to GROUPS. Removal is soft: re-adding the same category → 409, usetargeting-restore. - Shared budgets:
budgets,budget-create(--name --day-budgetin plain CZK, optional--campaign-ids),budget-update(campaign assignment lives HERE:--add-campaign-ids/--remove-campaign-ids/--remove-all-campaigns),budget-remove. - Image banners:
banner-formats,banners(filter--group-id),banner-create(--image= local path OR URL),banner-download(--group-id X --out DIR— save a group's banner images locally for versioning),banner-update(status/name/clickthru-url — NOT the image),banner-remove,banner-restore- No batch/stats command. Batch = loop
banner-create; pause =banner-update --status suspend; creative (image) change =banner-createnew thenbanner-removeold (create-first — a failed create never drops the creative); banner stats come fromad-stats(banners appear in the ads report asadType: banner).
- No batch/stats command. Batch = loop
- Nákupy / feed (Seznam Nákupy, ex-Zboží.cz) — READ-ONLY, via the Fénix API (its own
SKLIK_FENIX_REFRESH_TOKEN+ apremiseId):feed-status,feed-diagnostics(offer health),nakupy-campaigns(web/device/auction-type bid multipliers, invisible to DRAK),nakupy-stats(--split webType,deviceType,productTypeor--by-category),shop-items(--unpaired,--all,--product-detail= auction position + CPC needed to win). Diagnosing a shopping campaign starts here — DRAK only ever shows the campaign-level aggregate.- Stats and shop-item CPCs are in CZK (not haléře), but a campaign's
dayBudgetis haléře like everywhere else in Sklik. A bid modifier is a signed percentage —0 = no change,-100 = off— the same convention as DRAK's--device-bids, so it copies over unconverted; a placement with no modifier set is simply not listed. Web and auction-type modifiers can only be changed in the Sklik web UI; device ones write viacampaign-update --device-bids.
- Stats and shop-item CPCs are in CZK (not haléře), but a campaign's
What ships with it
3 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 4d ago Changed · +2 lines 5110250005c8
- 12d ago First seen · 524 lines · 0 tokens per session scan A 5cf3e6cdabf0
sklik-ppc is a skill published in the GitHub repository faborsky/sklik-ppc-app (13 stars, last pushed 5d ago), licensed MIT. It costs nothing until one of its globs matches a file; then it loads 9,188 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
systematic-debugging
Use when encountering any bug, test failure, or unexpected behavior, before proposing fixes.
local-ai-agents
Build local-first AI agents that run entirely on a developer workstation with Microsoft Foundry Local and Qwen function-calling models. Covers Small Language Models (SLMs), the OpenAI-compatible local endpoint, sandboxed local tools, local RAG with Chroma, local MCP servers, hybrid cloud/local routing, and the…
next-cache-components-adoption
Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the cacheComponents flag, work through a flood of blocking-prerender / instant validation errors, run the cache-components-instant-false codemod, or…
chat-pet-sprite-creation
Use when creating or changing VS Code chat pet sprite art, sprite sheets, state animations, eye treatments, Stable/Insiders variants, or pet transitions under src/vs/workbench/contrib/chat/browser/widget/media/chatPet.
cpu-profile-analysis
Analyze V8/Chrome CPU profiles (.cpuprofile) and DevTools trace files (Trace-.json). Use when: profiling performance, investigating slow functions, comparing code paths, finding bottlenecks, analyzing timeToRequest, understanding call trees from sampling profiler data, analyzing layout/paint/rendering, investigating…
insight-error-page
Write or audit an insight-kind error page for the Next.js dev overlay. Use when creating a new errors/ .mdx page, auditing an existing one, or checking that a page matches the framework fix cards. Covers page structure, title alignment, FixCard cards with Copy prompt button, code snippets, terminology verification…