Collect Twitter (X) Ads data. Deliver reports. Automate AI Insights.
Easily collect Twitter Ads data with OWOX Data Marts, store in your data warehouse, automate reporting across major BI Tools and AI Insights (the ones that matter) delivered straight to corporate messengers on a schedule.

Data Partner You Can Trust
users
175K
Executives and data analysts across 20+ industries
G2 rating
4.9★
“A trusted data analytics partner” — verified review
Customers
Available connectors
X Ads endpoints
10 X Ads endpoints you can import. Each lands in its own table in your warehouse.
Accounts
Advertising accounts — name, business, country, timezone, and approval status.
12 fieldsAd Performance
Daily ad performance by placement — impressions, clicks, spend, engagements, and social actions.
20 fieldsTime seriesAd Performance by Country
Daily ad performance broken down by country — impressions, clicks, spend, engagements, and social actions.
21 fieldsTime seriesAll Cards
All card types with full creative details — type, title, destination URL, call to action, and media.
28 fieldsCampaigns
Your campaigns — status, budget optimization, daily and total budget, and currency.
19 fieldsCards
Website and app cards — type, URI, and components.
8 fieldsLine Items
Line items within campaigns — bid strategy, goal, product type, budget, and schedule.
33 fieldsPromoted Tweets
Tweets promoted as ads — status, approval, and links to their tweets and line items.
8 fieldsTargeting Locations
Reference table of location IDs with names and country codes — join targeting_value with the country field in Ad Performance by Country.
4 fieldsTweets
Original tweets used as ad creatives — text, type, language, engagement counts, and card URI.
34 fields
X Ads Accounts schema
12 fieldsx_ads_accountsSchema on GitHub
Advertising accounts — name, business, country, timezone, and approval status.
| Field | Type | Description |
|---|---|---|
name | STRING | The name of the account |
business_name | STRING | The business name associated with the account |
timezone | STRING | The timezone of the account |
timezone_switch_at | DATETIME | When the timezone was last switched |
country_code | STRING | The country code of the account (e.g. SI) |
id | STRING | The unique identifier for the account |
created_at | DATETIME | When the account was created |
updated_at | DATETIME | When the account was last updated |
industry_type | STRING | The industry type of the account |
business_id | STRING | The business identifier associated with the account |
approval_status | STRING | The approval status of the account (e.g. ACCEPTED) |
deleted | BOOLEAN | Whether the account is deleted |
X Ads Ad Performance schema
20 fieldsTime seriesx_ads_statsSchema on GitHub
Daily ad performance by placement — impressions, clicks, spend, engagements, and social actions.
| Field | Type | Description |
|---|---|---|
id | STRING | The unique identifier for the stats record. |
date | STRING | The date for which the statistics were collected. |
placement | STRING | The placement type (ALL_ON_TWITTER or PUBLISHER_NETWORK). |
impressions | INTEGER | Number of impressions. |
tweets_send | INTEGER | Number of tweets sent. |
billed_charge_local_micro | INTEGER | Billed amount in micros. |
qualified_impressions | INTEGER | Number of qualified impressions. |
follows | INTEGER | Number of follows. |
app_clicks | INTEGER | Number of app clicks. |
retweets | INTEGER | Number of retweets. |
unfollows | INTEGER | Number of unfollows. |
likes | INTEGER | Number of likes. |
engagements | INTEGER | Number of engagements. |
clicks | INTEGER | Number of clicks. |
card_engagements | INTEGER | Number of card engagements. |
poll_card_vote | INTEGER | Number of poll card votes. |
replies | INTEGER | Number of replies. |
url_clicks | INTEGER | Number of URL clicks. |
billed_engagements | INTEGER | Number of billed engagements. |
carousel_swipes | INTEGER | Number of carousel swipes. |
Ad Performance by Country schema
X Ads Ad Performance by Country schema
21 fieldsTime seriesx_ads_stats_by_countrySchema on GitHub
Daily ad performance broken down by country — impressions, clicks, spend, engagements, and social actions.
| Field | Type | Description |
|---|---|---|
id | STRING | The unique identifier for the stats record. |
date | STRING | The date for which the statistics were collected. |
placement | STRING | The placement type (ALL_ON_TWITTER or PUBLISHER_NETWORK). |
country | STRING | Location ID from X Ads (hex string, e.g. 96683cc9126741d1). Join with the targeting_locations node to get the human-readable name and country code. |
impressions | INTEGER | Number of impressions. |
tweets_send | INTEGER | Number of tweets sent. |
billed_charge_local_micro | INTEGER | Billed amount in micros. |
qualified_impressions | INTEGER | Number of qualified impressions. |
follows | INTEGER | Number of follows. |
app_clicks | INTEGER | Number of app clicks. |
retweets | INTEGER | Number of retweets. |
unfollows | INTEGER | Number of unfollows. |
likes | INTEGER | Number of likes. |
engagements | INTEGER | Number of engagements. |
clicks | INTEGER | Number of clicks. |
card_engagements | INTEGER | Number of card engagements. |
poll_card_vote | INTEGER | Number of poll card votes. |
replies | INTEGER | Number of replies. |
url_clicks | INTEGER | Number of URL clicks. |
billed_engagements | INTEGER | Number of billed engagements. |
carousel_swipes | INTEGER | Number of carousel swipes. |
X Ads All Cards schema
28 fieldsx_ads_cards_allSchema on GitHub
All card types with full creative details — type, title, destination URL, call to action, and media.
| Field | Type | Description |
|---|---|---|
id | STRING | The unique identifier for the card |
name | STRING | The name of the card |
card_type | STRING | Type of the card (e.g. IMAGE_APP_DOWNLOAD, VIDEO_WEBSITE) |
card_uri | STRING | URI of the card |
created_at | DATETIME | ISO-8601 timestamp when the card was created |
updated_at | DATETIME | ISO-8601 timestamp when the card was last updated |
deleted | BOOLEAN | Whether the card is deleted |
googleplay_app_id | STRING | Google Play application ID |
country_code | STRING | Country code associated with the app or destination |
wide_app_image | STRING | URL to the wide-aspect-ratio image used by the app card |
image_display_width | STRING | Width (in pixels) of the primary image displayed with the card |
image_display_height | STRING | Height (in pixels) of the primary image displayed with the card |
app_cta | STRING | Call-to-action used on the app card (e.g. INSTALL, OPEN) |
title | STRING | Title shown on the card |
website_url | STRING | Canonical website URL |
website_dest_url | STRING | Destination URL used for clicks |
website_display_url | STRING | Display URL shown on the card |
website_shortened_url | STRING | Shortened (t.co) URL placed in the card |
video_url | STRING | URL of the video file or VMAP |
video_hls_url | STRING | HLS streaming URL |
video_poster_url | STRING | Poster image displayed before video playback |
video_content_id | STRING | Internal content identifier of the video |
video_owner_id | STRING | User ID of the video owner |
content_duration_seconds | STRING | Video duration in seconds |
video_width | STRING | Original width of the video |
video_height | STRING | Original height of the video |
video_poster_width | STRING | Width of the video poster image |
video_poster_height | STRING | Height of the video poster image |
X Ads Campaigns schema
19 fieldsx_ads_campaignsSchema on GitHub
Your campaigns — status, budget optimization, daily and total budget, and currency.
| Field | Type | Description |
|---|---|---|
name | STRING | The name of the campaign |
budget_optimization | STRING | Budget optimization strategy (e.g. LINE_ITEM) |
reasons_not_servable | ARRAY | Reasons why the campaign is not servable |
servable | BOOLEAN | Whether the campaign is servable |
purchase_order_number | STRING | Purchase order number |
effective_status | STRING | Effective status of the campaign (e.g. PAUSED) |
daily_budget_amount_local_micro | INTEGER | Daily budget amount in micros (nullable) |
funding_instrument_id | STRING | ID of the funding instrument |
duration_in_days | INTEGER | Duration of the campaign in days (nullable) |
standard_delivery | BOOLEAN | Whether standard delivery is enabled (nullable) |
total_budget_amount_local_micro | INTEGER | Total budget amount in micros (nullable) |
id | STRING | The unique identifier for the campaign |
entity_status | STRING | Entity status of the campaign |
frequency_cap | INTEGER | Frequency cap (nullable) |
currency | STRING | Currency code (e.g. USD) |
created_at | DATETIME | Timestamp when the campaign was created |
updated_at | DATETIME | Timestamp when the campaign was last updated |
deleted | BOOLEAN | Whether the campaign is deleted |
account_id | STRING | ID of the account |
X Ads Cards schema
8 fieldsx_ads_cardsSchema on GitHub
Website and app cards — type, URI, and components.
| Field | Type | Description |
|---|---|---|
id | STRING | The unique identifier for the card. |
name | STRING | The name of the card. |
card_type | STRING | Type of the card. |
card_uri | STRING | URI of the card. |
created_at | DATETIME | When the card was created. |
updated_at | DATETIME | When the card was last updated. |
deleted | BOOLEAN | Whether the card is deleted. |
components | ARRAY | Card components including media and buttons. |
X Ads Line Items schema
33 fieldsx_ads_line_itemsSchema on GitHub
Line items within campaigns — bid strategy, goal, product type, budget, and schedule.
| Field | Type | Description |
|---|---|---|
advertiser_user_id | STRING | ID of the advertiser user |
name | STRING | Name of the line item |
placements | ARRAY | List of placement targets (e.g. ALL_ON_TWITTER) |
start_time | DATETIME | Line item start time |
bid_amount_local_micro | INTEGER | Bid amount in micro-currency units |
advertiser_domain | STRING | Domain of the advertiser |
target_cpa_local_micro | INTEGER | Target CPA (cost per action) in micro-currency units |
primary_web_event_tag | STRING | Primary web event tag identifier |
goal | STRING | Line item goal/objective (e.g. APP_INSTALLS) |
daily_budget_amount_local_micro | INTEGER | Daily budget in micro-currency units |
product_type | STRING | Product type (e.g. PROMOTED_TWEETS) |
end_time | DATETIME | Line item end time (nullable) |
funding_instrument_id | STRING | ID of the funding instrument |
bid_strategy | STRING | Bidding strategy (e.g. AUTO) |
duration_in_days | INTEGER | Duration in days (nullable) |
standard_delivery | BOOLEAN | Whether standard delivery is enabled |
total_budget_amount_local_micro | INTEGER | Total budget in micro-currency units (nullable) |
objective | STRING | Campaign objective (duplicate of goal in some APIs) |
id | STRING | Unique identifier of the line item |
entity_status | STRING | Status of the line item (e.g. ACTIVE, PAUSED) |
automatic_tweet_promotion | BOOLEAN | Whether automatic tweet promotion is enabled |
frequency_cap | INTEGER | Frequency cap for ad serving |
android_app_store_identifier | STRING | Android app store identifier |
categories | ARRAY | Array of category labels |
currency | STRING | Currency code (e.g. USD) |
pay_by | STRING | Payment method (e.g. IMPRESSION) |
created_at | DATETIME | Timestamp when the line item was created |
ios_app_store_identifier | STRING | iOS app store identifier |
updated_at | DATETIME | Timestamp when the line item was last updated |
campaign_id | STRING | ID of the parent campaign |
creative_source | STRING | Source of the creative (e.g. MANUAL) |
audience_expansion | STRING | Audience expansion setting (e.g. EXPANDED) |
deleted | BOOLEAN | Whether the line item is marked as deleted |
X Ads Promoted Tweets schema
8 fieldsx_ads_promoted_tweetsSchema on GitHub
Tweets promoted as ads — status, approval, and links to their tweets and line items.
| Field | Type | Description |
|---|---|---|
line_item_id | STRING | ID of the parent line item |
id | STRING | Unique identifier for the promoted tweet |
entity_status | STRING | Status of the promoted tweet (e.g., ACTIVE, PAUSED) |
created_at | DATETIME | Timestamp when the promoted tweet was created |
updated_at | DATETIME | Timestamp when the promoted tweet was last updated |
approval_status | STRING | Approval status of the promoted tweet (e.g., ACCEPTED, REJECTED) |
tweet_id | STRING | ID of the original tweet |
deleted | BOOLEAN | Flag indicating whether the promoted tweet has been deleted |
X Ads Targeting Locations schema
4 fieldsx_ads_targeting_locationsSchema on GitHub
Reference table of location IDs with names and country codes — join targeting_value with the country field in Ad Performance by Country.
| Field | Type | Description |
|---|---|---|
targeting_value | STRING | Unique hex ID for this location (e.g. 96683cc9126741d1). Use this to join with the country field in stats_by_country. |
name | STRING | Human-readable location name (e.g. United States, California). |
location_type | STRING | Type of location: COUNTRIES, REGIONS, CITIES, METROS, or POSTAL_CODES. |
country_code | STRING | ISO 2-letter country code (e.g. US, DE, NL). |
X Ads Tweets schema
34 fieldsx_ads_tweetsSchema on GitHub
Original tweets used as ad creatives — text, type, language, engagement counts, and card URI.
| Field | Type | Description |
|---|---|---|
coordinates | OBJECT | The geographic coordinates (latitude/longitude) of the tweet, if available. |
retweeted | BOOLEAN | Whether this tweet is a retweet of another tweet. |
name | STRING | A custom name or label for the tweet. |
conversation_settings | STRING | Who can reply or interact with the tweet (e.g. EVERYONE). |
source | STRING | HTML markup indicating the client or interface used to post the tweet. |
entities | OBJECT | Parsed entities in the tweet (mentions, hashtags, URLs, media, etc.). |
display_text_range | ARRAY | Start/end indices for which portion of the tweet text to display. |
favorite_count | INTEGER | Number of times the tweet has been liked. |
in_reply_to_status_id_str | STRING | ID (as string) of the tweet this one is replying to. |
geo | OBJECT | Deprecated geographic information, if present. |
id_str | STRING | The tweet’s unique identifier, as a string. |
scopes | OBJECT | Visibility scopes (e.g. { followers: false }). |
in_reply_to_user_id | INTEGER | Numeric ID of the user this tweet is replying to. |
truncated | BOOLEAN | Whether the tweet text has been truncated. |
retweet_count | INTEGER | Number of times this tweet has been retweeted. |
scheduled_status | STRING | Scheduled status (e.g. pending scheduling), if any. |
id | INTEGER | The tweet’s unique identifier, as a number. |
in_reply_to_status_id | INTEGER | Numeric ID of the tweet this one is replying to. |
possibly_sensitive | BOOLEAN | Whether the tweet may contain sensitive content. |
nullcast | BOOLEAN | Whether the tweet is nullcast (not shown on timeline). |
created_at | STRING | Creation timestamp of the tweet. |
place | OBJECT | Place (location) associated with the tweet, if any. |
scheduled_at | STRING | When the tweet was scheduled for posting. |
tweet_type | STRING | Type of tweet (e.g. PUBLISHED). |
favorited | BOOLEAN | Whether the authenticated user has liked the tweet. |
card_uri | STRING | URI of the associated Twitter Card. |
full_text | STRING | The full text content of the tweet. |
lang | STRING | Language code of the tweet (e.g. en). |
contributors | ARRAY | Array of contributors to the tweet, if any. |
in_reply_to_screen_name | STRING | Screen name of the user this tweet is replying to. |
in_reply_to_user_id_str | STRING | ID (as string) of the user this tweet is replying to. |
user | OBJECT | The user object of the author (contains id, id_str, etc.). |
tweet_id | STRING | Duplicate of id_str (the tweet’s ID as a string). |
extended_entities | OBJECT | Extended media entities (e.g. video variants, additional media info). |
Why collect Twitter (X) Ads data into your warehouse with OWOX?
Your Twitter (X) Ads data shouldn’t be trapped in a platform you can’t query. OWOX collects it into your warehouse on autopilot — no per-connector fees, no vendor lock-in. The entire platform is open-source on GitHub, so you can self-host it today and never worry about losing access to your own data pipelines.

