openapi: 3.0.3 info: title: Skimmer Public API description: >- The Skimmer Public API is the enterprise integration surface for Skimmer, pool-service business management software. It exposes the pool-service company's operational data - customers, bodies of water, service locations, work orders and work order types, technician routes, quotes, invoices, billing, products and product categories, and users - over REST at https://publicapi.getskimmer.com. Access is sales-led: the API is available only on Skimmer's top ("Owning the Market" / Enterprise) tier and is provisioned by Skimmer's team, not through self-service signup. Every request is authenticated with a per-account API key sent in the `skimmer-api-key` header. The API is rate limited to 500 requests per minute per key; exceeding it returns 429 with a Retry-After header. NOTE: Path names, HTTP methods, the base URL, the auth header, and the Sieve-style search parameters below are taken from Skimmer's public developer portal (devportal.getskimmer.com). Request and response BODY schemas are MODELED by API Evangelist from resource descriptions - Skimmer does not publish a machine-readable OpenAPI document publicly, and full field-level schemas are behind the sales-led onboarding. Treat property lists as representative, not authoritative. version: '1.0' contact: name: Skimmer url: https://www.getskimmer.com servers: - url: https://publicapi.getskimmer.com description: Skimmer Public API (production) security: - skimmerApiKey: [] tags: - name: Customers description: Pool-service customers and their activity logs. - name: Bodies of Water description: Pools and other bodies of water Skimmer services. - name: Service Locations description: Physical service sites; the unit Skimmer bills on. - name: Work Orders description: Repair and service jobs, and work order types. - name: Routes description: Technician routes of service stops by date. - name: Invoices description: Invoices and billable service activity. - name: Quotes description: Sales quotes / estimates. - name: Products description: Product catalog, categories, and prices. - name: Users description: Account users - owners, admins, and technicians. paths: /Customers: get: tags: [Customers] summary: List customers responses: '200': description: An array of customers. put: tags: [Customers] summary: Update an existing customer responses: '200': description: The updated customer. post: tags: [Customers] summary: Create a new customer responses: '201': description: The created customer. /Customers/search: get: tags: [Customers] summary: Search customers parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of customers. /Customers/{id}: get: tags: [Customers] summary: Get one customer by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single customer. delete: tags: [Customers] summary: Delete a customer parameters: - $ref: '#/components/parameters/IdPath' responses: '204': description: Deleted. /Customers/Activate: post: tags: [Customers] summary: Activate a customer responses: '200': description: The customer was activated. /Customers/Deactivate: post: tags: [Customers] summary: Deactivate a customer responses: '200': description: The customer was deactivated. /CustomerActivityLogs: get: tags: [Customers] summary: List customer activity logs responses: '200': description: An array of customer activity logs. put: tags: [Customers] summary: Update a customer activity log responses: '200': description: The updated activity log. post: tags: [Customers] summary: Create a customer activity log responses: '201': description: The created activity log. /BodiesOfWater: get: tags: [Bodies of Water] summary: List bodies of water responses: '200': description: An array of bodies of water. put: tags: [Bodies of Water] summary: Update a body of water responses: '200': description: The updated body of water. post: tags: [Bodies of Water] summary: Create a body of water responses: '201': description: The created body of water. /BodiesOfWater/search: get: tags: [Bodies of Water] summary: Search bodies of water parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of bodies of water. /BodiesOfWater/{id}: get: tags: [Bodies of Water] summary: Get one body of water by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single body of water. delete: tags: [Bodies of Water] summary: Delete a body of water parameters: - $ref: '#/components/parameters/IdPath' responses: '204': description: Deleted. /ServiceLocations: get: tags: [Service Locations] summary: List service locations responses: '200': description: An array of service locations. put: tags: [Service Locations] summary: Update a service location responses: '200': description: The updated service location. post: tags: [Service Locations] summary: Create a service location responses: '201': description: The created service location. /ServiceLocations/search: get: tags: [Service Locations] summary: Search service locations parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of service locations. /ServiceLocations/{id}: get: tags: [Service Locations] summary: Get one service location by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single service location. delete: tags: [Service Locations] summary: Delete a service location parameters: - $ref: '#/components/parameters/IdPath' responses: '204': description: Deleted. /WorkOrders: put: tags: [Work Orders] summary: Update a work order responses: '200': description: The updated work order. post: tags: [Work Orders] summary: Create a work order responses: '201': description: The created work order. /WorkOrders/search: get: tags: [Work Orders] summary: Search work orders parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of work orders. /WorkOrders/{id}: get: tags: [Work Orders] summary: Get one work order by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single work order. /WorkOrderTypes: get: tags: [Work Orders] summary: List work order types responses: '200': description: An array of work order types. /Routes/GetTechRoute: get: tags: [Routes] summary: Get a technician's route for a date parameters: - name: TechId in: query required: true description: Identifier of the technician (user). schema: type: string - name: ServiceDate in: query required: true description: Service date (date). schema: type: string format: date responses: '200': description: The technician's ordered route of stops for the date. /Routes/GetAllRoutesForDay: get: tags: [Routes] summary: Get all technician routes for a date parameters: - name: ServiceDate in: query required: true description: Service date (date). schema: type: string format: date responses: '200': description: All technicians' routes for the given date. /Invoices: get: tags: [Invoices] summary: List invoices by date responses: '200': description: An array of invoices. /Invoices/search: get: tags: [Invoices] summary: Search invoices parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of invoices. /Invoices/{id}: get: tags: [Invoices] summary: Get one invoice by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single invoice. /Billing: get: tags: [Invoices] summary: Get billable service activity description: Retrieves billable service activity meeting the filter criteria. parameters: - $ref: '#/components/parameters/Filters' responses: '200': description: Billable service activity. /Quotes: get: tags: [Quotes] summary: List quotes parameters: - name: customerId in: query required: false description: Filter quotes by customer. schema: type: string - name: includeDeleted in: query required: false description: Include deleted quotes. schema: type: boolean responses: '200': description: An array of quotes. /Quotes/{id}: get: tags: [Quotes] summary: Get one quote by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single quote with totals, customer, and locations. /Products: get: tags: [Products] summary: List products responses: '200': description: An array of products. put: tags: [Products] summary: Update a product responses: '200': description: The updated product. post: tags: [Products] summary: Create a product responses: '201': description: The created product. /Products/search: get: tags: [Products] summary: Search products parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of products. /Products/prices: put: tags: [Products] summary: Bulk update product prices responses: '200': description: Prices updated. /Products/{id}: get: tags: [Products] summary: Get one product by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single product. delete: tags: [Products] summary: Delete a product parameters: - $ref: '#/components/parameters/IdPath' responses: '204': description: Deleted. /ProductCategories: get: tags: [Products] summary: List product categories responses: '200': description: An array of product categories. put: tags: [Products] summary: Update a product category responses: '200': description: The updated product category. post: tags: [Products] summary: Create a product category responses: '201': description: The created product category. /ProductCategories/search: get: tags: [Products] summary: Search product categories parameters: - $ref: '#/components/parameters/Sorts' - $ref: '#/components/parameters/Filters' - $ref: '#/components/parameters/Page' - $ref: '#/components/parameters/PageSize' responses: '200': description: A filtered, sorted, paginated page of product categories. /ProductCategories/{id}: get: tags: [Products] summary: Get one product category by ID parameters: - $ref: '#/components/parameters/IdPath' responses: '200': description: A single product category. delete: tags: [Products] summary: Delete a product category parameters: - $ref: '#/components/parameters/IdPath' responses: '204': description: Deleted. /Users: get: tags: [Users] summary: List users description: Retrieves all users - owners, admins, and technicians. responses: '200': description: An array of users. components: securitySchemes: skimmerApiKey: type: apiKey in: header name: skimmer-api-key description: Per-account Skimmer Public API key, issued via sales-led onboarding. parameters: IdPath: name: id in: path required: true description: Resource identifier. schema: type: string Sorts: name: sorts in: query required: false description: >- Comma-delimited sort fields; prefix a field with '-' for descending (e.g. -CreatedAt). Sieve-style. schema: type: string Filters: name: filters in: query required: false description: >- Sieve-style filter expression using operators such as ==, !=, >, <, >=, <=, @= (contains), _= (starts with), _-= (ends with), and their case-insensitive (*) and negated (!) variants. Combine with commas (e.g. BillingState==TX,BillingCity==Houston). schema: type: string Page: name: page in: query required: false description: 1-based page number. schema: type: integer minimum: 1 PageSize: name: pageSize in: query required: false description: Number of results per page. schema: type: integer minimum: 1