Keyword performance report
One row per keyword per day, device type and network: impressions, clicks, spend, revenue and conversions.
dateFrom and dateTo filter by time_period (inclusive days, YYYY-MM-DD).
Rows are sorted by time_period, keyword_id, device_type, network, integration_id, inserted_at and paginated with page/limit; meta.hasNextPage says whether another page exists.
Responses are cached for 30 minutes.
ClientIdAuthClientSecretAuthx-client-id<token>Client ID
x-client-secret<token>Client secret
organizationId*stringOrganization that owns the connected accounts.
uuidintegrationId?stringOne connected account of this integration (integration_id of the rows). Omit it to read every account of the organization.
length <= 255dateFrom?stringFirst day (inclusive) of time_period, YYYY-MM-DD.
datedateTo?stringLast day (inclusive) of time_period, YYYY-MM-DD. Must not be before dateFrom.
datepage?integerPage number, starting at 1.
1 <= value <= 10000001limit?integerRows per page (max 5000).
1 <= value <= 5000500One page of rows
application/json- response
data*array<>meta*curl -X GET "https://example.com/v1/microsoft-ads/keyword-performance-report?organizationId=3f2b8c1e-5d4a-4e6f-9a7b-1c2d3e4f5a6b&dateFrom=2026-10-01&dateTo=2026-10-31"{ "data": [ { "organization_id": "3f2b8c1e-5d4a-4e6f-9a7b-1c2d3e4f5a6b", "integration_id": "9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d", "user_id": "123456", "document_id": "123456", "integration_name": "example", "time_period": "2026-10-01", "account_id": "123456", "campaign_id": "123456", "ad_group_id": "123456", "keyword_id": "123456", "keyword": "example", "keyword_status": "example", "bid_match_type": "example", "delivered_match_type": "example", "device_type": "example", "network": "example", "impressions": "1250", "clicks": "1250", "spend": "125.50", "revenue": "125.50", "conversions": "125.50", "inserted_at": "2026-10-01T12:00:00.000Z" } ], "meta": { "page": 1, "limit": 500, "hasNextPage": false, "hasPreviousPage": false }}