openapi: 3.2.0 info: title: Zoca Platform Packages API description: 'The Zoca platform API behind the Zoca web app and mobile apps: scheduling, website generation, Google Business Profile, discovery/local SEO, social media, booking enquiries, offers, clients, staff, billing and the Zoca "brain" agent layer.' version: 3.20.10 contact: {} x-apievangelist-note: Harvested verbatim from https://api.zoca.ai/swagger.json. The provider ships the default NestJS Swagger metadata (title "API Documentation", empty servers[]); title/description/servers were set by API Evangelist for identification and the unmodified original is preserved at openapi/_original/zoca-platform-swagger.json. Every path, operation, summary, parameter and response is exactly as published. servers: - url: https://api.zoca.ai description: Production tags: - name: Packages paths: /packages/{entityId}/templates: post: operationId: t_value parameters: - name: entityId required: true in: path schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '201': description: Template created content: application/json: schema: $ref: '#/components/schemas/e' '400': description: Invalid input (business rules 1-5) security: - bearer: [] summary: Create a package template tags: - Packages get: operationId: t_value parameters: - name: cursor required: false in: query schema: type: string - name: limit required: false in: query schema: type: number - name: status required: false in: query schema: enum: - active - archived type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Cursor-paginated templates content: application/json: schema: $ref: '#/components/schemas/e' security: - bearer: [] summary: List package templates tags: - Packages /packages/{entityId}/templates/{id}: get: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Template found content: application/json: schema: $ref: '#/components/schemas/e' '404': description: Template not found security: - bearer: [] summary: Get a package template by ID tags: - Packages put: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Template updated content: application/json: schema: $ref: '#/components/schemas/e' '400': description: Invalid input (business rules 1-5) '404': description: Template not found security: - bearer: [] summary: Update a package template tags: - Packages /packages/{entityId}/templates/{id}/archive: post: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Template archived '404': description: Template not found security: - bearer: [] summary: Archive a package template tags: - Packages /packages/{entityId}/templates/{id}/unarchive: post: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Template unarchived '404': description: Template not found security: - bearer: [] summary: Unarchive a package template tags: - Packages /packages/{entityId}/templates/{id}/duplicate: post: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '201': description: Duplicate created content: application/json: schema: $ref: '#/components/schemas/e' '404': description: Template not found security: - bearer: [] summary: Duplicate a package template tags: - Packages /packages/{entityId}/service-usage: get: operationId: t_value parameters: - name: serviceId required: true in: query schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Referencing templates content: application/json: schema: $ref: '#/components/schemas/e' security: - bearer: [] summary: List active package templates that reference a service tags: - Packages /packages/{entityId}/purchased: get: operationId: t_value parameters: - name: cursor required: false in: query schema: type: string - name: limit required: false in: query schema: type: number - name: clientId required: false in: query schema: type: string - name: status required: false in: query schema: enum: - ACTIVE - EXPIRED - REFUNDED type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Cursor-paginated sold packages content: application/json: schema: type: object properties: items: type: array items: $ref: '#/components/schemas/e' nextCursor: type: - string - 'null' security: - bearer: [] summary: List sold packages for an entity tags: - Packages /packages/{entityId}/purchased/{id}: get: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Purchased package found content: application/json: schema: $ref: '#/components/schemas/e' '404': description: Purchased package not found security: - bearer: [] summary: Get a purchased package by ID tags: - Packages /packages/{entityId}/clients/{clientId}/balances: get: operationId: t_value parameters: - name: clientId required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Client package balances content: application/json: schema: $ref: '#/components/schemas/e' security: - bearer: [] summary: Get a client's package credit balances tags: - Packages /packages/{entityId}/clients/{clientId}/purchased: get: operationId: t_value parameters: - name: cursor required: false in: query schema: type: string - name: limit required: false in: query schema: type: number - name: status required: false in: query schema: enum: - ACTIVE - EXPIRED - REFUNDED type: string - name: clientId required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Cursor-paginated purchased packages content: application/json: schema: type: object properties: items: type: array items: $ref: '#/components/schemas/e' nextCursor: type: - string - 'null' security: - bearer: [] summary: List a client's purchased packages tags: - Packages /packages/{entityId}/purchased/{id}/refund-quote: get: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string responses: '200': description: Refund quote content: application/json: schema: $ref: '#/components/schemas/e' '404': description: Purchased package not found '409': description: Package is not ACTIVE '422': description: Redeemed items lack a frozen à-la-carte price security: - bearer: [] summary: Quote a refund for a purchased package tags: - Packages /packages/{entityId}/purchased/{id}/refund: post: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Refund processed '400': description: Refund amount invalid / exceeds remaining '404': description: Purchased package not found '409': description: Package is not ACTIVE security: - bearer: [] summary: Refund a purchased package tags: - Packages /packages/{entityId}/purchased/{id}/extend-expiry: post: operationId: t_value parameters: - name: id required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Expiry extended content: application/json: schema: $ref: '#/components/schemas/e' '400': description: New expiry must be in the future '404': description: Purchased package not found '409': description: Package is REFUNDED security: - bearer: [] summary: Extend or revive a purchased package expiry tags: - Packages /packages/{entityId}/purchased/{purchasedPackageId}/reassign: post: operationId: t_value parameters: - name: purchasedPackageId required: true in: path schema: format: uuid type: string - name: entityId required: true in: path schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Credits reassigned content: application/json: schema: $ref: '#/components/schemas/e' '400': description: Invalid from/to refs or inactive target service '404': description: Purchased package or group not found '409': description: Package is not ACTIVE security: - bearer: [] summary: Reassign a purchased group's credits to a different eligible service tags: - Packages components: schemas: e: type: object properties: id: type: number entityId: type: string attribute: type: string value: type: - object - 'null' metadata: type: - object - 'null' createdAt: type: - object - 'null' required: - id - entityId - attribute securitySchemes: access-token: scheme: bearer bearerFormat: JWT type: http name: Authorization description: Enter JWT token in the format Bearer in: header