Collect to your warehouse
No per-connector pricing — connect as many sources as you need, all included

Zero-maintenance syncs
Fully open-source on GitHub — self-host anytime, no vendor lock-in, your data stays yours

Full-funnel joins
Full transparency and control — every query, every schema, every schedule is visible and auditable

R01 · Collect
Collect all your Twitter (X) Ads data with zero engineering
Pull everything your company needs from Twitter (X) Ads without touching code or maintaining custom scripts. OWOX Data Marts handle the heavy lifting.
- Your Twitter (X) Ads data is stored in one place – your own infrastructure. OWOX Data Marts automatically land your data into BigQuery, Snowflake, or Redshift.
- Your Twitter (X) Ads data lands on a schedule: clean, complete, and ready to re-use across reports, dashboards, BI tools, and spreadsheets.
- No API maintenance, no broken scripts — just reliable daily syncs

R02 · Report
Build reports with Twitter (X) Ads data that everyone trusts
Once your Twitter (X) Ads data lands in your warehouse, OWOX Data Marts make it instantly reusable across spreadsheets and BI tools.
- Pre-built data marts for campaign performance, spend, and conversions
- Join Twitter (X) Ads with CRM, GA4, and revenue data in one query
- Self-serve reporting for marketing teams — no analyst tickets needed

