openapi: 3.0.3 info: title: CleanCloud Business and Reporting Pickup and Delivery API description: 'The CleanCloud API provides programmatic access to the CleanCloud point-of-sale and business-management platform for dry cleaners, laundromats, laundry services, and shoe repair businesses. It covers customers, orders and garments, products, price lists, inventory, pickup and delivery scheduling and routing, payments and subscriptions, invoices, promotions and loyalty, messaging, and reporting. All calls are HTTPS POST requests with a JSON body to https://cleancloudapp.com/api and return JSON. Authentication uses a per-account API token passed as the `api_token` field in the JSON request body (found in the CleanCloud admin under Settings > Admin > Pickup and Delivery > API). Because the token is a body field rather than an HTTP header or query parameter, it is modeled here as a required `api_token` property on each request schema rather than as an OpenAPI security scheme. API access requires a Grow or Grow+ subscription (Pro in Mexico) and is metered at 50,000 requests per month with a maximum of 3 requests per second; additional 25,000-request bundles are available. CleanCloud also emits outbound webhooks for order and customer events; those are documented in the provider apis.yml and review, not as request/response paths here.' version: '1.0' contact: name: CleanCloud url: https://cleancloudapp.com x-authentication: scheme: api_token location: request body (JSON field `api_token`) note: Every endpoint requires the api_token field. It is not sent as an Authorization header or query parameter. servers: - url: https://cleancloudapp.com/api description: CleanCloud production API tags: - name: Pickup and Delivery description: Recurring pickups, routing, scheduling, and driver location. paths: /repeatPickup: post: operationId: repeatPickup tags: - Pickup and Delivery summary: Create a recurring pickup description: Creates a scheduled recurring pickup for a customer. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object required: - customerID properties: customerID: type: string frequency: type: string dayOfWeek: type: string responses: '200': description: The created recurring pickup. content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '401': $ref: '#/components/responses/Unauthorized' /updateRepeatPickup: post: operationId: updateRepeatPickup tags: - Pickup and Delivery summary: Update a recurring pickup description: Modifies an existing recurring pickup schedule. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object required: - pickupID properties: pickupID: type: string frequency: type: string dayOfWeek: type: string responses: '200': description: The updated recurring pickup. content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '401': $ref: '#/components/responses/Unauthorized' /deletePickup: post: operationId: deletePickup tags: - Pickup and Delivery summary: Cancel a recurring pickup description: Cancels a recurring pickup. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object required: - pickupID properties: pickupID: type: string responses: '200': description: Cancellation result. content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '401': $ref: '#/components/responses/Unauthorized' /getPickups: post: operationId: getPickups tags: - Pickup and Delivery summary: List recurring pickups description: Retrieves a customer's recurring pickups. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object required: - customerID properties: customerID: type: string responses: '200': description: A list of recurring pickups. content: application/json: schema: type: object properties: Pickups: type: array items: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /getDates: post: operationId: getDates tags: - Pickup and Delivery summary: Get available dates description: Returns available pickup/delivery dates with remaining slot counts. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object properties: routeID: type: string responses: '200': description: Available dates. content: application/json: schema: type: object properties: Dates: type: array items: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /getSlots: post: operationId: getSlots tags: - Pickup and Delivery summary: Get time slots description: Returns available time slots for a route on a given day. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object properties: routeID: type: string date: type: string responses: '200': description: Available time slots. content: application/json: schema: type: object properties: Slots: type: array items: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /getRoute: post: operationId: getRoute tags: - Pickup and Delivery summary: Resolve a route description: Determines the delivery route from coordinates or an address. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object properties: address: type: string lat: type: number lng: type: number responses: '200': description: The resolved route. content: application/json: schema: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' /driverLocation: post: operationId: driverLocation tags: - Pickup and Delivery summary: Get driver location description: Returns the current driver location for an order. requestBody: required: true content: application/json: schema: allOf: - $ref: '#/components/schemas/AuthBody' - type: object required: - orderID properties: orderID: type: string responses: '200': description: The current driver location. content: application/json: schema: type: object properties: lat: type: number lng: type: number '401': $ref: '#/components/responses/Unauthorized' components: schemas: SuccessResponse: type: object properties: Success: type: string description: Typically "True" on success. Error: type: object properties: Error: type: string Success: type: string AuthBody: type: object required: - api_token properties: api_token: type: string description: Per-account API token from Settings > Admin > Pickup and Delivery > API. Required on every request. responses: Unauthorized: description: Missing or invalid api_token. content: application/json: schema: $ref: '#/components/schemas/Error'