cli-campaign — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited cli-campaign (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Orchestrate a complete GAM campaign using CLI commands. Same workflow as the MCP skill, executed via bash. Each phase uses orbiads commands with --json for structured output.
Requires orbiads CLI (pip install orbiads-cli). Use the Bash tool to execute all commands.
Advertiser → Order → Line Item → Creative → Assignment (LICA) → DeployEach entity depends on its parent. You cannot skip levels.
The user may have configured naming conventions, delivery defaults, and campaign presets via the OrbiAds web app (orbiads.com/settings). The backend applies these settings automatically when creating entities through the API.
Key points for CLI usage:
--name flag values you provide are used as macro values (e.g., advertiser name, campaign name) that get expanded by the configured templates. Check the user's settings at orbiads.com/settings if entity names look unexpected.To inspect current configuration via CLI, run orbiads network info --json which includes tenant-level settings.
If the user has not configured naming templates, the backend uses these defaults:
| Entity | Pattern | Example |
|---|---|---|
| Advertiser | {BrandName} | Renault |
| Order | {Brand} — {Campaign} — {Month YYYY} | Renault — Spring Launch — Apr 2026 |
| Line Item | {Brand} — {Size} — {Targeting} — {Type} | Renault — MPU 300x250 — FR Desktop — Standard |
| Creative | {Brand} — {Size} — {Version} | Renault — MPU 300x250 — v1 |
Use — (em dash) as separator. Keep names unique.
orbiads --version
orbiads auth status --json
orbiads network info --jsonIf not authenticated: tell user to run orbiads auth login. If no network: orbiads network list --json then orbiads network switch --network-code <code> --json.
Review the network info output to understand the tenant's current configuration (naming conventions, delivery defaults, presets). This determines how entities will be named and configured in subsequent phases.
Check presets first. If the user's tenant has campaign presets (visible in network info output or at orbiads.com/settings), and a preset matches the campaign brief (e.g., homepage takeover matches Pack Homepage), the ad units and targeting are already selected. Skip manual discovery.
If no preset matches, proceed with manual discovery:
# Discover ad units
orbiads inventory ad-units --json
orbiads inventory ad-units --search "homepage" --json
# Check placements
orbiads inventory placements --json
# List targeting keys
orbiads inventory keys --jsonOutput: Note the adUnitIds and available sizes for the campaign.
orbiads reporting run --type forecast \
--ad-units <id1>,<id2> \
--start 2026-04-01 --end 2026-04-30 \
--jsonInterpret: availableUnits > goal = safe. < 50% of goal = stop and adjust targeting.
GAM rule: Always forecast before creating line items. Forecasts are free.
# Find advertiser
orbiads advertisers list --search "Renault" --json
# Create if not found (1 credit)
orbiads advertisers create --name "Renault" --json
# Create order (1 credit)
# The --name value provides macro values for the configured orderTemplate.
# If no template is configured, use the fallback pattern: {Brand} — {Campaign} — {Month YYYY}
orbiads orders create \
--advertiser <advertiserId> \
--name "Renault — Spring Launch — Apr 2026" \
--jsonGAM rules:
type=ADVERTISER (not agency)The backend applies tenant delivery defaults automatically (line item type, CPM rate, pacing, frequency caps, priority, etc.). Only override with explicit flags when the campaign brief requires different values.
Line item type selection (use the user's configured default if the brief doesn't specify):
| Goal | Type | Priority |
|---|---|---|
| Guaranteed impressions | STANDARD | 6-10 |
| Share of voice | SPONSORSHIP | 4 |
| Remnant / backfill | PRICE_PRIORITY | 12 |
| Self-promo | HOUSE | 16 |
GAM rules:
costType=CPM requires unitType=IMPRESSIONSLine items are created through the MCP or GAM UI for complex configurations. CLI supports listing and status:
# List line items for the order
orbiads orders get --id <orderId> --json# Upload creative (5 credits)
# The --name value provides macro values for the configured creativeTemplate.
# If no template is configured, use the fallback: {Brand} — {Size} — {Version}
orbiads creatives upload \
--file ./banner-300x250.png \
--name "Renault — MPU 300x250 — v1" \
--advertiser <advertiserId> \
--json
# Verify creation
orbiads creatives get --id <creativeId> --jsonGAM rules:
creativePlaceholder — size mismatch is the #1 API errorCreativeAssetService removed in v202502 — image bytes are inlined in createCreativesNEEDS_CREATIVES means a creative size is missing# Inspect campaign configuration
orbiads campaigns get <id> --json
# Check creative SSL and compliance
orbiads creatives get --id <creativeId> --json
# Dry-run deployment (free — no actual push)
orbiads campaigns deploy <id> --dry-run --jsonPre-check: Verify delivery defaults are configured appropriately for this campaign. If the campaign requires non-standard CPM, pacing, or frequency caps, confirm they were set correctly (either via defaults or explicit overrides).
QA Checklist (verify in the JSON output):
READY (not NEEDS_CREATIVES)Decision: All checks pass → proceed. Blocking errors → STOP and fix.
# Deploy (5 credits — requires explicit user confirmation)
orbiads campaigns deploy <id> --yes --json
# Poll status (every 10s, max 5 min)
for i in $(seq 1 30); do
sleep 10
STATUS=$(orbiads campaigns get <id> --json | jq -r '.data.status')
echo "Status: $STATUS"
if [ "$STATUS" = "deployed" ] || [ "$STATUS" = "failed" ]; then break; fi
done
# Check delivery (after 1h or 24h)
orbiads reporting run --type delivery --campaign <id> --jsonLine item lifecycle: DRAFT → NEEDS_CREATIVES → READY → DELIVERING → COMPLETED
| Phase | CLI Skill |
|---|---|
| 0 | /orbiads:cli-bootstrap |
| 1 | /orbiads:cli-inventory + /orbiads:cli-targeting |
| 2 | /orbiads:cli-forecast |
| 3 | /orbiads:cli-orders |
| 5 | /orbiads:cli-creatives |
| 6 | /orbiads:cli-qa |
| 7 | /orbiads:cli-deploy |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.