openapi: 3.2.0 info: title: Pulsar Ad Units API description: Channel99 Bulk Data Transfer REST API version: 1.0.0 servers: - url: / tags: - name: Ad Units description: Ad unit dimension records — `GET /dimensions/ad-units` paths: /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 – missing instance or invalid filter content: application/json: schema: $ref: '#/components/schemas/Error' '401': description: Unauthorized – missing or malformed credentials content: application/json: schema: $ref: '#/components/schemas/Error' '403': description: Forbidden – 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[][]=`. Operators by field type: - **string**: `eq`, `ne`, `in`, `notIn`, `isNull`, `isNotNull` - **number**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `in`, `notIn`, `isNull`, `isNotNull` - **boolean**: `eq`, `ne`, `isNull`, `isNotNull` - **date**: `eq`, `ne`, `gt`, `gte`, `lt`, `lte`, `isNull`, `isNotNull` For `in` and `notIn`, provide comma-separated values: `filter[tag_id][in]=a,b,c`. For `isNull` and `isNotNull`, the value is ignored. Multiple filters are combined with AND. Examples: - `filter[ad_unit_id][eq]=unt_abc123` - `filter[ad_unit_name][in]=Leaderboard,Rectangle` - `filter[is_deleted][eq]=false`' style: deepObject explode: true schema: type: object responses: TooManyRequests: description: 'Rate limit exceeded – too many requests from this client. Limits: - `POST /auth/token`: 20 req/min per `client_id` (app), plus WAF per-IP limit - `/events/*` and `/dimensions/*`: burst limit of 100 req / 10s per client (app) - All authenticated routes: WAF 60 req/s per `x-client-id` (5-minute window) - `/ip/*` routes: WAF elevated tier (app burst limit does not apply) App-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' NotFound: description: Not found – no matching route or resource (code `err:pulsar.core.not-found`) content: application/json: schema: $ref: '#/components/schemas/Error' schemas: AdUnitList: type: object properties: data: type: array items: $ref: '#/components/schemas/AdUnit' required: - data 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 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 securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT description: 'M2M Bearer token issued by Stytch. Pass as `Authorization: Bearer `. Example: `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. Example: `x-client-id: m2m-client-00000000-0000-0000-0000-000000000000`'