openapi: 3.2.0 info: title: Relay External REST Marketing Lists API version: 1.1.0 description: REST API for programmatic access to Relay CRM resources. servers: - url: https://your-domain.com/api/v1 description: Production security: - bearerAuth: [] tags: - name: Marketing Lists paths: /marketing-lists: get: summary: List marketing lists tags: - Marketing Lists parameters: - name: status in: query schema: type: string enum: - active - archived - name: limit in: query description: Max results (default 50). schema: type: integer minimum: 1 maximum: 100 - name: offset in: query description: Pagination offset (default 0). schema: type: integer minimum: 0 responses: '200': description: Success content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/MarketingList' meta: $ref: '#/components/schemas/PaginationMeta' required: - data '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: getMarketingLists x-operation-id-source: derived post: summary: Create marketing list tags: - Marketing Lists requestBody: required: true description: name (required); description, opt_in_process content: application/json: schema: type: object additionalProperties: true responses: '201': description: Created content: application/json: schema: type: object properties: data: $ref: '#/components/schemas/MarketingList' required: - data '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: postMarketingLists x-operation-id-source: derived /marketing-lists/{id}: get: summary: Get marketing list tags: - Marketing Lists parameters: - name: id in: path required: true schema: type: string format: uuid responses: '200': description: Success content: application/json: schema: type: object properties: data: $ref: '#/components/schemas/MarketingList' required: - data '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: getMarketingListsById x-operation-id-source: derived patch: summary: Update marketing list tags: - Marketing Lists parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true description: name, description, opt_in_process, status content: application/json: schema: type: object additionalProperties: true responses: '200': description: Success content: application/json: schema: type: object properties: data: $ref: '#/components/schemas/MarketingList' required: - data '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: patchMarketingListsById x-operation-id-source: derived delete: summary: Delete marketing list tags: - Marketing Lists parameters: - name: id in: path required: true schema: type: string format: uuid responses: '204': description: No content '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: deleteMarketingListsById x-operation-id-source: derived /marketing-lists/{id}/members: get: summary: List members tags: - Marketing Lists parameters: - name: id in: path required: true schema: type: string format: uuid - name: status in: query schema: type: string enum: - subscribed - unsubscribed - pending - name: limit in: query description: Max results (default 50). schema: type: integer minimum: 1 maximum: 100 - name: offset in: query description: Pagination offset (default 0). schema: type: integer minimum: 0 responses: '200': description: Success content: application/json: schema: type: object properties: data: type: array items: $ref: '#/components/schemas/ListMembership' meta: $ref: '#/components/schemas/PaginationMeta' required: - data '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: getMarketingListsByIdMembers x-operation-id-source: derived post: summary: Add members (fires list-trigger enrollment) tags: - Marketing Lists parameters: - name: id in: path required: true schema: type: string format: uuid requestBody: required: true description: customer_ids (1-1000); source content: application/json: schema: type: object additionalProperties: true responses: '200': description: Success content: application/json: schema: type: object properties: data: type: object properties: added: type: integer skipped: type: integer '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: postMarketingListsByIdMembers x-operation-id-source: derived delete: summary: Remove/unsubscribe members tags: - Marketing Lists parameters: - name: id in: path required: true schema: type: string format: uuid - name: mode in: query description: Default remove. schema: type: string enum: - remove - unsubscribe requestBody: required: true description: customer_ids (1-1000) content: application/json: schema: type: object additionalProperties: true responses: '200': description: Success content: application/json: schema: type: object properties: data: type: object '400': description: Bad request content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '401': description: Unauthorized content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '403': description: Forbidden content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': description: Not found content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' operationId: deleteMarketingListsByIdMembers x-operation-id-source: derived components: schemas: MarketingList: type: object properties: id: type: string organization_id: type: string name: type: string description: type: - string - 'null' opt_in_process: type: string enum: - single - double status: type: string enum: - active - archived member_count: type: integer created_at: type: string format: date-time ListMembership: type: object properties: id: type: string list_id: type: string customer_id: type: string organization_id: type: string status: type: string enum: - subscribed - unsubscribed - pending source: type: string subscribed_at: type: - string - 'null' format: date-time PaginationMeta: type: object properties: total: type: integer limit: type: integer next_cursor: type: - string - 'null' ErrorResponse: type: object properties: error: type: object properties: code: type: string message: type: string details: {} required: - code - message required: - error securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: API Key