openapi: 3.0.3 info: title: Easy!Appointments API version: 1.0.0 description: These are the OpenAPI specs that describe the REST API of Easy!Appointments. termsOfService: https://easyappointments.org/terms-and-conditions contact: name: Easy!Appointments url: https://easyappointments.org email: info@easyappointments.org license: name: GPL-3.0 url: https://www.gnu.org/licenses/gpl-3.0.en.html externalDocs: description: Find out more about Easy!Appointments url: https://easyappointments.org/docs.html servers: - url: https://demo.easyappointments.org/index.php/api/v1/ - url: http://localhost/index.php/api/v1/ tags: - name: admins - name: appointments - name: availabilities - name: customers - name: providers - name: secretaries - name: service_categories - name: services - name: settings - name: unavailabilities - name: webhooks paths: /availabilities: get: tags: - availabilities summary: Gets availability parameters: - name: providerId in: query schema: type: integer - name: serviceId in: query schema: type: integer - name: date in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Availabilities' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /appointments: get: tags: - appointments summary: Get all appointments parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string - name: aggregates in: query schema: type: string deprecated: true - name: date in: query schema: type: string - name: from in: query schema: type: string - name: till in: query schema: type: string - name: serviceId in: query schema: type: integer - name: providerId in: query schema: type: integer - name: customerId in: query schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppointmentCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - appointments summary: Create an appointment requestBody: content: application/json: schema: $ref: '#/components/schemas/AppointmentPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/AppointmentRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /appointments/{appointmentId}: get: tags: - appointments summary: Get an appointment parameters: - name: appointmentId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppointmentRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - appointments summary: Update an appointment parameters: - name: appointmentId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/AppointmentPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AppointmentRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - appointments summary: Delete an appointment parameters: - name: appointmentId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /unavailabilities: get: tags: - unavailabilities summary: Get all unavailabilities parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UnavailabilityCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' post: tags: - unavailabilities summary: Create an unavailability requestBody: content: application/json: schema: $ref: '#/components/schemas/UnavailabilityPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/UnavailabilityRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /unavailabilities/{unavailabilityId}: get: tags: - unavailabilities summary: Get an unavailability parameters: - name: unavailabilityId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UnavailabilityRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - unavailabilities summary: Update an unavailability parameters: - name: unavailabilityId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/UnavailabilityPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/UnavailabilityRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - unavailabilities summary: Delete an unavailability parameters: - name: unavailabilityId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /customers: get: tags: - customers summary: Get all customers parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CustomerCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - customers summary: Create a customer requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomerPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/CustomerRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] x-codegen-request-body-name: body /customers/{customerId}: get: tags: - customers summary: Get a customer parameters: - name: customerId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CustomerRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - customers summary: Update a customer parameters: - name: customerId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomerPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/CustomerRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - customers summary: Delete a customer parameters: - name: customerId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /services: get: tags: - services summary: Get all services parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ServiceCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - services summary: Create a service requestBody: content: application/json: schema: $ref: '#/components/schemas/ServicePayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/ServiceRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /services/{serviceId}: get: tags: - services summary: Get a service parameters: - name: serviceId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ServiceRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - services summary: Update a service parameters: - name: serviceId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/ServicePayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ServiceRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - services summary: Delete a service parameters: - name: serviceId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /service_categories: get: tags: - service_categories summary: Get all service-categories parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ServiceCategoryCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - service_categories summary: Create a service-category requestBody: content: application/json: schema: $ref: '#/components/schemas/ServiceCategoryPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/ServiceCategoryRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /service_categories/{serviceCategoryId}: get: tags: - service_categories summary: Get a service-category parameters: - name: serviceCategoryId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ServiceCategoryRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - service_categories summary: Update a service-category parameters: - name: serviceCategoryId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/ServiceCategoryPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ServiceCategoryRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - service_categories summary: Delete a service-category parameters: - name: serviceCategoryId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /admins: get: tags: - admins summary: Get all admins parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AdminCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - admins summary: Create an admin requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/AdminRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /admins/{adminId}: get: tags: - admins summary: Get an admin parameters: - name: adminId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AdminRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - admins summary: Update an admin parameters: - name: adminId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/AdminRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - admins summary: Delete an admin parameters: - name: adminId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /providers: get: tags: - providers summary: Get all providers parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProviderCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - providers summary: Create a provider requestBody: content: application/json: schema: $ref: '#/components/schemas/ProviderPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/ProviderRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /providers/{providerId}: get: tags: - providers summary: Get a provider parameters: - name: providerId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProviderRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - providers summary: Update a provider parameters: - name: providerId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/ProviderPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/ProviderRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - providers summary: Delete a provider parameters: - name: providerId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /secretaries: get: tags: - secretaries summary: Get all secretaries parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SecretaryCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - secretaries summary: Create a secretary requestBody: content: application/json: schema: $ref: '#/components/schemas/SecretaryPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/SecretaryRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /secretaries/{secretaryId}: get: tags: - secretaries summary: Get a secretary parameters: - name: secretaryId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SecretaryRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - secretaries summary: Update a secretary parameters: - name: secretaryId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/SecretaryPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SecretaryRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - secretaries summary: Delete a secretary parameters: - name: secretaryId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found security: - BearerToken: [ ] - BasicAuth: [ ] /settings: get: tags: - settings summary: Get all settings parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SettingCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] /settings/{settingName}: get: tags: - settings summary: Get a setting parameters: - name: settingName in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SettingRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - settings summary: Update a setting parameters: - name: settingName in: path required: true schema: type: string requestBody: content: application/json: schema: $ref: '#/components/schemas/SettingPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/SettingRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /webhooks: get: tags: - webhooks summary: Get all webhooks parameters: - name: page in: query schema: type: integer - name: length in: query schema: type: integer - name: sort in: query schema: type: string - name: q in: query schema: type: string - name: fields in: query schema: type: string - name: with in: query schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WebhookCollection' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] post: tags: - webhooks summary: Create a webhook requestBody: content: application/json: schema: $ref: '#/components/schemas/WebhookPayload' required: true responses: '201': description: Created content: application/json: schema: $ref: '#/components/schemas/WebhookRecord' '401': description: Unauthorized '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] /webhooks/{webhookId}: get: tags: - webhooks summary: Get a webhook parameters: - name: webhookId in: path required: true schema: type: integer responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WebhookRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] put: tags: - webhooks summary: Update a webhook parameters: - name: webhookId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/WebhookPayload' required: true responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/WebhookRecord' '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' x-codegen-request-body-name: body security: - BearerToken: [ ] - BasicAuth: [ ] delete: tags: - webhooks summary: Delete a webhook parameters: - name: webhookId in: path required: true schema: type: integer responses: '204': description: No Content '401': description: Unauthorized '404': description: Not Found '500': description: Internal Server Error content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' security: - BearerToken: [ ] - BasicAuth: [ ] components: schemas: Availabilities: type: array items: type: string AppointmentRecord: type: object properties: id: type: integer book: type: string start: type: string end: type: string hash: type: string location: type: string color: type: string status: type: string notes: type: string customerId: type: integer providerId: type: integer serviceId: type: integer googleCalendarId: type: string example: id: 1 book: '2021-01-01 12:00:00' start: '2021-01-01 17:00:00' end: '2021-01-01 18:00:00' hash: apTWVbSvBJXR location: Test Street 1A, 12345 Some State, Some Place color: '#123456' status: Booked notes: This is a test appointment. customerId: 5 providerId: 2 serviceId: 6 googleCalendarId: null AppointmentPayload: type: object properties: start: type: string end: type: string location: type: string color: type: string status: type: string notes: type: string customerId: type: integer providerId: type: integer serviceId: type: integer example: start: '2021-01-01 17:00:00' end: '2021-01-01 18:00:00' location: Test Street 1A, 12345 Some State, Some Place color: '#123456' status: Booked notes: This is a test appointment. customerId: 5 providerId: 2 serviceId: 6 AppointmentCollection: type: array items: $ref: '#/components/schemas/AppointmentRecord' UnavailabilityRecord: type: object properties: id: type: integer book: type: string start: type: string end: type: string hash: type: string location: type: string notes: type: string providerId: type: integer googleCalendarId: type: integer example: id: 1 book: '2021-01-01 12:00:00' start: '2021-01-01 17:00:00' end: '2021-01-01 18:00:00' hash: apTWVbSvBJXR location: Test Street 1A, 12345 Some State, Some Place notes: This is a test unavailability. providerId: 2 googleCalendarId: null UnavailabilityPayload: type: object properties: start: type: string end: type: string location: type: string notes: type: string providerId: type: integer example: start: '2021-01-01 17:00:00' end: '2021-01-01 18:00:00' location: Test Street 1A, 12345 Some State, Some Place notes: This is a test appointment. providerId: 2 UnavailabilityCollection: type: array items: $ref: '#/components/schemas/UnavailabilityRecord' CustomerRecord: type: object properties: id: type: integer firstName: type: string lastName: type: string email: type: string phone: type: string address: type: string city: type: string zip: type: string timezone: type: string language: type: string customField1: type: string customField2: type: string customField3: type: string customField4: type: string customField5: type: string notes: type: string example: id: 1 firstName: Steve lastName: Doe email: steve@example.org phone: Test Street 1A city: Some Place zip: '12345' timezone: UTC language: english customField1: Value1 customField2: Value2 customField3: Value3 customField4: Value4 customField5: Value5 notes: This is a test customer. CustomerPayload: type: object properties: firstName: type: string lastName: type: string email: type: string phone: type: string address: type: string city: type: string zip: type: string timezone: type: string language: type: string customField1: type: string customField2: type: string customField3: type: string customField4: type: string customField5: type: string notes: type: string example: firstName: Steve lastName: Doe email: steve@example.org phone: Test Street 1A city: Some Place zip: '12345' timezone: UTC language: english customField1: Value1 customField2: Value2 customField3: Value3 customField4: Value4 customField5: Value5 notes: This is a test customer. CustomerCollection: type: array items: $ref: '#/components/schemas/CustomerRecord' ServiceRecord: type: object properties: id: type: integer name: type: string duration: type: integer price: type: number format: float currency: type: string location: type: string description: type: string availabilitiesType: type: string attendantsNumber: type: integer categoryId: type: integer example: id: 1 name: Test Service duration: 30 price: 10 currency: USD location: Test Street 1A, 12345 Some State, Some Place description: This is a test service. availabilitiesType: flexible attendantsNumber: 1 serviceCategoryId: null ServicePayload: type: object properties: name: type: string duration: type: integer price: type: number currency: type: string location: type: string description: type: string availabilitiesType: type: string attendantsNumber: type: integer serviceCategoryId: type: integer example: name: Test Service duration: 30 price: 10 currency: USD location: Test Street 1A, 12345 Some State, Some Place description: This is a test service. availabilitiesType: flexible attendantsNumber: 1 serviceCategoryId: null ServiceCollection: type: array items: $ref: '#/components/schemas/ServiceRecord' ServiceCategoryRecord: type: object properties: id: type: integer name: type: string description: type: string example: id: 1 name: Test Category description: This is a test category. ServiceCategoryPayload: type: object properties: name: type: string description: type: string example: name: Test Category description: This is a test category. ServiceCategoryCollection: type: array items: $ref: '#/components/schemas/ServiceCategoryRecord' AdminRecord: type: object properties: id: type: integer firstName: type: string lastName: type: string email: type: string mobile: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string timezone: type: string settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: id: 1 firstName: Jason lastName: Doe email: jason@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test admin. timezone: UTC settings: username: jasondoe password: Password@123 notifications: true calendarView: default AdminPayload: type: object properties: firstName: type: string lastName: type: string email: type: string mobile: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string timezone: type: string language: type: string settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: firstName: Jason lastName: Doe email: jason@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test admin. timezone: UTC language: english settings: username: jasondoe password: Password@123 notifications: true calendarView: default AdminCollection: type: array items: $ref: '#/components/schemas/AdminRecord' ProviderRecord: type: object properties: id: type: integer firstName: type: string lastName: type: string email: type: string mobile: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string timezone: type: string language: type: string services: type: array items: type: integer settings: type: object properties: username: type: string password: type: string notifications: type: boolean calendarView: type: string googleSync: type: boolean googleCalendar: type: string googleToken: type: string syncFutureDays: type: string syncPastDays: type: string workingPlan: type: string example: id: 1 firstName: Chris lastName: Doe email: chris@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test provider. timezone: UTC language: english services: [ ] settings: username: chrisdoe password: Password@123 notifications: true calendarView: default googleSync: false googleCalendar: null googleToken: null syncFutureDays: 90 syncPastDays: 30 workingPlan: sunday: null monday: start: '09:00' end: '17:00' breaks: [ ] tuesday: start: '09:00' end: '17:00' breaks: [ ] wednesday: start: '09:00' end: '17:00' breaks: [ ] thursday: start: '09:00' end: '17:00' breaks: [ ] friday: start: '09:00' end: '17:00' breaks: [ ] saturday: null ProviderPayload: type: object properties: firstName: type: string lastName: type: string email: type: string mobile: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string timezone: type: string language: type: string services: type: array items: type: integer settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string googleSync: type: boolean googleCalendar: type: string googleToken: type: string syncFutureDays: type: string syncPastDays: type: string workingPlan: type: string example: firstName: Chris lastName: Doe email: chris@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test provider. timezone: UTC language: english services: [ ] settings: username: chrisdoe password: Password@123 notifications: true calendarView: default googleSync: false googleCalendar: null googleToken: null syncFutureDays: 90 syncPastDays: 30 workingPlan: sunday: null monday: start: '09:00' end: '17:00' breaks: [ ] tuesday: start: '09:00' end: '17:00' breaks: [ ] wednesday: start: '09:00' end: '17:00' breaks: [ ] thursday: start: '09:00' end: '17:00' breaks: [ ] friday: start: '09:00' end: '17:00' breaks: [ ] saturday: null ProviderCollection: type: array items: $ref: '#/components/schemas/ProviderRecord' SecretaryRecord: type: object properties: id: type: integer firstName: type: string lastName: type: string email: type: string mobile: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string timezone: type: string language: type: string providers: type: array items: type: integer settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: id: 1 firstName: Jessy lastName: Doe email: jessy@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test service. timezone: UTC language: english providers: [ ] settings: username: jessydoe password: Password@123 notifications: true calendarView: default SecretaryPayload: type: object properties: firstName: type: string lastName: type: string email: type: string mobile: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string timezone: type: string language: type: string providers: type: array items: type: integer settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: firstName: Jessy lastName: Doe email: jessy@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test service. timezone: UTC language: english providers: [ ] settings: username: jessydoe password: Password@123 notifications: true calendarView: default SecretaryCollection: type: array items: $ref: '#/components/schemas/SecretaryRecord' SettingRecord: type: object properties: name: type: string value: type: string example: name: company_name value: ACME Inc SettingPayload: type: object properties: value: type: string example: value: ACME Inc SettingCollection: type: array items: $ref: '#/components/schemas/SettingRecord' WebhookRecord: type: object properties: id: type: integer name: type: string url: type: string actions: type: string secretToken: type: string isSslVerified: type: boolean notes: type: string example: id: 1 name: Test Webhook url: https://example.org/webhook?withTestQueryParam=Value actions: appointment_create,appointment_update,customer_delete,category_create secretToken: SecureSecretTokenHere isSslVerified: true notes: This is a webhook. WebhookPayload: type: object properties: name: type: string url: type: string actions: type: string secretToken: type: string isSslVerified: type: boolean notes: type: string example: name: Test Webhook url: https://example.org/webhook?withTestQueryParam=Value actions: appointment_create,appointment_update,customer_delete,category_create secretToken: SecureSecretTokenHere isSslVerified: true notes: This is a webhook. WebhookCollection: type: array items: $ref: '#/components/schemas/WebhookRecord' ErrorResponse: type: object properties: success: type: boolean message: type: string example: success: false message: Test error message with debug info. securitySchemes: BearerToken: type: http scheme: bearer description: >- You can generate the API key from the settings page to authorize with Bearer Token. BasicAuth: type: http scheme: basic description: >- You can use the credentials of an admin user to authorize with Basic Auth.