ZenABM API

v1.0

The 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.

Basehttps://app.zenabm.com/api/v1
AuthBearer token
FormatJSON
Quick start
curl "https://app.zenabm.com/api/v1/companies?pageSize=5" \
  -H "Authorization: Bearer sk_live_xxx"
Open in Postman

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.

Header
Authorization: Bearer sk_live_your_api_token
Error (401)
{
  "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

||
GET/companies

Returns a paginated list of companies with engagement metrics. Filter by campaigns, ABM stages, engagement scores, or CRM match status.

Request
curl "https://app.zenabm.com/api/v1/companies?period=last30Days&campaigns=cm1abc,cm2def&campaignType=all_abm_campaigns" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "Pied Piper",
      "city": "Palo Alto",
      "country": "US",
      "website": "https://www.piedpiper.com/",
      "linkedInOrgId": "4827017",
      "hubspotCompanyId": "37411334702",
      "salesforceId": "0015f00000AbCdEfGh",
      "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "lifetimeEngagementScore": 3,
      "abmStageId": "1337_interested",
      "lifetimeAbmStageId": "1337_interested",
      "logoUrl": "https://piedpiper.com/assets/images/logo.png",
      "abmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3,
        "isManuallyOverridden": false,
        "overrideTimestamp": null
      },
      "lifetimeAbmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "intents": [
        {
          "id": "cm9iaw4a50001jr04wqc1k4dt",
          "name": "Competitor"
        }
      ],
      "impressions": 109198,
      "clicks": 468,
      "engagements": 2769,
      "costInUsd": 2797.37,
      "currentEngagementScore": 2,
      "abmCampaigns": [
        {
          "id": "1337",
          "name": "Techcrunch 2025"
        }
      ],
      "exclusion": null,
      "weeklyData": [
        {
          "weekStart": "2026-03-03",
          "weekEnd": "2026-03-09",
          "impressions": 142,
          "clicks": 3,
          "engagements": 2,
          "costInUsd": 45.72
        },
        {
          "weekStart": "2026-03-10",
          "weekEnd": "2026-03-16",
          "impressions": 511,
          "clicks": 5,
          "engagements": 12,
          "costInUsd": 10.94
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 1,
    "totalCount": 35960,
    "totalPages": 35960
  },
  "meta": {
    "timestamp": "2026-03-09T18:08:06.901Z"
  }
}

Get company by ID

||
GET/companies/{id}

Retrieve a single company by its ID, including full profile and current metrics.

Request
curl "https://app.zenabm.com/api/v1/companies/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "1337",
    "name": "Pied Piper",
    "country": "US",
    "city": "Palo Alto",
    "website": "https://www.piedpiper.com/",
    "logoUrl": "https://piedpiper.com/assets/images/logo.png",
    "linkedInOrgId": "4827017",
    "hubspotCompanyId": "37411334702",
    "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "abmStage": {
      "id": "1337_interested",
      "name": "Interested",
      "color": "#10B981",
      "displayOrder": 3
    },
    "lifetimeAbmStage": {
      "id": "1337_interested",
      "name": "Interested",
      "color": "#10B981",
      "displayOrder": 3
    },
    "lifetimeEngagementScore": 5,
    "exclusionCount": 0
  },
  "meta": {
    "timestamp": "2026-03-09T18:34:17.198Z"
  }
}

Get company metrics overview

||
GET/companies/{id}/overview

Returns aggregated and weekly metrics for a company over a given time period.

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/overview?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "summary": {
      "impressions": 109198,
      "clicks": 468,
      "engagements": 2769,
      "costInUsd": 2797.37
    },
    "weeklyData": [
      {
        "weekStart": "2025-03-03",
        "weekEnd": "2025-03-09",
        "impressions": 142,
        "clicks": 3,
        "engagements": 2,
        "costInUsd": 45.72
      },
      {
        "weekStart": "2025-03-10",
        "weekEnd": "2025-03-16",
        "impressions": 3607,
        "clicks": 31,
        "engagements": 35,
        "costInUsd": 106.35
      }
    ]
  },
  "meta": {
    "timestamp": "2026-03-09T18:30:27.973Z"
  }
}

List Ad Sets for a company

||
GET/companies/{id}/campaigns

Returns campaigns that a specific company has been exposed to, with per-company metrics.

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/campaigns?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337_campaign_id",
      "name": "Techcrunch 2025",
      "format": "Single Image",
      "impressions": 5923,
      "clicks": 31,
      "engagements": 58,
      "costInUsd": 436.58,
      "intents": [
        {
          "id": "1337",
          "name": "Competitor"
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 114,
    "totalPages": 6
  },
  "meta": {
    "timestamp": "2026-03-09T18:41:52.562Z"
  }
}

List Campaigns for a company

||
GET/companies/{id}/campaign-groups

Optional filters: sortBy, sortOrder, search

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/campaign-groups?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337_campaign_group_id",
      "name": "Techcrunch 2025 CG",
      "impressions": 47759,
      "clicks": 273,
      "engagements": 2380,
      "costInUsd": 1580.19
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 35,
    "totalPages": 2
  },
  "meta": {
    "timestamp": "2026-03-09T18:44:34.534Z"
  }
}

List ABM campaigns for a company

||
GET/companies/{id}/abm-campaigns

Optional filters: sortBy, sortOrder

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/abm-campaigns?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337_abm_campaign_id",
      "name": "Silicon Valley 2025",
      "status": "ACTIVE",
      "impressions": 111554,
      "clicks": 462,
      "engagements": 2763,
      "costInUsd": 2232.13
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 8,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-03-09T18:51:43.208Z"
  }
}

Get company timeline

||
GET/companies/{id}/timeline

Returns a chronological list of engagement events for a company within a date range.

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/timeline" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "summary": {
      "impressions": 109617,
      "clicks": 468,
      "engagements": 2769,
      "costInUsd": 2797.37
    },
    "deals": [],
    "stageHistory": [
      {
        "stageId": "1337_identified",
        "stageName": "Identified",
        "stageColor": "#3B82F6",
        "enteredAt": "2025-03-01T00:00:00.000Z",
        "previousStageName": null
      },
      {
        "stageId": "1337_aware",
        "stageName": "Aware",
        "stageColor": "#A855F7",
        "enteredAt": "2025-04-15T00:00:00.000Z",
        "previousStageName": "Identified"
      }
    ]
  },
  "meta": {
    "timestamp": "2026-03-09T19:00:28.135Z"
  }
}

Get company activity log

||
GET/companies/{id}/activity-log

Merged 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.

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/activity-log" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "linkedin-activity-clxyz789",
      "type": "linkedin_activity_week",
      "date": "2026-05-04T00:00:00.000Z",
      "title": "LinkedIn ad activity",
      "description": "4,210 impressions · 38 clicks · 12 engagements",
      "metrics": {
        "impressions": 4210,
        "clicks": 38,
        "engagements": 12,
        "costInUsd": 142.87
      }
    },
    {
      "id": "lifetime-stage-1337",
      "type": "lifetime_abm_stage_change",
      "date": "2026-03-28T11:00:00.000Z",
      "title": "Lifetime ABM Stage changed to Interested",
      "description": "Previously: Aware",
      "toStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981"
      },
      "fromStage": {
        "id": "1337_aware",
        "name": "Aware",
        "color": "#A855F7"
      }
    },
    {
      "id": "lifetime-stage-1338",
      "type": "lifetime_abm_stage_change",
      "date": "2026-03-15T08:00:00.000Z",
      "title": "Lifetime ABM Stage changed to Aware",
      "description": "Previously: Identified",
      "toStage": {
        "id": "1337_aware",
        "name": "Aware",
        "color": "#A855F7"
      },
      "fromStage": {
        "id": "1337_identified",
        "name": "Identified",
        "color": "#3B82F6"
      }
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20
  },
  "meta": {
    "timestamp": "2026-04-12T19:02:02.855Z"
  }
}

