openapi: 3.0.3 info: title: TutorCruncher Agents Services API description: 'REST API for TutorCruncher, tutoring business management software for agencies, companies, and independent tutors. The API exposes the core domain - clients, recipients (students), contractors (tutors), agents, services (jobs), appointments (lessons), invoices, payment orders, proforma invoices, ad hoc charges, and reference data - plus HTTP webhooks for event notifications. Base URL: https://app.tutorcruncher.com/api/. Authentication uses a private API key (found under Integrations) sent in the Authorization header as `token `. All list endpoints are paginated with up to 100 objects per page and return `count`, `next`, `previous`, and `results`. Requests are rate limited to 100 per minute. This document targets API v2 (v1 was deprecated 2025-07-03); in v2, users are updated by ID (for example `POST /api/clients/{id}/`) rather than by email. Note: TutorCruncher''s "Socket" is a JavaScript embed (https://cdn.tutorcruncher.com/socket/latest/socket.js) for publishing public tutor and lesson listings on a website; it is not a WebSocket API and is not modeled here. Event delivery is via HTTP webhooks.' version: '2.0' contact: name: TutorCruncher url: https://tutorcruncher.com license: name: API documentation - TutorCruncher Terms url: https://tutorcruncher.com/terms-and-conditions servers: - url: https://app.tutorcruncher.com/api description: TutorCruncher API security: - tokenAuth: [] tags: - name: Services description: Services (jobs) tying recipients and contractors together. paths: /services/: get: operationId: listServices tags: - Services summary: List services (jobs) parameters: - $ref: '#/components/parameters/Page' responses: '200': description: Paginated list of services. content: application/json: schema: $ref: '#/components/schemas/PaginatedList' post: operationId: createService tags: - Services summary: Create a service requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/Service' responses: '201': description: Service created. /services/{id}/: parameters: - $ref: '#/components/parameters/Id' get: operationId: getService tags: - Services summary: Retrieve a service responses: '200': description: A service. content: application/json: schema: $ref: '#/components/schemas/Service' post: operationId: updateService tags: - Services summary: Update a service responses: '200': description: Service updated. delete: operationId: deleteService tags: - Services summary: Delete a service responses: '204': description: Service deleted. /services/{id}/add-contractor/: parameters: - $ref: '#/components/parameters/Id' post: operationId: addServiceContractor tags: - Services summary: Add a contractor to a service responses: '200': description: Contractor added. /services/{id}/remove-contractor/: parameters: - $ref: '#/components/parameters/Id' post: operationId: removeServiceContractor tags: - Services summary: Remove a contractor from a service responses: '200': description: Contractor removed. /services/{id}/add-recipient/: parameters: - $ref: '#/components/parameters/Id' post: operationId: addServiceRecipient tags: - Services summary: Add a recipient to a service responses: '200': description: Recipient added. /services/{id}/remove-recipient/: parameters: - $ref: '#/components/parameters/Id' post: operationId: removeServiceRecipient tags: - Services summary: Remove a recipient from a service responses: '200': description: Recipient removed. components: schemas: PaginatedList: type: object properties: count: type: integer next: type: string nullable: true previous: type: string nullable: true results: type: array items: type: object Service: type: object properties: id: type: integer name: type: string status: type: string dft_charge_type: type: string dft_charge_rate: type: string subject: type: integer nullable: true parameters: Id: name: id in: path required: true description: The object ID. schema: type: integer Page: name: page in: query required: false description: Page number for paginated results (100 objects per page). schema: type: integer securitySchemes: tokenAuth: type: apiKey in: header name: Authorization description: 'Private API key sent as: Authorization: token '