Skills x-ads-cli
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/bin-huang/x-ads-cli" ~/.claude/skills/openclaw-skills-x-ads-cli && rm -rf "$T"
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.openclaw/skills && cp -r "$T/skills/bin-huang/x-ads-cli" ~/.openclaw/skills/openclaw-skills-x-ads-cli && rm -rf "$T"
skills/bin-huang/x-ads-cli/SKILL.mdX Ads CLI Skill
You have access to
x-ads-cli, a read-only CLI for the X Ads API (v12). Use it to query ad accounts, pull synchronous analytics, inspect promoted tweets and media creatives, review targeting criteria, check funding instruments, and estimate reach. Handles OAuth 1.0a signing natively with Node.js crypto -- no external dependencies.
Quick start
# Check if the CLI is available x-ads-cli --help # List all accessible ad accounts x-ads-cli accounts # Get a specific ad account x-ads-cli account abc1x2
If the CLI is not installed, install it:
npm install -g x-ads-cli
Authentication
The CLI requires four OAuth 1.0a credentials: API Key, API Secret, Access Token, and Access Token Secret. Credentials are resolved in this order:
flag (per-command)--credentials <path>- Environment variables:
,X_ADS_API_KEY
,X_ADS_API_SECRET
,X_ADS_ACCESS_TOKENX_ADS_ACCESS_TOKEN_SECRET - Auto-detected file:
~/.config/x-ads-cli/credentials.json
The credentials file format:
{ "api_key": "YOUR_API_KEY", "api_secret": "YOUR_API_SECRET", "access_token": "YOUR_ACCESS_TOKEN", "access_token_secret": "YOUR_ACCESS_TOKEN_SECRET" }
The Access Token must belong to a user who has access to at least one X Ads account. Ads API access requires separate approval from the X Developer Portal.
Before running any command, verify credentials are configured by running
x-ads-cli accounts. If it fails with a credentials error, ask the user to set up authentication.
Entity hierarchy
Ad Account +-- Campaign | +-- Line Item (ad group) | +-- Promoted Tweet | +-- Targeting Criteria +-- Media Creative +-- Card (website, app install, etc.) +-- Custom Audience +-- Funding Instrument (payment method) +-- Conversion Event (web event tag)
Line items sit under campaigns and contain targeting, budget, and bid settings. Promoted tweets are attached to line items.
Monetary values
The X Ads API returns monetary values (e.g.,
billed_charge_local_micro) in microcurrency -- the value multiplied by 1,000,000. Divide by 1,000,000 to get the actual amount in the major currency unit. For example, 5000000 means $5.00.
Output format
All commands output pretty-printed JSON by default. Use
--format compact for single-line JSON (useful for piping).
Pagination for listing commands uses cursor-based
--cursor values from the next_cursor field in the response.
Commands reference
Account discovery
# List all accessible ad accounts x-ads-cli accounts # Include deleted accounts x-ads-cli accounts --with-deleted # Get a specific ad account x-ads-cli account abc1x2
accounts options:
-- include deleted accounts--with-deleted
account takes a single required argument: the account ID.
Campaigns
# List all campaigns for an account x-ads-cli campaigns abc1x2 # Filter by specific campaign IDs x-ads-cli campaigns abc1x2 --campaign-ids id1,id2 # Include deleted campaigns with custom page size x-ads-cli campaigns abc1x2 --with-deleted --count 500 # Paginate x-ads-cli campaigns abc1x2 --cursor next_cursor_value
Options:
-- filter by campaign IDs (comma-separated)--campaign-ids <ids>
-- include deleted campaigns--with-deleted
-- results per page (default 200, max 1000)--count <n>
-- pagination cursor from previous response--cursor <cursor>
Line items
# List all line items for an account x-ads-cli line-items abc1x2 # Filter by campaign x-ads-cli line-items abc1x2 --campaign-ids campaign_id_1 # Filter by specific line item IDs x-ads-cli line-items abc1x2 --line-item-ids li1,li2 # Include deleted, with pagination x-ads-cli line-items abc1x2 --with-deleted --cursor next_cursor_value
Options:
-- filter by campaign IDs (comma-separated)--campaign-ids <ids>
-- filter by line item IDs (comma-separated)--line-item-ids <ids>
-- include deleted line items--with-deleted
-- results per page (default 200, max 1000)--count <n>
-- pagination cursor--cursor <cursor>
Analytics (stats)
The
stats command provides synchronous analytics. Supports up to 7 days of data per request.
# Campaign-level daily metrics x-ads-cli stats abc1x2 \ --entity CAMPAIGN \ --entity-ids campaign_id_1,campaign_id_2 \ --start-time 2026-03-01T00:00:00Z \ --end-time 2026-03-07T00:00:00Z \ --granularity DAY \ --metric-groups ENGAGEMENT,BILLING # Line item hourly metrics with video x-ads-cli stats abc1x2 \ --entity LINE_ITEM \ --entity-ids line_item_id_1 \ --start-time 2026-03-15T00:00:00Z \ --end-time 2026-03-16T00:00:00Z \ --granularity HOUR \ --metric-groups ENGAGEMENT,BILLING,VIDEO # Promoted tweet total metrics x-ads-cli stats abc1x2 \ --entity PROMOTED_TWEET \ --entity-ids pt_id_1 \ --start-time 2026-03-01T00:00:00Z \ --end-time 2026-03-07T00:00:00Z \ --granularity TOTAL \ --metric-groups ENGAGEMENT,BILLING
Required options:
-- entity type (required). Values:--entity <type>
,CAMPAIGN
,LINE_ITEM
,PROMOTED_TWEET
,MEDIA_CREATIVE
,FUNDING_INSTRUMENTORGANIC_TWEET
-- entity IDs, comma-separated (required)--entity-ids <ids>
-- ISO 8601 start time (required)--start-time <time>
-- ISO 8601 end time (required)--end-time <time>
Optional:
----granularity <gran>
,HOUR
, orDAY
(defaultTOTAL
)DAY
-- comma-separated metric groups (default--metric-groups <groups>
). Available:ENGAGEMENT,BILLING
,ENGAGEMENT
,BILLING
,VIDEO
,MEDIA
,WEB_CONVERSION
,MOBILE_CONVERSIONLIFE_TIME_VALUE_MOBILE_CONVERSION
----placement <placement>
,ALL_ON_TWITTER
,PUBLISHER_NETWORK
,SPOTLIGHT
(defaultTREND
)ALL_ON_TWITTER
The CLI passes
--metric-groups directly to the X Ads API, which returns the individual metrics for each group. Refer to the X Ads Analytics docs for the specific metrics included in each group.
Promoted tweets
# List promoted tweets for an account x-ads-cli promoted-tweets abc1x2 # Filter by line item x-ads-cli promoted-tweets abc1x2 --line-item-ids li1,li2
Options:
-- filter by line item IDs (comma-separated)--line-item-ids <ids>
-- results per page (default 200)--count <n>
-- pagination cursor--cursor <cursor>
Media creatives
# List media creatives for an account x-ads-cli media-creatives abc1x2
Options:
-- results per page (default 200)--count <n>
-- pagination cursor--cursor <cursor>
Cards
# List all cards for an account x-ads-cli cards abc1x2 # Filter by card types x-ads-cli cards abc1x2 --card-types WEBSITE,VIDEO_WEBSITE
Options:
-- filter by types (comma-separated). Values include:--card-types <types>
,WEBSITE
,VIDEO_WEBSITE
, etc.IMAGE_APP_DOWNLOAD
-- results per page (default 200)--count <n>
-- pagination cursor--cursor <cursor>
Targeting criteria
# List targeting criteria for an account x-ads-cli targeting-criteria abc1x2 # Filter by line items x-ads-cli targeting-criteria abc1x2 --line-item-ids li1,li2
Options:
-- filter by line item IDs (comma-separated)--line-item-ids <ids>
-- results per page (default 200)--count <n>
-- pagination cursor--cursor <cursor>
Custom audiences
# List custom audiences for an account x-ads-cli custom-audiences abc1x2
Options:
-- results per page (default 200)--count <n>
-- pagination cursor--cursor <cursor>
Funding instruments
# List funding instruments (payment methods) for an account x-ads-cli funding-instruments abc1x2
Options:
-- results per page (default 200)--count <n>
Note: This command does not support
--cursor pagination.
Conversion events
# List web conversion events for an account x-ads-cli conversion-events abc1x2
Options:
-- results per page (default 200)--count <n>
Note: This command does not support
--cursor pagination.
Reach estimate
# Get reach estimate for a line item x-ads-cli reach-estimate abc1x2 --line-item-id li1
Required options:
-- line item ID (required)--line-item-id <id>
Workflow guidance
When the user asks for a quick overview
- Run
to find accessible accountsx-ads-cli accounts - Use
to list active campaignscampaigns - Use
withstats
and--granularity TOTAL
for a performance snapshot--metric-groups ENGAGEMENT,BILLING - Monetary values from stats are in microcurrency -- divide by 1,000,000
When the user asks for deep analysis
- Start with
at thestats
entity level for an overviewCAMPAIGN - Drill into specific campaigns with
to find their ad groupsline-items - Use
at thestats
level for underperforming campaignsLINE_ITEM - Use
for intraday trends or--granularity HOUR
for multi-day trends--granularity DAY - Cross-reference with
to inspect individual tweet performancepromoted-tweets - Check
to review targeting setuptargeting-criteria
When the user asks about creative performance
- Run
withstats
for promoted tweet metrics--entity PROMOTED_TWEET - Use
to list tweets and their IDspromoted-tweets - Use
to inspect media assetsmedia-creatives - Use
to review card-based creatives (website cards, app install cards)cards
When the user asks about audience reach
- Use
to see existing audiencescustom-audiences - Use
with a line item ID to get estimated reachreach-estimate - Use
to review what targeting is applied to line itemstargeting-criteria
When the user asks about billing and spend
- Use
withstats
for billing data--metric-groups BILLING - Use
to see payment methods on filefunding-instruments - Remember: monetary values are in microcurrency (divide by 1,000,000)
When the user asks about conversion tracking
- Use
to list web event tagsconversion-events - Use
withstats
or--metric-groups WEB_CONVERSION
for conversion dataMOBILE_CONVERSION
Multi-day analytics
The stats command supports up to 7 days per request. For longer date ranges, make multiple requests with consecutive 7-day windows and combine the results.
Error handling
- Authentication errors -- ask the user to verify their OAuth credentials (API Key, API Secret, Access Token, Access Token Secret) and that their app has Ads API access
- No credentials found -- the CLI checked all three sources (flag, env vars, default file) and found nothing; ask the user to set up credentials
- Empty results -- check that the account ID is correct, the entity exists, and (for stats) the date range contains active ad activity
- HTTP 403 -- the authenticated user may not have access to the specified ad account
- HTTP 429 -- rate limited; wait and retry
- Stats date range too large -- the API supports max 7 days per request; split into smaller windows