R03 · Visualize
Visualize Twitter (X) Ads data instantly in your BI tools
With OWOX Data Marts, your Twitter (X) Ads data becomes instantly available for charts, dashboards, pivots, and spreadsheets.
- Whether you use Google Sheets, Looker Studio, Excel, or Power BI, OWOX delivers clean, scheduled Twitter (X) Ads data that just works.
- Deliver to Looker Studio, Google Sheets, Power BI, or Excel automatically
- Same numbers everywhere — one source of truth for all stakeholders
Why use OWOX connectors to collect your Twitter (X) Ads data?
Eight outcomes you get the moment your data marts go live.
Full picture, one screen
Send X Ads spend and engagement into dashboards from one governed source — performance you keep regardless of API churn.
Beyond native dashboards
The X API changes often; in your warehouse your historical ad data survives whatever the platform does next.
Your questions, your reports
Build reports that answer your questions — CPA, ROAS, engagement cost — on your definitions, not X’s defaults.
Faster decisions, better data
Durable data means year-over-year comparisons hold even as the platform’s own reporting shifts.
Always fresh, always complete
OWOX Data Marts automate X Ads collection on a schedule — campaigns, ads, and spend — with no manual exports.
All sources, one warehouse
Merge X Ads with every other channel and revenue for one blended acquisition view.
Zero manual work
Automate transfer into BigQuery, Snowflake, or Redshift — governed and reusable across every report, saving time and removing errors.
Blended reports
Once X data lands in governed Data Marts, anyone can ask in their own AI chat — “what did X actually return last quarter?” — every number tracing to analyst-written SQL.
Not testimonials. Comment threads.
Real things real customers said — each quote pinned to a specific claim, straight from the quotes database.
“AI, by the nature of the models, will hallucinate. And because of that, you need something which will create guardrails to ensure that there are no hallucinations, that you can trust your data.”
“We had six or seven different channels and no single source of truth — it was almost impossible, a lot of guesswork.”
“We regained time. And time is the one resource that never comes back.”
Start collecting Twitter (X) Ads data for free
Set up your Twitter (X) Ads connector in minutes. No credit card, no engineering team required.