Get deals for a company

||
GET/companies/{id}/deals

Optional filters: sortBy, sortOrder

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/deals" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "data": [
      {
        "id": "clxyz123abc",
        "source": "hubspot",
        "dealName": "Acme Corp - Enterprise License",
        "externalId": "12345678",
        "externalUrl": "https://app.hubspot.com/contacts/98765432/record/0-3/12345678/",
        "amount": 45000,
        "linkedinInfluenced": true,
        "abmInfluenced": true,
        "createdAt": "2025-03-15T10:30:00.000Z",
        "closedAt": "2025-06-20T14:00:00.000Z",
        "company": {
          "id": "1337",
          "name": "Pied Piper",
          "logoUrl": "https://piedpiper.com/assets/images/logo.png",
          "website": "https://piedpiper.com",
          "linkedInOrgId": "12345",
          "hubspotCompanyId": "9876543",
          "country": "United States",
          "hubspotPortalId": "98765432"
        },
        "stage": {
          "id": "1337_closed_won",
          "name": "Closed Won"
        },
        "campaigns": [
          {
            "id": "1337",
            "name": "Q1 Enterprise ABM Campaign"
          }
        ],
        "impressionsBeforeDeal": 8450,
        "impressionsAfterDeal": 3200,
        "linkedinImpressionsBeforeDeal": 5200,
        "abmImpressionsBeforeDeal": 3250,
        "linkedinImpressionsAfterDeal": 1800,
        "abmImpressionsAfterDeal": 1400,
        "clicksBeforeDeal": 142,
        "clicksAfterDeal": 58,
        "linkedinClicksBeforeDeal": 89,
        "abmClicksBeforeDeal": 53,
        "linkedinClicksAfterDeal": 34,
        "abmClicksAfterDeal": 24,
        "engagementsBeforeDeal": 312,
        "engagementsAfterDeal": 95,
        "linkedinEngagementsBeforeDeal": 198,
        "abmEngagementsBeforeDeal": 114,
        "linkedinEngagementsAfterDeal": 60,
        "abmEngagementsAfterDeal": 35,
        "costBeforeDeal": 891.45,
        "costAfterDeal": 246.03
      }
    ],
    "count": 3
  },
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 3,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-04-12T12:00:00.000Z"
  }
}

Get ABM stages for a company

||
GET/companies/{id}/abm-stages

Returns the ABM stage history for a company, showing progression through your funnel.

Request
curl "https://app.zenabm.com/api/v1/companies/{id}/abm-stages" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "context": "overall",
      "abmStage": {
        "id": "cls1abc123",
        "name": "Engaged",
        "color": "#4CAF50"
      },
      "previousStage": {
        "id": "cls2def456",
        "name": "Aware",
        "color": "#FFC107"
      },
      "campaign": null,
      "stageHistory": [
        {
          "stageId": "cls1abc123",
          "stageName": "Engaged",
          "color": "#4CAF50",
          "date": "2025-08-12T09:30:00.000Z"
        },
        {
          "stageId": "cls2def456",
          "stageName": "Aware",
          "color": "#FFC107",
          "date": "2025-04-20T14:15:00.000Z"
        }
      ],
      "latestChangeDate": "2025-08-12T09:30:00.000Z"
    },
    {
      "context": "lifetime",
      "abmStage": {
        "id": "cls1abc123",
        "name": "Engaged",
        "color": "#4CAF50"
      },
      "previousStage": null,
      "campaign": null,
      "stageHistory": [],
      "latestChangeDate": null
    },
    {
      "context": "campaign",
      "abmStage": {
        "id": "cls3ghi789",
        "name": "MQL",
        "color": "#2196F3"
      },
      "previousStage": {
        "id": "cls1abc123",
        "name": "Engaged",
        "color": "#4CAF50"
      },
      "campaign": {
        "id": "cm7abmcamp1",
        "name": "Q1 Enterprise ABM Campaign"
      },
      "stageHistory": [
        {
          "stageId": "cls3ghi789",
          "stageName": "MQL",
          "color": "#2196F3",
          "date": "2025-09-01T11:00:00.000Z"
        },
        {
          "stageId": "cls1abc123",
          "stageName": "Engaged",
          "color": "#4CAF50",
          "date": "2025-06-15T08:45:00.000Z"
        }
      ],
      "latestChangeDate": "2025-09-01T11:00:00.000Z"
    }
  ],
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Ad Sets

LinkedIn ad sets with performance metrics, company-level breakdowns, and job title insights.

||

List Ad Sets with insights

||
GET/campaigns

Returns 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.

Request
curl "https://app.zenabm.com/api/v1/campaigns?period=last30Days&status=ACTIVE,PAUSED" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "cmf8a9q2k0001of04w7v3lqz9",
      "linkedInId": "1336",
      "name": "Techcrunch 2025",
      "status": "ACTIVE",
      "format": "Single Image",
      "servingStatuses": [
        "RUNNABLE"
      ],
      "parentCampaignLinkedInId": "1337",
      "runScheduleStart": 1735689600000,
      "runScheduleEnd": 1767225600000,
      "totalBudgetAmount": "5000.00",
      "totalBudgetCurrency": "USD",
      "impressions": 128157,
      "clicks": 501,
      "engagements": 809,
      "costInUsd": 8202.59,
      "conversions": 213,
      "ctr": 0.39,
      "cpc": 16.37
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 472,
    "totalPages": 24
  },
  "meta": {
    "timestamp": "2026-03-09T19:06:51.685Z"
  }
}

Get Ad Set by ID

||
GET/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.

Request
curl "https://app.zenabm.com/api/v1/campaigns/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "1337",
    "linkedInId": "330784953",
    "name": "Techcrunch 2025",
    "status": "ACTIVE",
    "campaignId": "1337",
    "syncStartDate": "2025-01-01T00:00:00.000Z",
    "createdAt": "2025-01-01T00:00:00.000Z",
    "updatedAt": "2025-09-15T00:00:00.000Z",
    "teamId": "1337",
    "intentId": null,
    "format": "Single Image",
    "campaign": {
      "id": "1337",
      "linkedInId": "710869393",
      "name": "Techcrunch 2025",
      "status": "ACTIVE",
      "createdAt": "2025-01-01T00:00:00.000Z",
      "updatedAt": "2025-09-15T00:00:00.000Z",
      "teamId": "1337",
      "syncStartDate": "2025-01-01T00:00:00.000Z",
      "intentId": null
    },
    "intent": null
  },
  "meta": {
    "timestamp": "2026-03-09T19:09:39.624Z"
  }
}

Get Ad Set delivery and targeting settings

||
GET/campaigns/{id}/settings

Read 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.

Request
curl "https://app.zenabm.com/api/v1/campaigns/{id}/settings" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "1337",
    "linkedInId": "330784953",
    "name": "Techcrunch 2025",
    "status": "ACTIVE",
    "format": "Single Image",
    "campaignId": "1337",
    "campaign": {
      "id": "1337",
      "name": "Techcrunch 2025"
    },
    "source": "linkedin",
    "delivery": {
      "dailyBudget": 90,
      "totalBudget": null,
      "unitCost": 16,
      "currency": "USD",
      "objectiveType": "WEBSITE_VISIT",
      "costType": "CPM",
      "optimizationTarget": "MAX_CLICK",
      "pacingStrategy": "LIFETIME_EVEN_PACED",
      "audienceExpansion": false,
      "offsiteDelivery": false
    },
    "audienceSize": 84000,
    "audienceSizeUnavailableReason": null,
    "unknownSettings": [],
    "targeting": {
      "included": {
        "jobTitles": {
          "count": 12,
          "values": [
            "Head of Marketing",
            "VP Marketing"
          ],
          "truncated": false,
          "unnamed": 0
        },
        "seniorities": {
          "count": 2,
          "values": [
            "Director",
            "VP"
          ],
          "truncated": false,
          "unnamed": 0
        },
        "locations": {
          "count": 3,
          "values": [
            "European Union"
          ],
          "truncated": false,
          "unnamed": 2
        }
      },
      "excluded": {
        "jobTitles": {
          "count": 1,
          "values": [
            "Intern"
          ],
          "truncated": false,
          "unnamed": 0
        }
      }
    }
  },
  "meta": {
    "timestamp": "2026-07-26T09:12:00.000Z"
  }
}

