Acquisition

Get Paid Media Overview

GET
/v1/acquisition/paid-media

Paid media overview (Meta Ads and Google Ads): investment, impressions, reach, clicks, leads and cost per lead, with a daily series.

Use it to follow paid media performance. Each card carries value and changePct, the change against the previous period of the same length. daily has one point per day of the period, with no gaps, and the cards are the sum of daily.

  • leads adds the CRM leads (HubSpot, Kommo, CRM V4) attributed to a paid channel by UTM and the leads recorded by Meta Ads and Google Ads that the organization's funnel counts on its Interest stage. A lead that comes from a Meta form and also reaches the CRM with a paid UTM is counted in both sources, as in the funnel. leadsBySource splits the total by source.
  • cpl = total investment ÷ total leads, never an average of daily CPLs.
  • hasLeadSource: false means the organization has no lead source at all: leads, leadsBySource and cpl are null (not measured).
  • reach is Meta Ads only and is an approximation, summed per day and campaign.

Authorization

ClientIdAuthClientSecretAuth
headerx-client-id<token>

Client ID

headerx-client-secret<token>

Client secret

Query Parameters

organizationId*string

Organization identifier (required). A missing or non-string value is a 400.

period?stringDeprecated

Deprecated: use startDate and endDate, which take precedence when sent. Relative period of N days ending today, inclusive (7d = today and the 6 days before it). "Today" is the UTC calendar day, and that last day is still partial. Accepted values: 7d, 30d, 90d, 1y. Omitted or empty means 30d; any other value returns 400.

Default"30d"
Value in"7d""30d""90d""1y"
startDate?string

Start of the period (YYYY-MM-DD, inclusive). Send it together with endDate: sending only one of them returns 400. Takes precedence over period. Send the date only: a date with a time or a date that does not exist returns 400. Rules: startDate ≤ endDate, neither date in the future (UTC), and at most 365 days between the dates (up to 366 days in the period). The comparison uses the period of the same length right before it.

Formatdate
endDate?string

End of the period (YYYY-MM-DD, inclusive). See startDate for the rules. When the end date is today, that last day is still partial, because the day's data keeps arriving.

Formatdate

Response Body

Paid media overview returned successfully

application/json
  1. response

Paid media overview: Meta Ads + Google Ads cards with the change against the previous period, and the daily series behind them.

investment*

A metric value plus its relative change against the previous period. changePct is null when it cannot be calculated (either side null, or a previous value of 0). In that case, do not display the change.

impressions*

A metric value plus its relative change against the previous period. changePct is null when it cannot be calculated (either side null, or a previous value of 0). In that case, do not display the change.

reach*

People reached on Meta Ads (Google Ads reports no reach). It is an approximation: Meta reports unique people per campaign and per day, and this value adds those numbers up, so someone reached on several days or by several campaigns counts more than once. value is null when the organization has no Meta Ads data or reach could not be read; 0 when Meta is measured and reached nobody.

clicks*

A metric value plus its relative change against the previous period. changePct is null when it cannot be calculated (either side null, or a previous value of 0). In that case, do not display the change.

leads*

A metric value plus its relative change against the previous period. changePct is null when it cannot be calculated (either side null, or a previous value of 0). In that case, do not display the change.

leadsBySource*|

The window's leads.value split by source. No change against the previous window. Null exactly when hasLeadSource is false.

cpl*

A metric value plus its relative change against the previous period. changePct is null when it cannot be calculated (either side null, or a previous value of 0). In that case, do not display the change.

hasLeadSource*boolean

Whether the organization has ANY lead source, regardless of the window: a CRM lead ever credited to a paid channel, OR a platform lead (Meta event / Google lead category) ever recorded under the funnel's Interest configuration. False = neither: leads and CPL are not measured (null), not zero.

daily*array<>

One point per calendar day of the window, oldest first, no gaps.

curl -X GET "https://example.com/v1/acquisition/paid-media?organizationId=c0ad4763-173e-4a05-9cff-5208c8ea5f6a&period=30d&startDate=2026-03-11&endDate=2026-03-22"

{  "investment": {    "value": 11300,    "changePct": 8.4  },  "impressions": {    "value": 1250000,    "changePct": 3.1  },  "reach": {    "value": 123200,    "changePct": 4.2  },  "clicks": {    "value": 18400,    "changePct": -1.2  },  "leads": {    "value": 412,    "changePct": 12.6  },  "leadsBySource": {    "crm": 300,    "meta": 100,    "google": 12  },  "cpl": {    "value": 27.43,    "changePct": -3.73  },  "hasLeadSource": true,  "daily": [    {      "date": "2026-09-01",      "investment": 3800,      "impressions": 420000,      "reach": 61000,      "clicks": 6100,      "leads": 140,      "leadsBySource": {        "crm": 100,        "meta": 35,        "google": 5      },      "cpl": 27.14    },    {      "date": "2026-09-02",      "investment": 0,      "impressions": 0,      "reach": 0,      "clicks": 0,      "leads": 0,      "leadsBySource": {        "crm": 0,        "meta": 0,        "google": 0      },      "cpl": null    },    {      "date": "2026-09-03",      "investment": 7500,      "impressions": 830000,      "reach": 62200,      "clicks": 12300,      "leads": 272,      "leadsBySource": {        "crm": 200,        "meta": 65,        "google": 7      },      "cpl": 27.57    }  ]}