{ "openapi": "3.0.3", "info": { "title": "Pulsar API", "description": "Channel99 Bulk Data Transfer REST API", "version": "1.0.0" }, "servers": [ { "url": "/" } ], "tags": [ { "name": "Auth", "description": "Token issuance \u2014 `POST /auth/token`" }, { "name": "Health", "description": "Service health check" }, { "name": "Impressions", "description": "Ad impression events \u2014 `GET /events/impressions`" }, { "name": "Intents", "description": "Buyer intent signal events \u2014 `GET /events/intents`" }, { "name": "Pageviews", "description": "Website pageview events \u2014 `GET /events/pageviews`" }, { "name": "Visits", "description": "Website visit events \u2014 `GET /events/visits`" }, { "name": "Ad Accounts", "description": "Ad account dimension records \u2014 `GET /dimensions/ad-accounts`" }, { "name": "Ad Campaign Groups", "description": "Ad campaign group dimension records \u2014 `GET /dimensions/ad-campaign-groups`" }, { "name": "Ad Campaigns", "description": "Ad campaign dimension records \u2014 `GET /dimensions/ad-campaigns`" }, { "name": "Ad Groups", "description": "Ad group dimension records \u2014 `GET /dimensions/ad-groups`" }, { "name": "Ad Units", "description": "Ad unit dimension records \u2014 `GET /dimensions/ad-units`" }, { "name": "Ads", "description": "Ad dimension records \u2014 `GET /dimensions/ads`" }, { "name": "Audiences", "description": "Audience dimension records \u2014 `GET /dimensions/audiences`" }, { "name": "Channels", "description": "Channel dimension records \u2014 `GET /dimensions/channels`" }, { "name": "Companies", "description": "Company dimension records \u2014 `GET /dimensions/companies`" }, { "name": "Vendors", "description": "Vendor dimension records \u2014 `GET /dimensions/vendors`" }, { "name": "IP Lookup", "description": "Company information lookup by IP address \u2014 `GET /ip/{ipAddress}`" } ], "paths": { "/auth/token": { "post": { "tags": [ "Auth" ], "summary": "Issue access token", "description": "Exchange an M2M client ID and secret for a bearer access token. This endpoint does not require authentication.", "operationId": "postAuthToken", "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": [ "client_id", "client_secret" ], "properties": { "client_id": { "type": "string", "description": "The M2M client identifier", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, "client_secret": { "type": "string", "description": "The M2M client secret", "example": "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022" } } } } } }, "responses": { "200": { "description": "Access token issued successfully", "content": { "application/json": { "schema": { "type": "object", "required": [ "access_token", "token_type", "expires_in" ], "properties": { "access_token": { "type": "string", "description": "Bearer token to use in subsequent requests" }, "token_type": { "type": "string", "enum": [ "bearer" ] }, "expires_in": { "type": "integer", "description": "Token lifetime in seconds", "example": 3600 } } } } } }, "400": { "$ref": "#/components/responses/BadRequest" }, "401": { "$ref": "#/components/responses/Unauthorized" }, "429": { "$ref": "#/components/responses/TooManyRequests" } } } }, "/health": { "get": { "tags": [ "Health" ], "summary": "Health check", "operationId": "getHealth", "responses": { "200": { "description": "Service is healthy", "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "type": "string", "example": "ok" } } } } } }, "404": { "$ref": "#/components/responses/NotFound" } } } }, "/events/impressions": { "get": { "tags": [ "Impressions" ], "summary": "List impressions", "operationId": "getImpressions", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/cursor" }, { "$ref": "#/components/parameters/listLimit" }, { "$ref": "#/components/parameters/filterImpressions" }, { "$ref": "#/components/parameters/sortImpressions" } ], "responses": { "200": { "description": "A page of impression records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedImpressions" } } } }, "400": { "description": "Bad request \u2013 missing instance, invalid cursor, invalid filter, invalid sort, or invalid limit", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/events/intents": { "get": { "tags": [ "Intents" ], "summary": "List intents", "operationId": "getIntents", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/cursor" }, { "$ref": "#/components/parameters/listLimit" }, { "$ref": "#/components/parameters/filterIntents" }, { "$ref": "#/components/parameters/sortIntents" } ], "responses": { "200": { "description": "A page of intent records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedIntents" } } } }, "400": { "description": "Bad request \u2013 missing instance, invalid cursor, invalid filter, invalid sort, or invalid limit", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/events/pageviews": { "get": { "tags": [ "Pageviews" ], "summary": "List pageviews", "operationId": "getPageviews", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/cursor" }, { "$ref": "#/components/parameters/listLimit" }, { "$ref": "#/components/parameters/filterPageviews" }, { "$ref": "#/components/parameters/sortPageviews" } ], "responses": { "200": { "description": "A page of pageview records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedPageviews" } } } }, "400": { "description": "Bad request \u2013 missing instance, invalid cursor, invalid filter, invalid sort, or invalid limit", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/events/visits": { "get": { "tags": [ "Visits" ], "summary": "List visits", "operationId": "getVisits", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/cursor" }, { "$ref": "#/components/parameters/listLimit" }, { "$ref": "#/components/parameters/filterVisits" }, { "$ref": "#/components/parameters/sortVisits" } ], "responses": { "200": { "description": "A page of visit records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PaginatedVisits" } } } }, "400": { "description": "Bad request \u2013 missing instance, invalid cursor, invalid filter, invalid sort, or invalid limit", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/ad-accounts": { "get": { "tags": [ "Ad Accounts" ], "summary": "List ad accounts", "operationId": "getAdAccounts", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAdAccounts" } ], "responses": { "200": { "description": "All ad account records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdAccountList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/ad-campaign-groups": { "get": { "tags": [ "Ad Campaign Groups" ], "summary": "List ad campaign groups", "operationId": "getAdCampaignGroups", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAdCampaignGroups" } ], "responses": { "200": { "description": "All ad campaign group records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdCampaignGroupList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/ad-campaigns": { "get": { "tags": [ "Ad Campaigns" ], "summary": "List ad campaigns", "operationId": "getAdCampaigns", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAdCampaigns" } ], "responses": { "200": { "description": "All ad campaign records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdCampaignList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/ad-groups": { "get": { "tags": [ "Ad Groups" ], "summary": "List ad groups", "operationId": "getAdGroups", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAdGroups" } ], "responses": { "200": { "description": "All ad group records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdGroupList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/ad-units": { "get": { "tags": [ "Ad Units" ], "summary": "List ad units", "operationId": "getAdUnits", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAdUnits" } ], "responses": { "200": { "description": "All ad unit records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdUnitList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/ads": { "get": { "tags": [ "Ads" ], "summary": "List ads", "operationId": "getAds", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAds" } ], "responses": { "200": { "description": "All ad records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AdList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/audiences": { "get": { "tags": [ "Audiences" ], "summary": "List audiences", "operationId": "getAudiences", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterAudiences" } ], "responses": { "200": { "description": "All audience records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/AudienceList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/channels": { "get": { "tags": [ "Channels" ], "summary": "List channels", "operationId": "getChannels", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterChannels" } ], "responses": { "200": { "description": "All channel records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChannelList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/companies": { "get": { "tags": [ "Companies" ], "summary": "List companies", "operationId": "getCompanies", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterCompanies" } ], "responses": { "200": { "description": "All company records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CompanyList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/ip/{ipAddress}": { "get": { "tags": [ "IP Lookup" ], "summary": "Get company by IP address", "operationId": "getCompanyByIp", "description": "Returns company information associated with the supplied IP address.\n\nCompany fields may be null when the IP address is known but a company relationship could\nnot be determined. A `404` is returned only when no record exists for the IP address. When a `404`\nis returned, our backend systems will automatically begin resolving the IP so that it becomes\navailable soon.\n\nRequires the `ip:read` scope on the Bearer token. A `403` is returned if the scope is absent.\n\n**Rate limiting:** This route has an elevated WAF per-client rate limit of 1,000 req/s\n(vs. 60 req/s for all other routes) and is exempt from the app-level data burst limit.\nA `429` is returned with a `Retry-After` header if a limit is exceeded.", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "name": "ipAddress", "in": "path", "required": true, "schema": { "type": "string" }, "description": "IPv4 or IPv6 address to look up", "example": "203.0.113.42" } ], "responses": { "200": { "description": "Company record for the given IP address. Company fields may be null when the IP address is known but a company relationship could not be determined.", "content": { "application/json": { "schema": { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/IpCompanyRecord" } }, "required": [ "data" ] } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token, client mismatch, or missing `ip:read` scope", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } }, "/dimensions/vendors": { "get": { "tags": [ "Vendors" ], "summary": "List vendors", "operationId": "getVendors", "security": [ { "bearerAuth": [], "clientId": [] } ], "parameters": [ { "name": "x-client-id", "in": "header", "required": true, "schema": { "type": "string" }, "description": "Client identifier matching the authenticated token", "example": "m2m-client-00000000-0000-0000-0000-000000000000" }, { "$ref": "#/components/parameters/filterVendors" } ], "responses": { "200": { "description": "All vendor records", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VendorList" } } } }, "400": { "description": "Bad request \u2013 missing instance or invalid filter", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "401": { "description": "Unauthorized \u2013 missing or malformed credentials", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "403": { "description": "Forbidden \u2013 invalid token or client mismatch", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "404": { "$ref": "#/components/responses/NotFound" }, "429": { "$ref": "#/components/responses/TooManyRequests" }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } } } }, "components": { "parameters": { "filterAdUnits": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[ad_unit_id][eq]=unt_abc123`\n- `filter[ad_unit_name][in]=Leaderboard,Rectangle`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterAds": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[ad_id][eq]=ad_abc123`\n- `filter[ad_name][in]=Banner A,Video B`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterAdGroups": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[ad_group_id][eq]=grp_abc123`\n- `filter[ad_group_name][in]=Retargeting,Prospecting`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterAdCampaignGroups": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[ad_campaign_group_id][eq]=grp_abc123`\n- `filter[ad_campaign_group_name][in]=Brand,Performance`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterAdCampaigns": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[ad_campaign_id][eq]=cmp_abc123`\n- `filter[ad_campaign_name][in]=Brand Awareness,Retargeting`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterAdAccounts": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[ad_account_id][eq]=acc_abc123`\n- `filter[ad_account_name][in]=Brand,Prospecting`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterAudiences": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[audience_id][eq]=aud_abc123`\n- `filter[audience_name][in]=Retargeting,Prospecting`\n- `filter[is_deleted][eq]=false`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterCompanies": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[company_id][eq]=cmp_abc123`\n- `filter[company_name][in]=Acme,Globex`\n- `filter[sector_id][eq]=sec_123`\n- `filter[region_id][eq]=reg_456`\n- `filter[revenue_range_id][eq]=rev_789`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterVendors": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[vendor_id][eq]=vnd_abc123`\n- `filter[vendor_name][in]=Google,LinkedIn`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterChannels": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[channel_id][eq]=ch_abc123`\n- `filter[channel_name][in]=Display,Paid Search`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterIntents": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[event_date][gte]=2024-01-01`\n- `filter[company_id][eq]=abc123`\n- `filter[intent_type][eq]=category`\n- `filter[signal_type][isNull]=true`\n- `filter[channel_id][in]=ch1,ch2`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterImpressions": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[event_date][gte]=2024-01-01`\n- `filter[company_id][eq]=abc123`\n- `filter[has_click][eq]=true`\n- `filter[ad_campaign_id][isNull]=true`\n- `filter[tag_id][in]=foo,bar`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterPageviews": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[event_date][gte]=2024-01-01&filter[event_date][lte]=2024-12-31`\n- `filter[tag_id][in]=foo,bar`\n- `filter[current_page][eq]=/products`\n- `filter[channel_id][isNull]=true`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "filterVisits": { "name": "filter", "in": "query", "required": false, "description": "Filter results by field values using the syntax `filter[][]=`.\n\nOperators by field type:\n- **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull`\n- **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull`\n- **boolean**: `eq`, `ne`, `isNull`, `isNotNull`\n- **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull`\n\nFor `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`.\nFor `isNull` and `isNotNull`, the value is ignored.\n\nMultiple filters are combined with AND.\n\nExamples:\n- `filter[event_date][gte]=2024-01-01`\n- `filter[channel_id][isNull]=true`\n- `filter[c99_user_cookie_id][eq]=usr_abc123`\n- `filter[ad_campaign_id][in]=camp1,camp2`", "style": "deepObject", "explode": true, "schema": { "type": "object" } }, "sortImpressions": { "name": "sort", "in": "query", "required": false, "description": "Sort results by a single field using the syntax `sort[]=asc|desc`.\n\nSortable fields: `event_date`.\n\nExamples:\n- `sort[event_date]=desc`", "style": "form", "explode": true }, "sortPageviews": { "name": "sort", "in": "query", "required": false, "description": "Sort results by a single field using the syntax `sort[]=asc|desc`.\n\nSortable fields: `event_date`.\n\nExamples:\n- `sort[event_date]=desc`", "style": "form", "explode": true }, "sortIntents": { "name": "sort", "in": "query", "required": false, "description": "Sort results by a single field using the syntax `sort[]=asc|desc`.\n\nSortable fields: `event_date`, `count_impressions`.\n\nExamples:\n- `sort[event_date]=desc`\n- `sort[count_impressions]=desc`", "style": "form", "explode": true }, "sortVisits": { "name": "sort", "in": "query", "required": false, "description": "Sort results by a single field using the syntax `sort[]=asc|desc`.\n\nSortable fields: `event_date`.\n\nExamples:\n- `sort[event_date]=desc`", "style": "form", "explode": true }, "cursor": { "name": "cursor", "in": "query", "required": false, "description": "Opaque pagination token from the previous response\u2019s `nextCursor`. Omit on the first page.\n\nPage size is controlled by the `limit` query parameter (default 200, maximum 1000).", "schema": { "type": "string" } }, "listLimit": { "name": "limit", "in": "query", "required": false, "description": "Maximum number of records to return in this page.\nOmit to use the default (200); the maximum allowed value is 1000.\nValues above the maximum return HTTP 400 with code `err:pulsar.request.invalid-limit`.", "schema": { "type": "integer", "minimum": 1, "maximum": 1000 } } }, "responses": { "BadRequest": { "description": "Bad request \u2013 missing client_id or client_secret (code `err:pulsar.auth.missing-credentials`)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "Unauthorized": { "description": "Unauthorized \u2013 invalid client_id or client_secret (code `err:pulsar.auth.invalid-credentials`)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "NotFound": { "description": "Not found \u2013 no matching route or resource (code `err:pulsar.core.not-found`)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "TooManyRequests": { "description": "Rate limit exceeded \u2013 too many requests from this client.\n\nLimits:\n- `POST /auth/token`: 20 req/min per `client_id` (app), plus WAF per-IP limit\n- `/events/*` and `/dimensions/*`: burst limit of 100 req / 10s per client (app)\n- All authenticated routes: WAF 60 req/s per `x-client-id` (5-minute window)\n- `/ip/*` routes: WAF elevated tier (app burst limit does not apply)\n\nApp-level limits can be disabled via `PULSAR_APP_RATE_LIMITS=0|false|off` (WAF still applies).", "headers": { "Retry-After": { "description": "Number of seconds to wait before retrying", "schema": { "type": "integer", "example": 60 } } }, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } }, "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer", "bearerFormat": "JWT", "description": "M2M Bearer token issued by Stytch. Pass as `Authorization: Bearer `.\n\nExample: `Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...`" }, "clientId": { "type": "apiKey", "in": "header", "name": "x-client-id", "description": "Client identifier that must match the `client_id` claim in the Bearer token.\n\nExample: `x-client-id: m2m-client-00000000-0000-0000-0000-000000000000`" } }, "schemas": { "PaginatedIntents": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Intent" } }, "nextCursor": { "type": "string", "nullable": true, "description": "Pass as the `cursor` query parameter to fetch the next page, or null when there are no more results." } }, "required": [ "data", "nextCursor" ] }, "PaginatedImpressions": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Impression" } }, "nextCursor": { "type": "string", "nullable": true, "description": "Pass as the `cursor` query parameter to fetch the next page, or null when there are no more results." } }, "required": [ "data", "nextCursor" ] }, "PaginatedPageviews": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Pageview" } }, "nextCursor": { "type": "string", "nullable": true, "description": "Pass as the `cursor` query parameter to fetch the next page, or null when there are no more results." } }, "required": [ "data", "nextCursor" ] }, "PaginatedVisits": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Visit" } }, "nextCursor": { "type": "string", "nullable": true, "description": "Pass as the `cursor` query parameter to fetch the next page, or null when there are no more results." } }, "required": [ "data", "nextCursor" ] }, "Intent": { "type": "object", "properties": { "intent_event_id": { "type": "string" }, "event_date": { "type": "string", "format": "date-time" }, "channel_id": { "type": "string", "nullable": true }, "vendor_id": { "type": "string", "nullable": true }, "company_id": { "type": "string" }, "audience_id_list": { "type": "array", "items": { "type": "string" }, "nullable": true }, "intent_id": { "type": "string" }, "intent_type": { "type": "string", "nullable": true }, "intent_name": { "type": "string", "nullable": true }, "signal_type": { "type": "string", "nullable": true }, "count_impressions": { "type": "integer" } } }, "Impression": { "type": "object", "properties": { "imp_event_id": { "type": "string" }, "event_date": { "type": "string", "format": "date-time" }, "channel_id": { "type": "string", "nullable": true }, "vendor_id": { "type": "string", "nullable": true }, "tag_id": { "type": "string" }, "company_id": { "type": "string" }, "audience_id_list": { "type": "array", "items": { "type": "string" }, "nullable": true }, "ad_account_id": { "type": "string", "nullable": true }, "ad_campaign_group_id": { "type": "string", "nullable": true }, "ad_campaign_id": { "type": "string", "nullable": true }, "ad_group_id": { "type": "string", "nullable": true }, "ad_id": { "type": "string", "nullable": true }, "ad_detail_id": { "type": "string", "nullable": true }, "ad_site": { "type": "string", "nullable": true }, "ad_unit_id": { "type": "string", "nullable": true }, "has_click": { "type": "boolean" } } }, "Pageview": { "type": "object", "properties": { "pv_event_id": { "type": "string" }, "visit_event_id": { "type": "string", "nullable": true }, "event_date": { "type": "string", "format": "date-time" }, "channel_id": { "type": "string", "nullable": true }, "vendor_id": { "type": "string", "nullable": true }, "tag_id": { "type": "string" }, "company_id": { "type": "string" }, "audience_id_list": { "type": "array", "items": { "type": "string" }, "nullable": true }, "ad_account_id": { "type": "string", "nullable": true }, "ad_campaign_group_id": { "type": "string", "nullable": true }, "ad_campaign_id": { "type": "string", "nullable": true }, "ad_group_id": { "type": "string", "nullable": true }, "ad_id": { "type": "string", "nullable": true }, "ad_detail_id": { "type": "string", "nullable": true }, "current_page": { "type": "string" }, "c99_user_cookie_id": { "type": "string" } } }, "Visit": { "type": "object", "properties": { "visit_event_id": { "type": "string" }, "event_date": { "type": "string", "format": "date-time" }, "channel_id": { "type": "string", "nullable": true }, "vendor_id": { "type": "string", "nullable": true }, "tag_id": { "type": "string" }, "company_id": { "type": "string" }, "audience_id_list": { "type": "array", "items": { "type": "string" }, "nullable": true }, "ad_account_id": { "type": "string", "nullable": true }, "ad_campaign_group_id": { "type": "string", "nullable": true }, "ad_campaign_id": { "type": "string", "nullable": true }, "ad_group_id": { "type": "string", "nullable": true }, "ad_id": { "type": "string", "nullable": true }, "ad_detail_id": { "type": "string", "nullable": true }, "current_page": { "type": "string" }, "c99_user_cookie_id": { "type": "string" } } }, "AdUnitList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/AdUnit" } } }, "required": [ "data" ] }, "AdUnit": { "type": "object", "properties": { "ad_unit_id": { "type": "string" }, "ad_unit_name": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "ad_unit_id", "ad_unit_name", "is_deleted" ] }, "AdList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Ad" } } }, "required": [ "data" ] }, "Ad": { "type": "object", "properties": { "ad_id": { "type": "string" }, "ad_name": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "ad_id", "ad_name", "is_deleted" ] }, "AdGroupList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/AdGroup" } } }, "required": [ "data" ] }, "AdGroup": { "type": "object", "properties": { "ad_group_id": { "type": "string" }, "ad_group_name": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "ad_group_id", "ad_group_name", "is_deleted" ] }, "AdCampaignGroupList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/AdCampaignGroup" } } }, "required": [ "data" ] }, "AdCampaignGroup": { "type": "object", "properties": { "ad_campaign_group_id": { "type": "string" }, "ad_campaign_group_name": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "ad_campaign_group_id", "ad_campaign_group_name", "is_deleted" ] }, "AdCampaignList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/AdCampaign" } } }, "required": [ "data" ] }, "AdCampaign": { "type": "object", "properties": { "ad_campaign_id": { "type": "string" }, "ad_campaign_name": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "ad_campaign_id", "ad_campaign_name", "is_deleted" ] }, "AdAccountList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/AdAccount" } } }, "required": [ "data" ] }, "AdAccount": { "type": "object", "properties": { "ad_account_id": { "type": "string" }, "ad_account_name": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "ad_account_id", "ad_account_name", "is_deleted" ] }, "AudienceList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Audience" } } }, "required": [ "data" ] }, "Audience": { "type": "object", "properties": { "audience_id": { "type": "string" }, "audience_name": { "type": "string" }, "audience_description": { "type": "string" }, "is_deleted": { "type": "boolean" } }, "required": [ "audience_id", "audience_name", "audience_description", "is_deleted" ] }, "CompanyList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Company" } } }, "required": [ "data" ] }, "Company": { "type": "object", "properties": { "company_id": { "type": "string" }, "company_domain": { "type": "string" }, "company_name": { "type": "string" }, "sector_id": { "type": "string" }, "region_id": { "type": "string" }, "revenue_range_id": { "type": "string" } }, "required": [ "company_id", "company_domain", "company_name", "sector_id", "region_id", "revenue_range_id" ] }, "VendorList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Vendor" } } }, "required": [ "data" ] }, "Vendor": { "type": "object", "properties": { "vendor_id": { "type": "string" }, "vendor_name": { "type": "string" } }, "required": [ "vendor_id", "vendor_name" ] }, "ChannelList": { "type": "object", "properties": { "data": { "type": "array", "items": { "$ref": "#/components/schemas/Channel" } } }, "required": [ "data" ] }, "Channel": { "type": "object", "properties": { "channel_id": { "type": "string" }, "channel_name": { "type": "string" } }, "required": [ "channel_id", "channel_name" ] }, "IpCompanyRecord": { "type": "object", "description": "Company information associated with an IP address. Company fields may be null when the IP address is known but a company relationship could not be determined.", "properties": { "ip_address": { "type": "string", "example": "203.0.113.42" }, "company_domain": { "type": "string", "nullable": true, "example": "acme.com", "description": "Null when the company relationship for this IP could not be resolved." }, "company_name": { "type": "string", "nullable": true, "example": "Acme Corp", "description": "Null when the company relationship for this IP could not be resolved." }, "region_name": { "type": "string", "nullable": true, "example": "North America", "description": "Null when the company relationship for this IP could not be resolved." }, "rev_range_name": { "type": "string", "nullable": true, "example": "$100M\u2013$500M", "description": "Null when the company relationship for this IP could not be resolved." }, "sector_name": { "type": "string", "nullable": true, "example": "Technology", "description": "Null when the company relationship for this IP could not be resolved." } }, "required": [ "ip_address" ] }, "Error": { "type": "object", "properties": { "error": { "type": "string", "description": "Error class name" }, "code": { "type": "string", "description": "Machine-readable error code (e.g. `err:pulsar.request.invalid-limit`, `err:pulsar.core.not-found`)", "example": "err:pulsar.request.invalid-limit" }, "message": { "type": "string", "description": "Human-readable description" } }, "required": [ "error", "code", "message" ] } } } }