Get LinkedIn's suggested bid for an Ad Set

||
GET/campaigns/{id}/suggested-bid

LinkedIn'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.

Request
curl "https://app.zenabm.com/api/v1/campaigns/{id}/suggested-bid" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "success": true,
    "linkedInId": "330784953",
    "adSetName": "Techcrunch 2025",
    "currency": "USD",
    "suggestedBid": {
      "default": 7.1,
      "min": 7.1,
      "max": 11.14
    },
    "bidLimits": {
      "min": 4,
      "max": 100
    },
    "dailyBudgetLimits": {
      "default": 25,
      "min": 10,
      "max": 1000000
    },
    "currentBid": 16,
    "currentDailyBudget": 90,
    "costType": "CPM",
    "optimizationTargetType": "MAX_CLICK"
  },
  "meta": {
    "timestamp": "2026-08-05T09:12:00.000Z"
  }
}

Get Ad Set metrics overview

||
GET/campaigns/{id}/overview

Performance totals for a single Ad Set over the requested date range (no weekly breakdown).

Request
curl "https://app.zenabm.com/api/v1/campaigns/{id}/overview?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "startDate": "2026-04-13",
    "endDate": "2026-05-13",
    "format": "Single Image",
    "impressions": 102666,
    "clicks": 264,
    "engagements": 1136,
    "costInUsd": 4571.02,
    "conversions": 200,
    "ctr": 0.26,
    "cpc": 17.32
  },
  "meta": {
    "timestamp": "2026-05-13T19:08:06.843Z"
  }
}

List companies for a Ad Set

||
GET/campaigns/{id}/companies

Optional filters: sortBy, sortOrder, search

Request
curl "https://app.zenabm.com/api/v1/campaigns/{id}/companies?period=last30Days&hideExcludedCompanies=false" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "Pied Piper",
      "city": "San Francisco",
      "country": "US",
      "website": "https://www.piedpiper.com/",
      "linkedInOrgId": "4827017",
      "hubspotCompanyId": "37411334702",
      "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "logoUrl": "https://piedpiper.com/assets/images/logo.png",
      "lifetimeEngagementScore": 2,
      "abmStage": {
        "id": "1337_aware",
        "name": "Aware",
        "color": "#A855F7",
        "displayOrder": 2
      },
      "lifetimeAbmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "impressions": 0,
      "clicks": 0,
      "engagements": 0,
      "costInUsd": 0,
      "clickThroughRate": 0,
      "costPerClick": 0,
      "cpm": 0,
      "intents": []
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 501,
    "totalPages": 26
  },
  "meta": {
    "timestamp": "2026-03-09T19:10:47.810Z"
  }
}

Get job title insights for a Ad Set

||
GET/campaigns/{id}/job-titles

Returns job title engagement breakdown for a specific campaign.

Request
curl "https://app.zenabm.com/api/v1/campaigns/{id}/job-titles?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "jobTitleUrn": "urn:li:title:1337",
      "jobTitleName": "CEO",
      "impressions": 12450,
      "clicks": 87,
      "engagements": 342,
      "costInUsd": 891.45,
      "averageDwellTime": 4.2,
      "videoViews": null,
      "videoStarts": null,
      "videoFirstQuartileCompletions": null,
      "videoMidpointCompletions": null,
      "videoThirdQuartileCompletions": null,
      "videoCompletions": null,
      "exclusion": null
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 2,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Ad Set monthly spend

||
GET/ad-spend

Returns 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.

Request
curl "https://app.zenabm.com/api/v1/ad-spend?period=last30Days&linkedInId=123456" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "summary": {
      "costInUsd": 18420.5,
      "impressions": 412000,
      "clicks": 1980,
      "engagements": 3640,
      "monthCount": 3,
      "adSetCount": 4,
      "startDate": "2026-03-01",
      "endDate": "2026-05-31"
    },
    "byAdSet": [
      {
        "id": "cmf8a9q2k0001of04w7v3lqz9",
        "linkedInId": "123456",
        "name": "Techcrunch 2025",
        "status": "ACTIVE",
        "format": "Single Image",
        "totals": {
          "costInUsd": 9871.25,
          "impressions": 220000,
          "clicks": 1102,
          "engagements": 1840
        },
        "monthly": [
          {
            "year": 2026,
            "month": 5,
            "period": "2026-05",
            "costInUsd": 4250.75,
            "impressions": 102000,
            "clicks": 540,
            "engagements": 810
          },
          {
            "year": 2026,
            "month": 4,
            "period": "2026-04",
            "costInUsd": 3120,
            "impressions": 68000,
            "clicks": 312,
            "engagements": 540
          },
          {
            "year": 2026,
            "month": 3,
            "period": "2026-03",
            "costInUsd": 2500.5,
            "impressions": 50000,
            "clicks": 250,
            "engagements": 490
          }
        ]
      }
    ]
  },
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 4,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-05-13T19:06:51.685Z"
  }
}

Aggregated LinkedIn metrics for a date range

||
GET/linkedin-metrics

Returns 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.

Request
curl "https://app.zenabm.com/api/v1/linkedin-metrics?period=last30Days&timeGranularity=ALL&metrics=impressions,clicks,costInUsd" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "startDate": "2026-03-31",
    "endDate": "2026-04-06",
    "costInUsd": 2450.75,
    "impressions": 45200,
    "clicks": 890,
    "engagements": 2100,
    "conversions": 34,
    "reach": 8000,
    "frequency": 5.65
  },
  "meta": {
    "timestamp": "2026-04-08T12:00:00.000Z"
  }
}

Creatives

Individual LinkedIn ad creatives with format, serving status, and parent ad set and campaign context.

||

List ad creatives

||
GET/creatives

Returns 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).

Request
curl "https://app.zenabm.com/api/v1/creatives" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "linkedInId": "415956593",
      "creativeUrn": "urn:li:sponsoredCreative:415956593",
      "name": "Techcrunch 2025 — Hero Image",
      "format": "Single Image",
      "status": "ACTIVE",
      "isServing": true,
      "adLibraryUrl": "https://www.linkedin.com/ad-library/detail/415956593",
      "adSetId": "cmf8a9q2k0001of04w7v3lqz9",
      "adSetLinkedInId": "330784953",
      "adSetName": "Techcrunch 2025",
      "campaignId": "cmf8a9q2k0002of04abcd1234",
      "campaignLinkedInId": "710869393",
      "campaignName": "Techcrunch 2025 CG"
    }
  ],
  "pagination": {
    "pageSize": 20,
    "nextCursor": "DgFNuuqsfrRuO-q0RxpSj-yaR4TXEtmKuIF4U9-t404",
    "hasMore": true
  },
  "meta": {
    "timestamp": "2026-05-14T19:06:51.685Z"
  }
}

Campaigns

Campaigns are logical groupings of LinkedIn ad sets with aggregated performance metrics.

||

List Campaigns with insights

||
GET/campaign-groups

Returns 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.

