openapi: 3.2.0 info: title: Zoca Platform Bundles 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: Bundles paths: /bundles/{entityId}: get: description: Retrieves all active bundles for a specific entity. Use includeServices=true to include full service variation details. operationId: t_value parameters: - name: includeServices required: false in: query description: Include full service variation details in the response schema: type: boolean - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: List of bundles retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/t' security: - bearer: [] summary: Get bundles by entity ID tags: - Bundles post: description: "Creates a new service bundle for a specific entity with the following features:\n - Bundle multiple services together\n - Set combined bundle price\n - Configure deposit requirements\n - Assign specific providers\n - Add bundle images" operationId: t_value parameters: - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true description: Bundle creation data content: application/json: schema: $ref: '#/components/schemas/e' responses: '201': description: Bundle created successfully content: application/json: schema: $ref: '#/components/schemas/e' '400': description: Invalid input data content: application/json: schema: type: object properties: status: type: number example: 400 error: type: string example: Bad Request message: type: array items: type: string '500': description: Internal server error security: - bearer: [] summary: Create a new bundle tags: - Bundles /bundles/{entityId}/{bundleId}: get: description: Retrieves detailed information about a specific bundle including services operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Bundle retrieved successfully content: application/json: schema: $ref: '#/components/schemas/t' '404': description: Bundle not found security: - bearer: [] summary: Get bundle by ID tags: - Bundles put: description: Updates an existing bundle operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Bundle updated successfully content: application/json: schema: $ref: '#/components/schemas/e' '404': description: Bundle not found security: - bearer: [] summary: Update bundle tags: - Bundles delete: description: Soft deletes a bundle and all its associated data operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Bundle deleted successfully content: application/json: schema: type: object properties: message: type: string example: Bundle deleted successfully '404': description: Bundle not found security: - bearer: [] summary: Delete bundle tags: - Bundles /bundles/{entityId}/{bundleId}/services: post: description: Associates multiple services with a bundle with optional ordering operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Services added to bundle successfully content: application/json: schema: type: object properties: message: type: string example: Services added to bundle successfully '404': description: Bundle not found security: - bearer: [] summary: Add services to bundle tags: - Bundles /bundles/{entityId}/{bundleId}/services/{serviceVariationId}: delete: description: Removes a service association from a bundle operationId: t_value parameters: - name: serviceVariationId required: true in: path description: UUID of the service variation schema: format: uuid type: string - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Service removed from bundle successfully content: application/json: schema: type: object properties: message: type: string example: Service removed from bundle successfully '404': description: Bundle not found security: - bearer: [] summary: Remove service from bundle tags: - Bundles /bundles/{entityId}/{bundleId}/services/order: put: description: Updates the display order of services within a bundle operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true content: application/json: schema: type: object properties: serviceOrders: type: array items: type: object properties: serviceVariationId: type: string format: uuid orderIndex: type: number responses: '200': description: Service order updated successfully content: application/json: schema: type: object properties: message: type: string example: Service order updated successfully '404': description: Bundle not found security: - bearer: [] summary: Update service order in bundle tags: - Bundles /bundles/{entityId}/{bundleId}/providers: post: description: Associates multiple providers with a bundle operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Providers added to bundle successfully content: application/json: schema: type: object properties: message: type: string example: Providers added to bundle successfully '404': description: Bundle not found security: - bearer: [] summary: Add providers to bundle tags: - Bundles get: description: Retrieves all enabled provider IDs for a bundle operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Enabled providers retrieved successfully content: application/json: schema: type: object properties: providerIds: type: array items: type: string format: uuid '404': description: Bundle not found security: - bearer: [] summary: Get enabled providers for bundle tags: - Bundles /bundles/{entityId}/{bundleId}/providers/{providerId}: delete: description: Removes a provider association from a bundle operationId: t_value parameters: - name: providerId required: true in: path description: UUID of the provider schema: format: uuid type: string - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Provider removed from bundle successfully content: application/json: schema: type: object properties: message: type: string example: Provider removed from bundle successfully '404': description: Bundle not found security: - bearer: [] summary: Remove provider from bundle tags: - Bundles /bundles/{entityId}/{bundleId}/providers/{providerId}/toggle: put: description: Enables or disables a provider for a bundle operationId: t_value parameters: - name: providerId required: true in: path description: UUID of the provider schema: format: uuid type: string - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/e' responses: '200': description: Provider status toggled successfully content: application/json: schema: type: object properties: message: type: string example: Provider status toggled successfully '404': description: Bundle not found security: - bearer: [] summary: Toggle provider enabled status tags: - Bundles /bundles/{entityId}/{bundleId}/images: post: description: Associates an image with a bundle operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string requestBody: required: true content: application/json: schema: type: object properties: mediaId: type: number isPrimary: type: boolean default: false responses: '200': description: Image added to bundle successfully content: application/json: schema: type: object properties: message: type: string example: Image added to bundle successfully '404': description: Bundle not found security: - bearer: [] summary: Add image to bundle tags: - Bundles get: description: Retrieves all images for a bundle operationId: t_value parameters: - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Bundle images retrieved successfully content: application/json: schema: type: array items: type: object properties: mediaId: type: number isPrimary: type: boolean createdAt: type: string format: date-time '404': description: Bundle not found security: - bearer: [] summary: Get bundle images tags: - Bundles /bundles/{entityId}/{bundleId}/images/{mediaId}: delete: description: Removes an image association from a bundle operationId: t_value parameters: - name: mediaId required: true in: path description: Media ID schema: type: number - name: bundleId required: true in: path description: UUID of the bundle schema: format: uuid type: string - name: entityId required: true in: path description: UUID of the entity schema: format: uuid type: string responses: '200': description: Image removed from bundle successfully content: application/json: schema: type: object properties: message: type: string example: Image removed from bundle successfully '404': description: Bundle not found security: - bearer: [] summary: Remove image from bundle tags: - Bundles /bundles/by-service/{serviceVariationId}: get: description: Retrieves all bundles that include a specific service variation operationId: t_value parameters: - name: serviceVariationId required: true in: path description: UUID of the service variation schema: format: uuid type: string responses: '200': description: Bundle IDs retrieved successfully content: application/json: schema: type: object properties: bundleIds: type: array items: type: string format: uuid security: - bearer: [] summary: Get bundles by service variation tags: - Bundles /bundles/by-provider/{providerId}: get: description: Retrieves all bundles available for a specific provider operationId: t_value parameters: - name: entityId required: true in: query description: UUID of the entity schema: format: uuid type: string - name: providerId required: true in: path description: UUID of the provider schema: format: uuid type: string responses: '200': description: Bundles retrieved successfully content: application/json: schema: type: array items: $ref: '#/components/schemas/e' security: - bearer: [] summary: Get bundles by provider tags: - Bundles components: schemas: t: type: object properties: id: type: number planId: type: number agentEntityId: type: - object - 'null' format: uuid agentName: type: string internalAddonName: type: string description: Chargebee item_price_id (internal addon name) externalAddonName: type: string description: Human-readable addon label shown to end-users active: type: boolean description: true if the location currently holds an active subscription for this addon subscriptionId: type: - object - 'null' quantity: type: - object - 'null' trialEnd: type: - object - 'null' description: Unix epoch seconds (Chargebee trial_end) addonPricingId: type: - object - 'null' description: chargebee.addon_pricing.id for this addon at the location's current cadence. Pass back to PATCH /billing/subscription as `update_items.items[].addonPricingId`.Null when no active addon_pricing row exists - surfaces a config gap and the FE should hide the buy CTA. unitPriceCents: type: - object - 'null' description: Per-line price the location would be billed at this cadence (cents). required: - id - planId - agentEntityId - agentName - internalAddonName - externalAddonName - active - subscriptionId - quantity - trialEnd - addonPricingId - unitPriceCents 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