ZenABM API
v1.0The ZenABM API gives you programmatic access to your ABM data — companies, campaigns, deals, job titles, ABM stages, and more. All endpoints return JSON and require Bearer token authentication.
https://app.zenabm.com/api/v1Bearer tokenJSONcurl "https://app.zenabm.com/api/v1/companies?pageSize=5" \
-H "Authorization: Bearer sk_live_xxx"Authentication
Authenticate by including your API token in the Authorization header of every request. Generate tokens from your API Keys page.
Security: Keep your token secret. Never expose it in client-side code, Git repos, or logs.
Authorization: Bearer sk_live_your_api_token{
"error": {
"status": 401,
"code": "UNAUTHORIZED",
"message": "Invalid API token"
}
}Companies
Companies represent organizations that have engaged with your LinkedIn ads. Each company includes engagement metrics, ABM stage data, and CRM match status.
List companies with insights
/companiesReturns a paginated list of companies with engagement metrics. Filter by campaigns, ABM stages, engagement scores, or CRM match status.
curl "https://app.zenabm.com/api/v1/companies?period=last30Days&campaigns=cm1abc,cm2def&campaignType=all_abm_campaigns" \
-H "Authorization: Bearer sk_live_xxx"Get company by ID
/companies/{id}Retrieve a single company by its ID, including full profile and current metrics.
curl "https://app.zenabm.com/api/v1/companies/{id}" \
-H "Authorization: Bearer sk_live_xxx"Get company metrics overview
/companies/{id}/overviewReturns aggregated and weekly metrics for a company over a given time period.
curl "https://app.zenabm.com/api/v1/companies/{id}/overview?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"List Ad Sets for a company
/companies/{id}/campaignsReturns campaigns that a specific company has been exposed to, with per-company metrics.
curl "https://app.zenabm.com/api/v1/companies/{id}/campaigns?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"List Campaigns for a company
/companies/{id}/campaign-groupsOptional filters: sortBy, sortOrder, search
curl "https://app.zenabm.com/api/v1/companies/{id}/campaign-groups?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"List ABM campaigns for a company
/companies/{id}/abm-campaignsOptional filters: sortBy, sortOrder
curl "https://app.zenabm.com/api/v1/companies/{id}/abm-campaigns?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"Get company timeline
/companies/{id}/timelineReturns a chronological list of engagement events for a company within a date range.
curl "https://app.zenabm.com/api/v1/companies/{id}/timeline" \
-H "Authorization: Bearer sk_live_xxx"Get company activity log
/companies/{id}/activity-logMerged chronological feed of stage changes, deals, intents, and exclusions. Paginated via page/pageSize. Note: totalCount/totalPages are not returned because the feed is merged from multiple sources. Pass startDate/endDate (YYYY-MM-DD) to scope the feed to a window — when a date range is supplied, weekly LinkedIn ad-activity entries (type: "linkedin_activity_week", carrying a metrics object with impressions/clicks/engagements/costInUsd) are merged into the feed.
curl "https://app.zenabm.com/api/v1/companies/{id}/activity-log" \
-H "Authorization: Bearer sk_live_xxx"Get deals for a company
/companies/{id}/dealsOptional filters: sortBy, sortOrder
curl "https://app.zenabm.com/api/v1/companies/{id}/deals" \
-H "Authorization: Bearer sk_live_xxx"Get ABM stages for a company
/companies/{id}/abm-stagesReturns the ABM stage history for a company, showing progression through your funnel.
curl "https://app.zenabm.com/api/v1/companies/{id}/abm-stages" \
-H "Authorization: Bearer sk_live_xxx"Ad Sets
LinkedIn ad sets with performance metrics, company-level breakdowns, and job title insights.
List Ad Sets with insights
/campaignsReturns a paginated list of LinkedIn Ad Sets with aggregated performance metrics for the requested date range. Filter by status (default: ACTIVE,PAUSED) or search by name. Each item includes both ZenABM's internal id (when the ad set has been imported) and the LinkedIn-native linkedInId. To list ad sets within a specific ABM campaign use /abm-campaigns/{id} instead.
curl "https://app.zenabm.com/api/v1/campaigns?period=last30Days&status=ACTIVE,PAUSED" \
-H "Authorization: Bearer sk_live_xxx"Get Ad Set by ID
/campaigns/{id}Identity and relations only. Delivery settings (budgets, bid, objective, cost type, optimization target, pacing, Audience Expansion, LinkedIn Audience Network), audience size and targeting come from /campaigns/{id}/settings, which reads them live from LinkedIn Campaign Manager.
curl "https://app.zenabm.com/api/v1/campaigns/{id}" \
-H "Authorization: Bearer sk_live_xxx"Get Ad Set delivery and targeting settings
/campaigns/{id}/settingsRead LIVE from LinkedIn Campaign Manager on every call, not from ZenABM's sync, so it reflects an edit made minutes ago. Fields listed in unknownSettings were not returned by LinkedIn — treat them as unknown, never as "off". audienceSize is the estimated ADDRESSABLE audience, not reach: impressions / audienceSize is only a lower bound on frequency, and exclusions are left out of it (see audienceSizeExcludesApplied). Each targeting facet reports count (values targeted), values (readable names only) and unnamed (values with no name available, most often specific geographic locations). Returns 502 if LinkedIn is unreachable rather than falling back to synced values.
curl "https://app.zenabm.com/api/v1/campaigns/{id}/settings" \
-H "Authorization: Bearer sk_live_xxx"Get LinkedIn's suggested bid for an Ad Set
/campaigns/{id}/suggested-bidLinkedIn's suggested bid for the Ad Set — the same number Campaign Manager shows — plus the allowed bid range and daily budget limits. Read LIVE on every call: the Ad Set's current targeting, objective and cost type are echoed into LinkedIn's pricing finder, so the answer reflects edits made minutes ago. Also returns the current bid and daily budget for context. Not available for Dynamic Ads. Returns 422 when the Ad Set cannot be priced (Dynamic Ads, unsupported cost/campaign type, missing or oversized targeting), 502 when LinkedIn is unreachable or has no pricing for the targeting.
curl "https://app.zenabm.com/api/v1/campaigns/{id}/suggested-bid" \
-H "Authorization: Bearer sk_live_xxx"Get Ad Set metrics overview
/campaigns/{id}/overviewPerformance totals for a single Ad Set over the requested date range (no weekly breakdown).
curl "https://app.zenabm.com/api/v1/campaigns/{id}/overview?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"List companies for a Ad Set
/campaigns/{id}/companiesOptional filters: sortBy, sortOrder, search
curl "https://app.zenabm.com/api/v1/campaigns/{id}/companies?period=last30Days&hideExcludedCompanies=false" \
-H "Authorization: Bearer sk_live_xxx"Get job title insights for a Ad Set
/campaigns/{id}/job-titlesReturns job title engagement breakdown for a specific campaign.
curl "https://app.zenabm.com/api/v1/campaigns/{id}/job-titles?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"Ad Set monthly spend
/ad-spendReturns ad spend for LinkedIn Ad Sets within the requested date range. Response includes a summary of totals across the whole range and a byAdSet array — one entry per ad set, each carrying its own totals plus monthly buckets (year, month, period like "2026-05"). Pagination scopes byAdSet (summary always reflects the full range). Each ad set includes both ZenABM's internal id (when imported) and the LinkedIn-native linkedInId. Filter to a single ad set with the linkedInId query param.
curl "https://app.zenabm.com/api/v1/ad-spend?period=last30Days&linkedInId=123456" \
-H "Authorization: Bearer sk_live_xxx"Aggregated LinkedIn metrics for a date range
/linkedin-metricsReturns aggregated impressions, clicks, engagements, conversions, and cost for the specified date range, read live from LinkedIn. Optionally filter by a single LinkedIn ad set or campaign ID. Set includeReach=true to also get unique member reach and frequency.
Two response shapes. With timeGranularity=ALL (the default) and no metrics parameter, the response is the flat totals object shown below. Setting timeGranularity to DAILY/MONTHLY/YEARLY or passing metrics switches the response to the timeseries shape: { startDate, endDate, timeGranularity, fields, rows, totals, truncated }, where rows holds one { periodStart, periodEnd, <metric>: number } object per period and totals sums each requested metric over the whole range. includeReach only works with the flat shape.
curl "https://app.zenabm.com/api/v1/linkedin-metrics?period=last30Days&timeGranularity=ALL&metrics=impressions,clicks,costInUsd" \
-H "Authorization: Bearer sk_live_xxx"Creatives
Individual LinkedIn ad creatives with format, serving status, and parent ad set and campaign context.
List ad creatives
/creativesReturns a cursor-paginated catalog of the individual ad creatives (the actual ads) in the LinkedIn ad account. Each item includes the LinkedIn-native linkedInId, the full creativeUrn, name, ad format, status, serving state, and the parent ad set + campaign (with both ZenABM id — when imported — and linkedInId). Each response carries a nextCursor: pass it back as the cursor query parameter to fetch the next page (hasMore is false on the last page). Optionally scope to one ad set (adSetId) or campaign (campaignId).
curl "https://app.zenabm.com/api/v1/creatives" \
-H "Authorization: Bearer sk_live_xxx"Campaigns
Campaigns are logical groupings of LinkedIn ad sets with aggregated performance metrics.
List Campaigns with insights
/campaign-groupsReturns a paginated list of LinkedIn Campaigns with aggregated performance metrics for the requested date range. Filter by status (default: ACTIVE,PAUSED) or search by name. Each item includes both ZenABM's internal id (when the campaign has been imported) and the LinkedIn-native linkedInId. To list campaigns within a specific ABM campaign use /abm-campaigns/{id} instead.
curl "https://app.zenabm.com/api/v1/campaign-groups?period=last30Days&status=ACTIVE,PAUSED" \
-H "Authorization: Bearer sk_live_xxx"Get Campaign by ID
/campaign-groups/{id}Returns a single Campaign with its child Ad Sets in the adSets array (id, linkedInId, name, status, human-readable format).
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}" \
-H "Authorization: Bearer sk_live_xxx"Get Campaign metrics overview
/campaign-groups/{id}/overviewPerformance totals for a single Campaign over the requested date range — aggregated to a single summary (no weekly breakdown).
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}/overview?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"List companies for a Campaign
/campaign-groups/{id}/companiesOptional filters: sortBy, sortOrder, search
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}/companies?period=last30Days&hideExcludedCompanies=false" \
-H "Authorization: Bearer sk_live_xxx"Get job title insights for a campaign group
/campaign-groups/{id}/job-titlesOptional filters: sortBy, sortOrder
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}/job-titles?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"Deals
CRM deals synced with ZenABM — HubSpot deals and Salesforce opportunities in one list, each tagged with its source. Includes LinkedIn and ABM influence attribution to measure pipeline impact.
List deals with insights
/dealsReturns a paginated list of CRM deals with influence attribution data. Deals from every connected CRM come back in one list: HubSpot deals, Salesforce opportunities and Attio deals. Each deal carries source, externalId (its record ID in that CRM) and externalUrl (a link straight to the record), so you can match a deal back to the CRM it came from. costBeforeDeal/costAfterDeal are LinkedIn ad spend in USD, always — unlike amount, they do not follow the team's display currency.
curl "https://app.zenabm.com/api/v1/deals?source=all&startDate=2025-01-01&endDate=2025-12-31" \
-H "Authorization: Bearer sk_live_xxx"Job Titles
Analyze which job titles are engaging with your ads. Understand your audience at the persona level.
List job titles with insights
/job-titlesOptional filters: Ad Sets (comma-separated IDs), Campaigns (comma-separated IDs)
curl "https://app.zenabm.com/api/v1/job-titles?period=last30Days&includeWeekly=true" \
-H "Authorization: Bearer sk_live_xxx"Get job title performance overview
/job-titles/{id}/overviewPerformance totals for a single job title over the date range — aggregated across the whole ad account (impressions, clicks, engagements, cost, conversions, CTR, CPC). The path id is the job title URN. Returns zeroes if the job title had no activity in the window.
curl "https://app.zenabm.com/api/v1/job-titles/{id}/overview?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"Get Ad Set insights for a job title
/job-titles/{id}/campaignsAd sets this job title was exposed to, with per-job-title delivery metrics. The path id is the job title URN. Optional filters: sortBy, sortOrder, search. Job title interactions are stored as weekly totals anchored on the Sunday that ends each Monday–Sunday week, so a date range selects whole weeks rather than exact days. meta.dateRange reports what was actually summed: the range you asked for, the range covered, and how many weeks that was. When weeksCovered is 0 no week ended inside your range, so the totals are empty by definition — widen the range rather than reading it as no activity.
curl "https://app.zenabm.com/api/v1/job-titles/{id}/campaigns?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"Get Campaign insights for a job title
/job-titles/{id}/campaign-groupsOptional filters: sortBy, sortOrder, search. Job title interactions are stored as weekly totals anchored on the Sunday that ends each Monday–Sunday week, so a date range selects whole weeks rather than exact days. meta.dateRange reports what was actually summed: the range you asked for, the range covered, and how many weeks that was. When weeksCovered is 0 no week ended inside your range, so the totals are empty by definition — widen the range rather than reading it as no activity.
curl "https://app.zenabm.com/api/v1/job-titles/{id}/campaign-groups?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"ABM Campaigns
ABM campaigns are high-level campaign groupings with funnel stage tracking and overview metrics.
List ABM campaigns with insights
/abm-campaignsOptional filters: status (ACTIVE,PAUSED,COMPLETED)
curl "https://app.zenabm.com/api/v1/abm-campaigns?period=last30Days&status=ACTIVE" \
-H "Authorization: Bearer sk_live_xxx"Get ABM campaign by ID
/abm-campaigns/{id}Returns the ABM campaign plus the LinkedIn entities the user assigned to it. An ABM campaign can be backed by campaigns (linkedinCampaigns), ad sets (linkedinAdSets), or both — each array is a direct membership, not a parent/child hierarchy. Either can be empty.
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}" \
-H "Authorization: Bearer sk_live_xxx"Get ABM campaign performance overview
/abm-campaigns/{id}/overviewPerformance for the date range: metrics (LinkedIn delivery — impressions, clicks, engagements, cost, conversions, CTR, CPC across the ad sets + campaigns assigned to this ABM campaign) and effectiveness (business outcomes — companiesTargeted, totalPipeline, totalRevenue, totalAdSpend, pipePerSpent, averageAcv, roas). Currency note: metrics.costInUsd and effectiveness.totalAdSpend are always USD; effectiveness.totalPipeline, totalRevenue, and averageAcv are in the team displayCurrency (HubSpot deal amounts converted at sync time). pipePerSpent and roas are therefore ratios across the two currencies — treat as approximate unless displayCurrency is USD.
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/overview?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"Get ABM campaign stages breakdown
/abm-campaigns/{id}/stages-breakdownReturns a breakdown of companies across each ABM funnel stage.
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/stages-breakdown?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"List companies for an ABM campaign
/abm-campaigns/{id}/companiesReturns a paginated list of companies with engagement metrics and intent data for a specific ABM campaign. Aggregates data from all linked LinkedIn campaigns and campaign groups. abmStage is the company's stage within this campaign — null until the company has one here — and a manual stage override on the company takes precedence; lifetimeAbmStage stays company-wide.
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/companies?period=last30Days&engagementScores=3,4,5&crmMatchStatus=all" \
-H "Authorization: Bearer sk_live_xxx"List job titles for an ABM campaign
/abm-campaigns/{id}/job-titlesReturns a paginated list of job titles with engagement metrics for a specific ABM campaign. Aggregates data from all linked LinkedIn campaigns and campaign groups.
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/job-titles?period=last30Days" \
-H "Authorization: Bearer sk_live_xxx"ABM Stages
ABM funnel stages — track companies entering, progressing through, and the history of each stage.
List ABM stages
/abm-stagesReturns every ABM stage for the team, each with its full condition model. blockOperator (AND/OR) joins the stage's conditionBlocks; each block joins its own conditions with its operator (AND/OR). Each condition carries a type plus only the fields relevant to that type (null fields are omitted). Condition types: LINKEDIN_METRICS, LIFECYCLE_STAGE, DEAL_STAGE, CUSTOM_PROPERTY (HubSpot company property), CONTACT_PROPERTY (HubSpot contact property, matches when at least minMatchingContacts of the company's contacts satisfy the mapping), ATTIO_COMPANY_PROPERTY, ATTIO_DEAL_STAGE. Property-mapping operator values include equals, not_equals, contains, not_contains, greater_than, greater_than_or_equal, less_than, less_than_or_equal, between, in_list, not_in_list, is_known, is_unknown. All ids returned (scopeIds, dealStageIds, pipelineIds, lifecycleStageIds, mapping ids) are this team's own ids.
curl "https://app.zenabm.com/api/v1/abm-stages" \
-H "Authorization: Bearer sk_live_xxx"Manage an ABM stage
/abm-stages/manageApplies one or more changes to the ABM stage funnel. The body is either a single operation object (not wrapped) or { "operations": [...] } with 1–10 of them. Each operation is discriminated on op: create_stage, rename_stage, recolor_stage, delete_stage, reorder_stage, set_stage_block_operator, set_stage_conditions, add_condition_block, remove_condition_block, set_block_operator, add_condition, replace_condition, remove_condition. This is the first write endpoint in v1. It is gated by the same API access plan feature as the read endpoints.
Batches. Operations in operations apply in order, and each one sees the result of the one before it — so after a remove_condition_block the later block indexes shift, and a stage created earlier in the batch can be addressed by name later in it. A batch is not atomic: when a step fails, the earlier steps stay applied and the error reports which step failed. Read the stage back before you retry. To rewrite a whole rule, prefer one set_stage_conditions over a batch of remove + add operations.
Names, not ids. Stages, lifecycle stages, deal stages, pipelines, properties, Attio attributes, Ad Sets, Campaigns and ABM campaigns are all addressed by name. Stage names match case-insensitively; a unique prefix or substring also resolves. A stageRef may carry an id instead when you already have one. An unknown or ambiguous name returns 422 UNRESOLVED_REFERENCE and the message lists the available candidates.
Fixed stages. Identified is always first and Customer, Lost and Disqualified are always last. They cannot be moved, renamed or deleted, and a position that would displace them returns 422 INVALID_OPERATION.
Indexes. blockIndex and conditionIndex are 0-based positions in conditionBlocks and in a block’s conditions, exactly as GET /abm-stages/{id} returns them. Read the stage first, then address the block or condition by position. An out-of-range index returns 422 INVALID_OPERATION. replace_condition swaps one condition in place: send the full new condition, or the existing one with a single field changed. set_stage_conditions replaces every block on the stage with the blocks you send (and optionally sets blockOperator), so no index is needed.
Conditions. A contact_property condition matches when at least minMatchingContacts (default 1) of the company’s contacts satisfy it. A deal_stage condition needs pipelineNames when the same stage name repeats across pipelines. A linkedin_metric condition with a scope other than INHERIT_CAMPAIGN needs at least one entry in scopeNames.
Response. data.applied and data.total count the operations that ran and the operations in the request (both 1 for a single operation). data.stage is the stage re-read after the last operation, with the same condition model as GET /abm-stages/{id} (null only when the last operation was delete_stage). data.warnings is non-blocking: it names what a delete_stage removed, and it flags a condition that points at something that no longer exists (a deleted lifecycle stage, deal stage, property or LinkedIn asset) so you can fix it with replace_condition or set_stage_conditions.
Errors. A failed step uses the same status codes as a single operation: 400 INVALID_INPUT, 422 UNRESOLVED_REFERENCE / INVALID_OPERATION, 403 FEATURE_NOT_AVAILABLE / PLAN_NOT_ALLOWED, 404 NOT_FOUND, 502 CRM_UNAVAILABLE. When the request holds more than one operation, the message starts with Step N of M (<op>): .
curl -X POST "https://app.zenabm.com/api/v1/abm-stages/manage" \
-H "Authorization: Bearer sk_live_xxx" \
-H "Content-Type: application/json" \
-d '{
"op": "rename_stage",
"stageRef": {
"name": "Aware"
},
"name": "Engaged"
}'Get ABM stage by ID
/abm-stages/{id}Returns the ABM stage with currentCompaniesCount (companies currently in this stage) and its full condition model. blockOperator (AND/OR) joins the conditionBlocks; each block joins its conditions with its operator (AND/OR). Each condition carries a type plus only the fields relevant to that type (null fields are omitted):
LINKEDIN_METRICS:metric,comparison,minValue,maxValue,windowDays(rolling window; omitted = since campaign start),scope(INHERIT_CAMPAIGN|LINKEDIN_CAMPAIGN_GROUPS|LINKEDIN_AD_SETS|ABM_CAMPAIGNS),scopeIds.LIFECYCLE_STAGE:lifecycleStageIds.DEAL_STAGE:dealStageIds,pipelineIds(pipelines that scope amatchAnyOpenDealcondition; omitted means any tracked pipeline),matchAnyOpenDeal.ATTIO_DEAL_STAGE:attioDealStatusIds,attioMatchAnyOpenDeal.CUSTOM_PROPERTY(HubSpot company) /CONTACT_PROPERTY(HubSpot contact): apropertyMappingwithhubspotPropertyName,operator,propertyObjectType(COMPANY|CONTACT),minMatchingContacts(contact-property match threshold), and any ofexpectedValue,expectedValues,numericThreshold,numericThresholdMax.ATTIO_COMPANY_PROPERTY: anattioPropertyMappingwithattributeSlug,attributeTitle,operator, and value fields. Property-mappingoperatorvalues includeequals,not_equals,contains,not_contains,greater_than,greater_than_or_equal,less_than,less_than_or_equal,between,in_list,not_in_list,is_known,is_unknown.
curl "https://app.zenabm.com/api/v1/abm-stages/{id}" \
-H "Authorization: Bearer sk_live_xxx"List companies currently in an ABM stage
/abm-stages/{id}/companiesReturns a paginated list of companies whose current ABM stage matches the given stage ID. Supports search and sorting.
curl "https://app.zenabm.com/api/v1/abm-stages/{id}/companies?hideExcludedCompanies=false" \
-H "Authorization: Bearer sk_live_xxx"Get companies entering an ABM stage
/abm-stages/{id}/companies-enteringcurl "https://app.zenabm.com/api/v1/abm-stages/{id}/companies-entering?campaignType=current_abm_stage" \
-H "Authorization: Bearer sk_live_xxx"Get companies progressing from an ABM stage
/abm-stages/{id}/companies-progressingcurl "https://app.zenabm.com/api/v1/abm-stages/{id}/companies-progressing?campaignType=current_abm_stage" \
-H "Authorization: Bearer sk_live_xxx"Get ABM stage history
/abm-stages/{id}/historycurl "https://app.zenabm.com/api/v1/abm-stages/{id}/history" \
-H "Authorization: Bearer sk_live_xxx"Intents
Intent signals configured for your team — used to qualify and prioritize target accounts.
List intents
/intentscurl "https://app.zenabm.com/api/v1/intents" \
-H "Authorization: Bearer sk_live_xxx"Get intent by ID
/intents/{id}Returns the intent with the ad sets and campaigns it is assigned to, plus companyCount — the number of companies tagged with this intent.
curl "https://app.zenabm.com/api/v1/intents/{id}" \
-H "Authorization: Bearer sk_live_xxx"Contacts
HubSpot contacts with source touchpoint totals, company context, ABM stage context, and related deals.
List contacts with source touchpoints
/contactsReturns a paginated list of HubSpot contacts with source touchpoint totals, company context, ABM stage context, and related deals.
curl "https://app.zenabm.com/api/v1/contacts?startDate=2026-04-01T00:00:00.000Z&endDate=2026-05-01T00:00:00.000Z&touchpoints=PAID_SEARCH,AI_REFERRALS|AI: ChatGPT" \
-H "Authorization: Bearer sk_live_xxx"Get contact journey
/contacts/{id}Returns a single contact with company context, source events, related deals, and a weekly source-event timeline.
curl "https://app.zenabm.com/api/v1/contacts/{id}" \
-H "Authorization: Bearer sk_live_xxx"Sources
Aggregated contact source events grouped by source type — paid search, paid social, AI referrals, and more — with click, contact, and company breakdowns.
List contact source aggregates
/sourcesReturns aggregated contact source events grouped by source type. Each row reports total clicks, distinct contacts, and distinct companies. Filter by an optional date range.
curl "https://app.zenabm.com/api/v1/sources?startDate=2026-04-01T00:00:00.000Z&endDate=2026-05-01T00:00:00.000Z" \
-H "Authorization: Bearer sk_live_xxx"Get source detail by type
/sources/{sourceType}Returns the contacts, companies, and weekly timeline for a single source type within an optional date range. Capped at the most recent 500 events.
curl "https://app.zenabm.com/api/v1/sources/{sourceType}?label=AI: ChatGPT&period=last30Days&startDate=2026-04-01T00:00:00.000Z" \
-H "Authorization: Bearer sk_live_xxx"Ad Library
Search LinkedIn's public Ad Library by advertiser or keyword to profile competitor ads. Returns normalized ad metadata — format, EU/EEA impression ranges with per-country split, first/last impression dates, and targeting facets. Impression and targeting data is EU/EEA-only (DSA); US-only advertisers return null statistics.
Search the LinkedIn Ad Library by advertiser
/ad-library/by-advertiserProfile a competitor's ads. Searches LinkedIn's public Ad Library by advertiser name (fuzzy match) and returns normalized ad metadata (format, EU/EEA impression ranges + per-country split, first/last impression dates, and which targeting facets were used). LinkedIn's advertiser search is fuzzy, so responses include an advertisers list — pick the right companyId from it and pass it back to filter to the exact advertiser. Country and date filters are applied over the returned ads. Impression/targeting data is EU/EEA-only (DSA); US-only advertisers return null statistics (treat as unknown, not zero).
curl "https://app.zenabm.com/api/v1/ad-library/by-advertiser?limit=25" \
-H "Authorization: Bearer sk_live_xxx"Search the LinkedIn Ad Library by keyword
/ad-library/by-keywordDiscover who advertises on a topic. Full-text searches LinkedIn's public Ad Library ad copy and returns the same normalized ad metadata as /ad-library/by-advertiser. Optionally narrow to a single advertiser. Country and date filters are applied over the returned ads. Impression/targeting data is EU/EEA-only (DSA).
curl "https://app.zenabm.com/api/v1/ad-library/by-keyword?limit=25" \
-H "Authorization: Bearer sk_live_xxx"Dashboard
Dashboard-level aggregate metrics — top companies, ad spend, and overall performance at a glance.
Get dashboard overview
/dashboardReturns a high-level overview with top companies, total metrics, and ad spend for the given date range.
curl "https://app.zenabm.com/api/v1/dashboard" \
-H "Authorization: Bearer sk_live_xxx"Need help?
Our team can help with integration, debugging, or custom endpoint requests.
Contact support{
"rateLimit": {
"requests": "100/min",
"headers": {
"X-RateLimit-Limit": 100,
"X-RateLimit-Remaining": 97
}
}
}