Request
curl "https://app.zenabm.com/api/v1/campaign-groups?period=last30Days&status=ACTIVE,PAUSED" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "cmf7gpqd80002lv04x9zwt8mh",
      "linkedInId": "1337",
      "name": "TechCrunch 2025",
      "status": "ACTIVE",
      "servingStatuses": [
        "RUNNABLE"
      ],
      "runScheduleStart": 1735689600000,
      "runScheduleEnd": 1767225600000,
      "totalBudgetAmount": "50000.00",
      "totalBudgetCurrency": "USD",
      "impressions": 583180,
      "clicks": 4838,
      "engagements": 30566,
      "costInUsd": 25033.73,
      "conversions": 1229,
      "ctr": 0.83,
      "cpc": 5.17
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 87,
    "totalPages": 5
  },
  "meta": {
    "timestamp": "2026-03-09T19:22:18.111Z"
  }
}

Get Campaign by ID

||
GET/campaign-groups/{id}

Returns a single Campaign with its child Ad Sets in the adSets array (id, linkedInId, name, status, human-readable format).

Request
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "1337",
    "linkedInId": "734789393",
    "name": "TechCrunch 2025",
    "status": "ACTIVE",
    "createdAt": "2025-01-01T00:00:00.000Z",
    "updatedAt": "2025-09-15T00:00:00.000Z",
    "teamId": "1337",
    "syncStartDate": "2025-01-01T00:00:00.000Z",
    "intentId": "1337",
    "intent": {
      "id": "1337",
      "name": "Competitor",
      "description": "",
      "createdAt": "2025-01-01T00:00:00.000Z",
      "updatedAt": "2025-09-15T00:00:00.000Z",
      "teamId": "1337"
    },
    "adSets": [
      {
        "id": "cmf8a9q2k0001of04w7v3lqz9",
        "linkedInId": "330784953",
        "name": "Techcrunch 2025 — Decision Makers",
        "status": "ACTIVE",
        "format": "Single Image"
      },
      {
        "id": "cmf8a9q2k0002of04abcd1234",
        "linkedInId": "330784954",
        "name": "Techcrunch 2025 — Thought Leadership",
        "status": "PAUSED",
        "format": "Thought Leader Ad"
      }
    ]
  },
  "meta": {
    "timestamp": "2026-03-09T19:26:12.572Z"
  }
}

Get Campaign metrics overview

||
GET/campaign-groups/{id}/overview

Performance totals for a single Campaign over the requested date range — aggregated to a single summary (no weekly breakdown).

Request
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}/overview?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "startDate": "2026-04-13",
    "endDate": "2026-05-13",
    "impressions": 583180,
    "clicks": 4838,
    "engagements": 30566,
    "costInUsd": 25033.73,
    "conversions": 1229,
    "ctr": 0.83,
    "cpc": 5.17
  },
  "meta": {
    "timestamp": "2026-05-13T19:27:07.553Z"
  }
}

List companies for a Campaign

||
GET/campaign-groups/{id}/companies

Optional filters: sortBy, sortOrder, search

Request
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}/companies?period=last30Days&hideExcludedCompanies=false" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "Pied Piper",
      "city": "San Francisco",
      "country": "US",
      "website": "https://www.piedpiper.com/",
      "linkedInOrgId": "4827017",
      "hubspotCompanyId": "37411334702",
      "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "logoUrl": "https://piedpiper.com/assets/images/logo.png",
      "lifetimeEngagementScore": 2,
      "impressions": 47759,
      "clicks": 273,
      "engagements": 2380,
      "costInUsd": 1580.19,
      "clickThroughRate": 0.572,
      "costPerClick": 5.79,
      "cpm": 33.09,
      "intents": [
        {
          "id": "1337",
          "name": "Competitor"
        }
      ],
      "abmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "lifetimeAbmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      }
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 4101,
    "totalPages": 206
  },
  "meta": {
    "timestamp": "2026-03-09T19:28:09.356Z"
  }
}

Get job title insights for a campaign group

||
GET/campaign-groups/{id}/job-titles

Optional filters: sortBy, sortOrder

Request
curl "https://app.zenabm.com/api/v1/campaign-groups/{id}/job-titles?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "jobTitleUrn": "urn:li:title:123",
      "jobTitleName": "VP of Marketing",
      "impressions": 12450,
      "clicks": 87,
      "engagements": 342,
      "costInUsd": 891.45,
      "averageDwellTime": 4.2,
      "videoViews": null,
      "videoStarts": null,
      "videoFirstQuartileCompletions": null,
      "videoMidpointCompletions": null,
      "videoThirdQuartileCompletions": null,
      "videoCompletions": null,
      "exclusion": null
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 2,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

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

||
GET/deals

Returns 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.

Request
curl "https://app.zenabm.com/api/v1/deals?source=all&startDate=2025-01-01&endDate=2025-12-31" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "clxyz789deal",
      "source": "hubspot",
      "dealName": "Hooli - Enterprise License",
      "externalId": "12345678",
      "externalUrl": "https://app.hubspot.com/contacts/98765432/record/0-3/12345678/",
      "company": {
        "id": "cm7abc123",
        "name": "Hooli",
        "logoUrl": "https://media.licdn.com/dms/image/hooli-logo.png",
        "website": "https://hooli.com",
        "linkedInOrgId": "12345"
      },
      "amount": 45000,
      "linkedinInfluenced": true,
      "abmInfluenced": true,
      "createdAt": "2025-03-15T10:30:00.000Z",
      "closedAt": "2025-06-20T14:00:00.000Z",
      "stage": {
        "id": "cls123stage",
        "name": "Closed Won"
      },
      "campaigns": [
        {
          "id": "cm7abm1",
          "name": "Q1 Enterprise ABM"
        }
      ],
      "impressionsBeforeDeal": 8450,
      "clicksBeforeDeal": 142,
      "engagementsBeforeDeal": 312,
      "costBeforeDeal": 891.45,
      "costAfterDeal": 246.03
    },
    {
      "id": "clxyz789opp",
      "source": "salesforce",
      "dealName": "Pied Piper - Platform Deal",
      "externalId": "0065f00000AbCdEf",
      "externalUrl": "https://mycompany.lightning.force.com/lightning/r/Opportunity/0065f00000AbCdEf/view",
      "company": {
        "id": "cm7def456",
        "name": "Pied Piper",
        "logoUrl": "https://media.licdn.com/dms/image/pp-logo.png",
        "website": "https://piedpiper.com",
        "linkedInOrgId": "67890"
      },
      "amount": 72000,
      "linkedinInfluenced": true,
      "abmInfluenced": false,
      "createdAt": "2025-04-02T09:15:00.000Z",
      "closedAt": null,
      "stage": {
        "id": "sf-stage-Negotiation",
        "name": "Negotiation"
      },
      "campaigns": [],
      "impressionsBeforeDeal": 5100,
      "clicksBeforeDeal": 74,
      "engagementsBeforeDeal": 160,
      "costBeforeDeal": 436.58,
      "costAfterDeal": 112.9
    },
    {
      "id": "clxyz789attio",
      "source": "attio",
      "dealName": "Initech - Annual Contract",
      "externalId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "externalUrl": "https://app.attio.com/initech/deals/record/a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "company": {
        "id": "cm7ghi789",
        "name": "Initech",
        "logoUrl": "https://media.licdn.com/dms/image/initech-logo.png",
        "website": "https://initech.com",
        "linkedInOrgId": "24680"
      },
      "amount": 31000,
      "linkedinInfluenced": false,
      "abmInfluenced": true,
      "createdAt": "2025-05-11T08:00:00.000Z",
      "closedAt": null,
      "stage": {
        "id": "attio-status-in-progress",
        "name": "In Progress"
      },
      "campaigns": [
        {
          "id": "cm7abm2",
          "name": "Mid-Market ABM"
        }
      ],
      "impressionsBeforeDeal": 2400,
      "clicksBeforeDeal": 38,
      "engagementsBeforeDeal": 91,
      "costBeforeDeal": 220.15,
      "costAfterDeal": 58.4
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 3,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Job Titles

