openapi: 3.2.0 info: title: Zoca Tasks Scraped Services API description: 'The Zoca tasks/automation service: AI content queue and planning, FrontDesk (Retell/Twilio) voice + SMS agent onboarding, local-SEO grid scans, WIN conversion triggers, and inbound integration webhooks (Chargebee, Square, Pipedrive, Twilio, Retell, CallHippo, Sybill, Instantly).' version: 3.20.9 contact: {} x-apievangelist-note: Harvested verbatim from https://tasks.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-tasks-swagger.json. Every path, operation, summary, parameter and response is exactly as published. servers: - url: https://tasks.zoca.ai description: Production security: - access-token: [] tags: - name: Scraped Services paths: /tasks/api/v1/scraped-services/sync/{linkId}: post: operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: Services synced successfully '404': description: Link not found '500': description: Internal server error summary: Sync services from a platform link tags: - Scraped Services /tasks/api/v1/scraped-services/sync-to-production/{linkId}: post: description: Uses 3-tier matching (column map → fuzzy name → create new) to sync scraped services and variations into production services tables. operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: Services synced to production successfully '404': description: Link not found or no scraped services '500': description: Internal server error summary: Sync scraped services to production tables tags: - Scraped Services /tasks/api/v1/scraped-services/reconcile/{linkId}/preview: get: description: Simulates the 3-tier matching for unmapped scraped services and variations, showing what would be matched or created. operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: Preview generated successfully '404': description: Link not found '500': description: Internal server error summary: Preview reconciliation without making changes tags: - Scraped Services /tasks/api/v1/scraped-services/reconcile/{linkId}/ai-suggest: get: description: Uses an LLM to suggest mappings between unmapped scraped services/variations and production candidates based on semantic name matching. operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: AI suggestions generated successfully '404': description: Link not found '500': description: Internal server error summary: Get AI-suggested reconciliation mappings tags: - Scraped Services /tasks/api/v1/scraped-services/reconcile/{linkId}/manual: post: description: Applies user-reviewed mappings between scraped services/variations and production items. Supports matching to existing items or creating new ones. operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} requestBody: required: true content: application/json: schema: type: object required: - mappings properties: mappings: type: array items: type: object required: - type - platformId - productionId properties: type: type: string enum: - service - variation platformId: type: string description: Platform service/variant ID productionId: type: - string - 'null' description: Production ID to map to, or null to create new responses: '200': description: Mappings applied successfully '404': description: Link not found '500': description: Internal server error summary: Apply manual reconciliation mappings tags: - Scraped Services /tasks/api/v1/scraped-services/reconcile/{linkId}/candidates: get: description: Returns the list of production services and variations available for manual mapping in the reconciliation UI. operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: Candidates retrieved successfully '404': description: Link not found '500': description: Internal server error summary: Get production candidates for manual reconciliation tags: - Scraped Services /tasks/api/v1/scraped-services/reconcile/{linkId}: post: description: Finds scraped services and variations without production mappings and attempts to match or create them using the 3-tier strategy. operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: Reconciliation completed successfully '404': description: Link not found '500': description: Internal server error summary: Reconcile unmapped scraped services with production tags: - Scraped Services /tasks/api/v1/scraped-services/scrape-url: post: description: Provide a URL from supported platforms (Fresha, Booksy, GlossGenius, Square, Vagaro, Acuity) to scrape services in real-time operationId: t_value parameters: [] requestBody: required: true content: application/json: schema: type: object required: - url properties: url: type: string description: The platform URL to scrape services from example: https://www.fresha.com/a/beauty-salon-london-xyz123 platform: type: string description: 'Optional: Specify the platform type (auto-detected if not provided)' enum: - fresha - booksy - glossgenius - square - squareup - vagaro - acuity example: fresha responses: '200': description: Services scraped successfully content: application/json: schema: type: object properties: success: type: boolean url: type: string platform: type: string businessInfo: type: object properties: name: type: string description: type: string phone: type: string email: type: string address: type: object category: type: string bookingLink: type: string workingHours: type: array logo: type: object banner: type: array platformId: type: string about: type: object reviews: type: number services: type: array items: type: object properties: id: type: string name: type: string description: type: string category: type: string price: type: object properties: type: type: string enum: - FIXED - RANGE - STARTS_AT - NO_PRICE start: type: string end: type: string currency: type: string discountedPrice: type: string duration: type: object properties: type: type: string enum: - FIXED - RANGE - NO_DURATION start: type: string end: type: string unit: type: string image: type: string variants: type: array totalServices: type: number scrapedAt: type: string format: date-time '400': description: Invalid URL or unsupported platform summary: Scrape services directly from a URL without saving to database tags: - Scraped Services /tasks/api/v1/scraped-services/diff/{entityId}: get: description: Read-only comparison showing what would change if syncToProduction were run. Finds the first booking link for the entity and shows new, changed, deleted, and unchanged services/variations with field-level detail. operationId: t_value parameters: - name: entityId required: true in: path description: UUID of the entity schema: {} responses: '200': description: Diff generated successfully '404': description: No booking link found or sync not enabled '500': description: Internal server error summary: Preview production sync diff tags: - Scraped Services /tasks/api/v1/scraped-services/{linkId}: get: operationId: t_value parameters: - name: linkId required: true in: path description: UUID of the link from entities.links schema: {} responses: '200': description: Services retrieved successfully '404': description: No services found for link summary: Get all scraped services for a link tags: - Scraped Services components: securitySchemes: access-token: scheme: bearer bearerFormat: JWT type: http name: Authorization description: Enter JWT token in the format Bearer in: header