Analyze which job titles are engaging with your ads. Understand your audience at the persona level.

||

List job titles with insights

||
GET/job-titles

Optional filters: Ad Sets (comma-separated IDs), Campaigns (comma-separated IDs)

Request
curl "https://app.zenabm.com/api/v1/job-titles?period=last30Days&includeWeekly=true" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "jobTitleUrn": "urn:li:title:123",
      "jobTitleName": "VP of Marketing",
      "impressions": 12450,
      "clicks": 87,
      "engagements": 342,
      "costInUsd": 891.45,
      "averageDwellTime": 4.2,
      "videoViews": null,
      "videoStarts": null,
      "videoFirstQuartileCompletions": null,
      "videoMidpointCompletions": null,
      "videoThirdQuartileCompletions": null,
      "videoCompletions": null,
      "exclusion": null,
      "weeklyData": [
        {
          "weekStart": "2026-03-03",
          "weekEnd": "2026-03-09",
          "impressions": 1820,
          "clicks": 12,
          "engagements": 47,
          "costInUsd": 132.18
        },
        {
          "weekStart": "2026-03-10",
          "weekEnd": "2026-03-16",
          "impressions": 2010,
          "clicks": 15,
          "engagements": 52,
          "costInUsd": 148.92
        }
      ]
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 1,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Get job title performance overview

||
GET/job-titles/{id}/overview

Performance 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.

Request
curl "https://app.zenabm.com/api/v1/job-titles/{id}/overview?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "jobTitleUrn": "urn:li:title:123",
    "startDate": "2026-04-13",
    "endDate": "2026-05-13",
    "impressions": 18420,
    "clicks": 96,
    "engagements": 312,
    "costInUsd": 742.18,
    "conversions": 4,
    "ctr": 0.52,
    "cpc": 7.73
  },
  "meta": {
    "timestamp": "2026-05-13T12:00:00.000Z"
  }
}

Get Ad Set insights for a job title

||
GET/job-titles/{id}/campaigns

Ad 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.

Request
curl "https://app.zenabm.com/api/v1/job-titles/{id}/campaigns?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "TechCrunch 2025",
      "format": "Single Image",
      "impressions": 12450,
      "clicks": 87,
      "engagements": 342,
      "costInUsd": 891.45,
      "ctr": 0.7,
      "cpc": 10.25,
      "averageDwellTime": 4.2,
      "videoViews": 0,
      "videoStarts": 0,
      "videoFirstQuartileCompletions": 0,
      "videoMidpointCompletions": 0,
      "videoThirdQuartileCompletions": 0,
      "videoCompletions": 0
    }
  ],
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z",
    "dateRange": {
      "granularity": "weekly",
      "weekAnchor": "sunday",
      "requestedStartDate": "2026-04-01",
      "requestedEndDate": "2026-04-15",
      "coveredStartDate": "2026-03-30",
      "coveredEndDate": "2026-04-12",
      "weeksCovered": 2
    }
  }
}

Get Campaign insights for a job title

||
GET/job-titles/{id}/campaign-groups

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.

Request
curl "https://app.zenabm.com/api/v1/job-titles/{id}/campaign-groups?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "TechCrunch 2025",
      "impressions": 12450,
      "clicks": 87,
      "engagements": 342,
      "costInUsd": 891.45,
      "ctr": 0.7,
      "cpc": 10.25,
      "averageDwellTime": 4.2,
      "videoViews": 0,
      "videoStarts": 0,
      "videoFirstQuartileCompletions": 0,
      "videoMidpointCompletions": 0,
      "videoThirdQuartileCompletions": 0,
      "videoCompletions": 0
    }
  ],
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z",
    "dateRange": {
      "granularity": "weekly",
      "weekAnchor": "sunday",
      "requestedStartDate": "2026-04-01",
      "requestedEndDate": "2026-04-15",
      "coveredStartDate": "2026-03-30",
      "coveredEndDate": "2026-04-12",
      "weeksCovered": 2
    }
  }
}

ABM Campaigns

ABM campaigns are high-level campaign groupings with funnel stage tracking and overview metrics.

||

List ABM campaigns with insights

||
GET/abm-campaigns

Optional filters: status (ACTIVE,PAUSED,COMPLETED)

Request
curl "https://app.zenabm.com/api/v1/abm-campaigns?period=last30Days&status=ACTIVE" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "cm7abm001",
      "name": "Q1 Enterprise ABM Campaign",
      "status": "ACTIVE",
      "startDate": "2025-01-15T00:00:00.000Z",
      "endDate": "2025-06-30T00:00:00.000Z",
      "description": "Targeting enterprise accounts in fintech",
      "teamId": "team123",
      "numberOfTargetAccounts": 120,
      "createdAt": "2025-01-10T08:00:00.000Z",
      "updatedAt": "2025-03-01T12:00:00.000Z",
      "numberOfAdSets": 5,
      "numberOfCampaigns": 2,
      "companiesTargeted": 85,
      "totalPipeline": 450000,
      "totalRevenue": 180000,
      "totalAdSpend": 12500,
      "pipePerSpent": 36,
      "averageAcv": 45000,
      "roas": 14.4
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 1,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Get ABM campaign by ID

||
GET/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.

Request
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "abmCampaign": {
      "id": "1337",
      "name": "Silicon Valley 2025",
      "status": "ACTIVE",
      "startDate": "2025-01-15T00:00:00.000Z",
      "endDate": "2025-06-30T00:00:00.000Z",
      "description": "Targeting enterprise accounts in fintech",
      "teamId": "team123",
      "numberOfTargetAccounts": 120,
      "createdAt": "2025-01-10T08:00:00.000Z",
      "updatedAt": "2025-03-01T12:00:00.000Z"
    },
    "linkedinCampaigns": [
      {
        "id": "1337",
        "name": "Silicon Valley 2025 CG"
      }
    ],
    "linkedinAdSets": [
      {
        "id": "1337",
        "name": "Silicon Valley 2025",
        "format": "Single Image"
      }
    ]
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Get ABM campaign performance overview

||
GET/abm-campaigns/{id}/overview

Performance 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.

Request
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/overview?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "cmoga3ilc004vju04cjrajud2",
    "name": "ABM Intent May 26",
    "startDate": "2026-04-13",
    "endDate": "2026-05-13",
    "displayCurrency": "USD",
    "metrics": {
      "impressions": 231753,
      "clicks": 555,
      "engagements": 861,
      "costInUsd": 2189.62,
      "conversions": 3,
      "ctr": 0.24,
      "cpc": 3.95
    },
    "effectiveness": {
      "companiesTargeted": 412,
      "totalPipeline": 184000,
      "totalRevenue": 52000,
      "totalAdSpend": 2189.62,
      "pipePerSpent": 84.03,
      "averageAcv": 26000,
      "roas": 23.75
    }
  },
  "meta": {
    "timestamp": "2026-05-13T12:00:00.000Z"
  }
}

Get ABM campaign stages breakdown

||
GET/abm-campaigns/{id}/stages-breakdown

Returns a breakdown of companies across each ABM funnel stage.

Request
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/stages-breakdown?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "data": [
      {
        "stageId": "1337",
        "stageName": "Aware",
        "color": "#FFC107",
        "isConfigured": true,
        "currentPeriod": 45,
        "previousPeriod": 32,
        "change": 13,
        "changePercentage": 40.6
      }
    ],
    "viewType": "unified",
    "periods": {
      "current": {
        "label": "Mar 2025",
        "dateRange": {
          "from": "2025-03-01",
          "to": "2025-03-31"
        }
      },
      "previous": {
        "label": "Feb 2025",
        "dateRange": {
          "from": "2025-02-01",
          "to": "2025-02-28"
        }
      }
    }
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

List companies for an ABM campaign

||
GET/abm-campaigns/{id}/companies

Returns 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.

Request
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"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "Pied Piper",
      "city": "Palo Alto",
      "country": "US",
      "website": "https://www.piedpiper.com/",
      "linkedInOrgId": "4827017",
      "hubspotCompanyId": "37411334702",
      "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "lifetimeEngagementScore": 3,
      "logoUrl": "https://piedpiper.com/assets/images/logo.png",
      "abmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "lifetimeAbmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "intents": [
        {
          "id": "cm9iaw4a50001jr04wqc1k4dt",
          "name": "Competitor"
        }
      ],
      "impressions": 109198,
      "clicks": 468,
      "engagements": 2769,
      "costInUsd": 2797.37,
      "currentEngagementScore": 2
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 85,
    "totalPages": 5
  },
  "meta": {
    "timestamp": "2026-03-10T12:00:00.000Z"
  }
}

List job titles for an ABM campaign

||
GET/abm-campaigns/{id}/job-titles

Returns a paginated list of job titles with engagement metrics for a specific ABM campaign. Aggregates data from all linked LinkedIn campaigns and campaign groups.

Request
curl "https://app.zenabm.com/api/v1/abm-campaigns/{id}/job-titles?period=last30Days" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "jobTitleUrn": "urn:li:title:123",
      "jobTitleName": "VP of Marketing",
      "impressions": 12450,
      "clicks": 87,
      "engagements": 342,
      "costInUsd": 891.45,
      "averageDwellTime": 4.2,
      "videoViews": null,
      "videoStarts": null,
      "videoFirstQuartileCompletions": null,
      "videoMidpointCompletions": null,
      "videoThirdQuartileCompletions": null,
      "videoCompletions": null,
      "exclusion": null
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 45,
    "totalPages": 3
  },
  "meta": {
    "timestamp": "2026-03-10T12:00:00.000Z"
  }
}

ABM Stages

ABM funnel stages — track companies entering, progressing through, and the history of each stage.

||

List ABM stages

||
GET/abm-stages

Returns 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.

Request
curl "https://app.zenabm.com/api/v1/abm-stages" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "cls1abc",
      "name": "Aware",
      "color": "#FFC107",
      "displayOrder": 1,
      "createdAt": "2025-01-05T08:00:00.000Z",
      "updatedAt": "2025-01-05T08:00:00.000Z",
      "blockOperator": "OR",
      "conditionBlocks": [
        {
          "operator": "OR",
          "conditions": [
            {
              "type": "LINKEDIN_METRICS",
              "metric": "IMPRESSIONS",
              "comparison": "GREATER_THAN_OR_EQUAL",
              "minValue": 100,
              "windowDays": 30,
              "scope": "INHERIT_CAMPAIGN"
            }
          ]
        }
      ]
    },
    {
      "id": "cls2def",
      "name": "Engaged",
      "color": "#4CAF50",
      "displayOrder": 2,
      "createdAt": "2025-01-05T08:00:00.000Z",
      "updatedAt": "2025-01-05T08:00:00.000Z",
      "blockOperator": "AND",
      "conditionBlocks": [
        {
          "operator": "AND",
          "conditions": [
            {
              "type": "CONTACT_PROPERTY",
              "propertyMapping": {
                "id": "map_contact_1",
                "hubspotPropertyName": "seniority",
                "operator": "is_known",
                "propertyObjectType": "CONTACT",
                "minMatchingContacts": 2
              }
            },
            {
              "type": "DEAL_STAGE",
              "dealStageIds": [
                "hs_stage_123"
              ],
              "matchAnyOpenDeal": false
            }
          ]
        }
      ]
    }
  ],
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Manage an ABM stage

||
POST/abm-stages/manage

Applies 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>): .

Request
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"
}'
Response
{
  "data": {
    "applied": 1,
    "total": 1,
    "stage": {
      "id": "cls2def",
      "name": "Engaged",
      "color": "#4CAF50",
      "displayOrder": 2,
      "isSystem": false,
      "blockOperator": "AND",
      "conditionBlocks": [
        {
          "operator": "AND",
          "conditions": [
            {
              "type": "LINKEDIN_METRICS",
              "metric": "CLICKS",
              "comparison": "GREATER_THAN_OR_EQUAL",
              "minValue": 3,
              "windowDays": 30,
              "scope": "ABM_CAMPAIGNS",
              "scopeIds": [
                "cm7abm001"
              ]
            },
            {
              "type": "CONTACT_PROPERTY",
              "propertyMapping": {
                "id": "map_contact_1",
                "hubspotPropertyName": "seniority",
                "operator": "is_known",
                "propertyObjectType": "CONTACT",
                "minMatchingContacts": 2
              }
            }
          ]
        }
      ]
    },
    "warnings": []
  },
  "meta": {
    "timestamp": "2026-09-01T12:00:00.000Z"
  }
}

Get ABM stage by ID

||
GET/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 a matchAnyOpenDeal condition; omitted means any tracked pipeline), matchAnyOpenDeal.
  • ATTIO_DEAL_STAGE: attioDealStatusIds, attioMatchAnyOpenDeal.
  • CUSTOM_PROPERTY (HubSpot company) / CONTACT_PROPERTY (HubSpot contact): a propertyMapping with hubspotPropertyName, operator, propertyObjectType (COMPANY | CONTACT), minMatchingContacts (contact-property match threshold), and any of expectedValue, expectedValues, numericThreshold, numericThresholdMax.
  • ATTIO_COMPANY_PROPERTY: an attioPropertyMapping with attributeSlug, attributeTitle, operator, and value fields. 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.

Request
curl "https://app.zenabm.com/api/v1/abm-stages/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "cls1abc",
    "name": "Aware",
    "color": "#FFC107",
    "displayOrder": 1,
    "createdAt": "2025-01-05T08:00:00.000Z",
    "updatedAt": "2025-01-05T08:00:00.000Z",
    "blockOperator": "OR",
    "conditionBlocks": [
      {
        "operator": "AND",
        "conditions": [
          {
            "type": "LINKEDIN_METRICS",
            "metric": "ENGAGEMENTS",
            "comparison": "GREATER_THAN_OR_EQUAL",
            "minValue": 5,
            "windowDays": 90,
            "scope": "LINKEDIN_AD_SETS",
            "scopeIds": [
              "512103383"
            ]
          },
          {
            "type": "CONTACT_PROPERTY",
            "propertyMapping": {
              "id": "map_contact_1",
              "hubspotPropertyName": "seniority",
              "operator": "is_known",
              "propertyObjectType": "CONTACT",
              "minMatchingContacts": 2
            }
          }
        ]
      },
      {
        "operator": "OR",
        "conditions": [
          {
            "type": "LIFECYCLE_STAGE",
            "lifecycleStageIds": [
              "hs_lifecycle_mql"
            ]
          },
          {
            "type": "DEAL_STAGE",
            "dealStageIds": [
              "hs_stage_123"
            ],
            "matchAnyOpenDeal": false
          },
          {
            "type": "CUSTOM_PROPERTY",
            "propertyMapping": {
              "id": "map_company_1",
              "hubspotPropertyName": "numberofemployees",
              "operator": "between",
              "propertyObjectType": "COMPANY",
              "minMatchingContacts": 1,
              "numericThreshold": 50,
              "numericThresholdMax": 500
            }
          }
        ]
      }
    ],
    "currentCompaniesCount": 45
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

List companies currently in an ABM stage

||
GET/abm-stages/{id}/companies

Returns a paginated list of companies whose current ABM stage matches the given stage ID. Supports search and sorting.

Request
curl "https://app.zenabm.com/api/v1/abm-stages/{id}/companies?hideExcludedCompanies=false" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "1337",
      "name": "Pied Piper",
      "city": "Palo Alto",
      "country": "US",
      "website": "https://www.piedpiper.com/",
      "linkedInOrgId": "4827017",
      "hubspotCompanyId": "37411334702",
      "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
      "logoUrl": "https://piedpiper.com/assets/images/logo.png",
      "lifetimeEngagementScore": 3,
      "abmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "lifetimeAbmStage": {
        "id": "1337_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      }
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 45,
    "totalPages": 3
  },
  "meta": {
    "timestamp": "2026-03-10T12:00:00.000Z"
  }
}

Get companies entering an ABM stage

||
GET/abm-stages/{id}/companies-entering

Request
curl "https://app.zenabm.com/api/v1/abm-stages/{id}/companies-entering?campaignType=current_abm_stage" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "companies": [
      {
        "id": "cm7abc123",
        "name": "Acme Corp",
        "logoUrl": "https://media.licdn.com/dms/image/acme-logo.png",
        "website": "https://acme.com",
        "hubspotCompanyId": "9876543",
        "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
        "country": "United States",
        "previousStage": {
          "id": "cls1abc",
          "name": "Aware",
          "color": "#FFC107"
        },
        "dateEntered": "2026-03-12T09:30:00.000Z"
      },
      {
        "id": "cm7xyz456",
        "name": "Globex Industries",
        "logoUrl": "https://media.licdn.com/dms/image/globex-logo.png",
        "website": "https://globex.com",
        "hubspotCompanyId": "1234567",
        "attioRecordId": null,
        "country": "Germany",
        "previousStage": null,
        "dateEntered": "2026-03-08T14:15:00.000Z"
      }
    ],
    "hubspotPortalId": "98765432",
    "attioWorkspaceSlug": "acme-gmbh",
    "totalCount": 42
  },
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 42,
    "totalPages": 3
  },
  "meta": {
    "timestamp": "2026-04-12T12:00:00.000Z"
  }
}

Get companies progressing from an ABM stage

||
GET/abm-stages/{id}/companies-progressing

Request
curl "https://app.zenabm.com/api/v1/abm-stages/{id}/companies-progressing?campaignType=current_abm_stage" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "companies": [
      {
        "id": "cm7abc123",
        "name": "Acme Corp",
        "website": "https://acme.com",
        "country": "United States",
        "linkedInOrgId": "12345",
        "logoUrl": "https://media.licdn.com/dms/image/acme-logo.png",
        "hubspotCompanyId": "9876543",
        "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
        "nextStage": {
          "id": "cls3ghi",
          "name": "MQL",
          "color": "#2196F3"
        },
        "dateLeft": "2026-03-25T11:00:00.000Z"
      }
    ],
    "hubspotPortalId": "98765432",
    "attioWorkspaceSlug": "acme-gmbh",
    "totalCount": 1
  },
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 1,
    "totalPages": 1
  },
  "meta": {
    "timestamp": "2026-04-12T12:00:00.000Z"
  }
}

Get ABM stage history

||
GET/abm-stages/{id}/history

Request
curl "https://app.zenabm.com/api/v1/abm-stages/{id}/history" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "eventDate": "2026-03-28T09:30:00.000Z",
      "company": {
        "id": "cm7abc123",
        "name": "Acme Corp"
      },
      "abmStage": {
        "id": "cls2def",
        "name": "Engaged",
        "color": "#4CAF50"
      },
      "previousStage": {
        "id": "cls1abc",
        "name": "Aware",
        "color": "#FFC107"
      }
    },
    {
      "eventDate": "2026-03-20T14:15:00.000Z",
      "company": {
        "id": "cm7xyz456",
        "name": "Globex Industries"
      },
      "abmStage": {
        "id": "cls2def",
        "name": "Engaged",
        "color": "#4CAF50"
      },
      "previousStage": null
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 92,
    "totalPages": 5
  },
  "meta": {
    "timestamp": "2026-04-12T12:00:00.000Z"
  }
}

Intents

Intent signals configured for your team — used to qualify and prioritize target accounts.

||

List intents

||
GET/intents
Request
curl "https://app.zenabm.com/api/v1/intents" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": [
    {
      "id": "int001",
      "name": "Product Demo Interest",
      "description": "",
      "companyCount": 142,
      "adSets": [
        {
          "id": "cm7lc001",
          "name": "Evergreen 2025 - Competitor Switching"
        }
      ],
      "campaigns": [
        {
          "id": "cm7lcg001",
          "name": "Fintech Enterprise Group"
        }
      ]
    }
  ],
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Get intent by ID

||
GET/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.

Request
curl "https://app.zenabm.com/api/v1/intents/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "int001",
    "name": "Product Demo Interest",
    "description": "",
    "companyCount": 142,
    "adSets": [
      {
        "id": "cm7lc001",
        "name": "Evergreen 2025 - Competitor Switching"
      }
    ],
    "campaigns": [
      {
        "id": "cm7lcg001",
        "name": "Fintech Enterprise Group"
      }
    ]
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Contacts

HubSpot contacts with source touchpoint totals, company context, ABM stage context, and related deals.

||

List contacts with source touchpoints

||
GET/contacts

Returns a paginated list of HubSpot contacts with source touchpoint totals, company context, ABM stage context, and related deals.

Request
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"
Response
{
  "data": [
    {
      "id": "cnt001",
      "hubspotContactId": "5510123",
      "firstName": "Ada",
      "lastName": "Lovelace",
      "name": "Ada Lovelace",
      "email": "ada@piedpiper.com",
      "companyId": "cmp001",
      "companyName": "Pied Piper",
      "companyLogoUrl": "https://piedpiper.com/logo.png",
      "companyHubspotId": "37411334702",
      "companyAbmStage": {
        "id": "stage_interested",
        "name": "Interested",
        "color": "#10B981",
        "displayOrder": 3
      },
      "companyLifetimeAbmStage": {
        "id": "stage_evaluating",
        "name": "Evaluating",
        "color": "#6366F1",
        "displayOrder": 4
      },
      "companyHasAnyDeal": true,
      "companyDeals": [
        {
          "id": "deal001",
          "hubspotId": "982173",
          "hubspotPortalId": 243811,
          "dealName": "Pied Piper - Enterprise",
          "hubspotCreatedAt": "2026-04-15T10:00:00.000Z",
          "hubspotClosedAt": null,
          "status": "open"
        }
      ],
      "totalClicks": 12,
      "touchpoints": [
        {
          "sourceType": "PAID_SEARCH",
          "label": "PAID_SEARCH",
          "count": 6
        },
        {
          "sourceType": "AI_REFERRALS",
          "label": "AI: ChatGPT",
          "count": 4
        }
      ],
      "touchpointEvents": [
        {
          "id": "evt001",
          "sourceType": "PAID_SEARCH",
          "label": "PAID_SEARCH",
          "detail1": "google",
          "detail2": "brand campaign",
          "eventTimestamp": "2026-04-29T12:30:00.000Z"
        }
      ],
      "lastEventAt": "2026-04-29T12:30:00.000Z"
    }
  ],
  "pagination": {
    "page": 1,
    "pageSize": 20,
    "totalCount": 42,
    "totalPages": 3
  },
  "meta": {
    "timestamp": "2026-05-04T12:00:00.000Z"
  }
}

Get contact journey

||
GET/contacts/{id}

Returns a single contact with company context, source events, related deals, and a weekly source-event timeline.

Request
curl "https://app.zenabm.com/api/v1/contacts/{id}" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "id": "cnt001",
    "hubspotContactId": "5510123",
    "hubspotPortalId": "243811",
    "firstName": "Ada",
    "lastName": "Lovelace",
    "email": "ada@piedpiper.com",
    "company": {
      "id": "cmp001",
      "name": "Pied Piper",
      "website": "https://piedpiper.com",
      "hubspotCompanyId": "37411334702",
      "logoUrl": "https://piedpiper.com/logo.png"
    },
    "sourceEvents": [
      {
        "sourceType": "AI_REFERRALS",
        "label": "AI: ChatGPT",
        "detail1": "chatgpt.com",
        "detail2": "/pricing",
        "eventTimestamp": "2026-04-30T15:12:00.000Z"
      },
      {
        "sourceType": "PAID_SEARCH",
        "label": "PAID_SEARCH",
        "detail1": "google",
        "detail2": "brand campaign",
        "eventTimestamp": "2026-04-29T12:30:00.000Z"
      }
    ],
    "deals": [
      {
        "id": "deal001",
        "hubspotId": "982173",
        "hubspotPortalId": 243811,
        "dealName": "Pied Piper - Enterprise",
        "amount": 25000,
        "hubspotCreatedAt": "2026-04-15T10:00:00.000Z",
        "hubspotClosedAt": null,
        "stageName": "Proposal",
        "isWon": false,
        "isLost": false
      }
    ],
    "weeklyTimeline": [
      {
        "weekStart": "2026-04-27",
        "clicks": 8
      },
      {
        "weekStart": "2026-05-04",
        "clicks": 4
      }
    ],
    "totalClicks": 12
  },
  "meta": {
    "timestamp": "2026-05-04T12:00:00.000Z"
  }
}

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

||
GET/sources

Returns aggregated contact source events grouped by source type. Each row reports total clicks, distinct contacts, and distinct companies. Filter by an optional date range.

Request
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"
Response
{
  "data": [
    {
      "key": "PAID_SEARCH",
      "sourceType": "PAID_SEARCH",
      "label": "PAID_SEARCH",
      "clicks": 1240,
      "contacts": 87,
      "companies": 54
    },
    {
      "key": "AI_REFERRALS:AI: ChatGPT",
      "sourceType": "AI_REFERRALS",
      "label": "AI: ChatGPT",
      "clicks": 612,
      "contacts": 45,
      "companies": 38
    }
  ],
  "meta": {
    "timestamp": "2026-05-04T12:00:00.000Z"
  }
}

Get source detail by type

||
GET/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.

Request
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"
Response
{
  "data": {
    "contacts": [
      {
        "contactId": "cnt001",
        "hubspotContactId": "5510123",
        "name": "Ada Lovelace",
        "email": "ada@piedpiper.com",
        "companyName": "Pied Piper",
        "companyId": "cmp001",
        "clicks": 12,
        "lastEvent": "2026-05-03T19:11:24.000Z"
      }
    ],
    "companies": [
      {
        "companyId": "cmp001",
        "name": "Pied Piper",
        "website": "https://piedpiper.com",
        "clicks": 41,
        "contacts": 7
      }
    ],
    "timeline": [
      {
        "weekStart": "2026-04-27",
        "clicks": 18
      },
      {
        "weekStart": "2026-05-04",
        "clicks": 23
      }
    ],
    "totalClicks": 41,
    "totalContacts": 7,
    "totalCompanies": 1
  },
  "meta": {
    "timestamp": "2026-05-04T12:00:00.000Z"
  }
}

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

||
GET/ad-library/by-advertiser

Profile 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).

Request
curl "https://app.zenabm.com/api/v1/ad-library/by-advertiser?limit=25" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "ads": [
      {
        "adId": "1443175013",
        "adUrl": "https://www.linkedin.com/ad-library/detail/1443175013",
        "isRestricted": false,
        "type": "SPONSORED_VIDEO",
        "advertiser": {
          "name": "Userpilot",
          "url": "https://www.linkedin.com/company/27027108",
          "companyId": "27027108",
          "payer": "Userpilot Inc"
        },
        "statistics": {
          "firstImpressionAt": 1781795275387,
          "latestImpressionAt": 1783846658226,
          "totalImpressions": {
            "from": 0,
            "to": 1000
          },
          "impressionsByCountry": [
            {
              "country": "DE",
              "percentage": 4.45
            }
          ]
        },
        "targeting": [
          {
            "facet": "Location",
            "isIncluded": true,
            "isExcluded": false,
            "includedSegments": [
              "Germany"
            ],
            "excludedSegments": []
          }
        ]
      }
    ],
    "advertisers": [
      {
        "name": "Userpilot",
        "url": "https://www.linkedin.com/company/27027108",
        "companyId": "27027108",
        "adCount": 24
      }
    ],
    "total": 1617,
    "scanned": 25,
    "returned": 1,
    "truncated": true
  },
  "meta": {
    "timestamp": "2026-07-12T12:00:00.000Z"
  }
}

Search the LinkedIn Ad Library by keyword

||
GET/ad-library/by-keyword

Discover 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).

Request
curl "https://app.zenabm.com/api/v1/ad-library/by-keyword?limit=25" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "ads": [
      {
        "adId": "1442648153",
        "adUrl": "https://www.linkedin.com/ad-library/detail/1442648153",
        "isRestricted": false,
        "type": "SPONSORED_STATUS_UPDATE",
        "advertiser": {
          "name": "Personio",
          "url": "https://www.linkedin.com/company/10180448",
          "companyId": "10180448",
          "payer": "Personio SE & Co. KG"
        },
        "statistics": null,
        "targeting": []
      }
    ],
    "advertisers": [
      {
        "name": "Personio",
        "url": "https://www.linkedin.com/company/10180448",
        "companyId": "10180448",
        "adCount": 12
      }
    ],
    "total": 410199,
    "scanned": 25,
    "returned": 1,
    "truncated": true
  },
  "meta": {
    "timestamp": "2026-07-12T12:00:00.000Z"
  }
}

Dashboard

Dashboard-level aggregate metrics — top companies, ad spend, and overall performance at a glance.

||

Get dashboard overview

||
GET/dashboard

Returns a high-level overview with top companies, total metrics, and ad spend for the given date range.

Request
curl "https://app.zenabm.com/api/v1/dashboard" \
  -H "Authorization: Bearer sk_live_xxx"
Response
{
  "data": {
    "topEngagedCompanies": [
      {
        "id": "1337",
        "name": "Pied Piper",
        "city": "San Francisco",
        "country": "United States",
        "website": "https://piedpiper.com",
        "logoUrl": "https://piedpiper.com/assets/images/logo.png",
        "linkedInOrgId": "12345",
        "hubspotCompanyId": "9876543",
        "salesforceId": "0015f00000AbCdEfGh",
        "attioRecordId": "a1b2c3d4-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
        "impressions": 24500,
        "clicks": 312,
        "engagements": 890,
        "costInUsd": 3450.75,
        "lifetimeEngagementScore": 87,
        "lifetimeAbmStage": null,
        "abmStage": {
          "id": "cls2def",
          "name": "Engaged",
          "color": "#4CAF50",
          "displayOrder": 2
        },
        "intents": [
          {
            "id": "int001",
            "name": "Product Demo Interest"
          }
        ],
        "abmCampaigns": [
          {
            "id": "cm7abm001",
            "name": "Q1 Enterprise ABM"
          }
        ]
      }
    ],
    "linkedInMetrics": {
      "current": {
        "impressions": 145000,
        "clicks": 2100,
        "engagements": 5800,
        "costInUsd": 28500
      },
      "previous": {
        "impressions": 120000,
        "clicks": 1800,
        "engagements": 4900,
        "costInUsd": 24000
      }
    }
  },
  "meta": {
    "timestamp": "2026-03-09T12:00:00.000Z"
  }
}

Need help?

Our team can help with integration, debugging, or custom endpoint requests.

Contact support
Rate limits
{
  "rateLimit": {
    "requests": "100/min",
    "headers": {
      "X-RateLimit-Limit": 100,
      "X-RateLimit-Remaining": 97
    }
  }
}
API Reference — ZenABM Docs