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/ tags: - name: admins - name: providers - name: secretaries - name: customers - name: availabilities - name: unavailabilities - name: appointments - name: services - name: categories - name: settings 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: success content: application/json: schema: $ref: '#/components/schemas/Availabilities' 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: aggregates in: query schema: type: string responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/AppointmentCollection' security: - BearerToken: [] - BasicAuth: [] post: tags: - appointments summary: Create an appointment requestBody: content: application/json: schema: $ref: '#/components/schemas/AppointmentPayload' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/AppointmentEntry' 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: success content: application/json: schema: $ref: '#/components/schemas/AppointmentEntry' 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: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/AppointmentEntry' 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: success '404': description: not found 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 responses: '200': description: success content: application/json: schema: type: object post: tags: - unavailabilities summary: Create an unavailability requestBody: content: application/json: schema: $ref: '#/components/schemas/UnavailabilityCreate' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Unavailability' 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: success content: application/json: schema: $ref: '#/components/schemas/Unavailability' 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/UnavailabilityUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Unavailability' 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: success '404': description: not found content: {} 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 responses: '200': description: success content: application/json: schema: type: object security: - BearerToken: [] - BasicAuth: [] post: tags: - customers summary: Create a customer requestBody: content: application/json: schema: $ref: '#/components/schemas/CustomerCreate' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Customer' 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: success content: application/json: schema: $ref: '#/components/schemas/Customer' 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/CustomerUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Customer' 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: success '404': description: not found content: {} 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 responses: '200': description: success content: application/json: schema: type: object security: - BearerToken: [] - BasicAuth: [] post: tags: - services summary: Create a service requestBody: content: application/json: schema: $ref: '#/components/schemas/ServiceCreate' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Service' 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: success content: application/json: schema: $ref: '#/components/schemas/Service' 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/ServiceUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Service' 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: success '404': description: not found content: {} security: - BearerToken: [] - BasicAuth: [] /categories: get: tags: - categories summary: Get all 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 responses: '200': description: success content: application/json: schema: type: object security: - BearerToken: [] - BasicAuth: [] post: tags: - categories summary: Create a category requestBody: content: application/json: schema: $ref: '#/components/schemas/CategoryCreate' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Category' x-codegen-request-body-name: body security: - BearerToken: [] - BasicAuth: [] /categories/{categoryId}: get: tags: - categories summary: Get a category parameters: - name: categoryId in: path required: true schema: type: integer responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Category' security: - BearerToken: [] - BasicAuth: [] put: tags: - categories summary: Update a category parameters: - name: categoryId in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/CategoryUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Category' x-codegen-request-body-name: body security: - BearerToken: [] - BasicAuth: [] delete: tags: - categories summary: Delete a category parameters: - name: categoryId in: path required: true schema: type: integer responses: '204': description: success '404': description: not found content: {} 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 responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/AdminAll' security: - BearerToken: [] - BasicAuth: [] post: tags: - admins summary: Create an admin requestBody: content: application/json: schema: $ref: '#/components/schemas/AdminCreate' required: true responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Admin' 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: success content: application/json: schema: $ref: '#/components/schemas/Admin' 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/AdminUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Admin' 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: success '404': description: Not Found 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 responses: '200': description: success content: application/json: schema: type: object security: - BearerToken: [] - BasicAuth: [] post: tags: - providers summary: Create a provider requestBody: content: application/json: schema: $ref: '#/components/schemas/ProviderCreate' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Provider' 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: success content: application/json: schema: $ref: '#/components/schemas/Provider' 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/ProviderUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Provider' 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: success '404': description: not found content: {} 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 responses: '200': description: success content: application/json: schema: type: object security: - BearerToken: [] - BasicAuth: [] post: tags: - secretaries summary: Create a secretary requestBody: content: application/json: schema: $ref: '#/components/schemas/SecretaryCreate' required: false responses: '201': description: success content: application/json: schema: $ref: '#/components/schemas/Secretary' 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: success content: application/json: schema: $ref: '#/components/schemas/Secretary' 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/SecretaryUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Secretary' 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: success '404': description: not found content: {} 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 responses: '200': description: success content: application/json: schema: type: object 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: success content: application/json: schema: $ref: '#/components/schemas/Setting' security: - BearerToken: [] - BasicAuth: [] put: tags: - settings summary: Update a setting parameters: - name: settingName in: path required: true schema: type: integer requestBody: content: application/json: schema: $ref: '#/components/schemas/SettingUpdate' required: false responses: '200': description: success content: application/json: schema: $ref: '#/components/schemas/Setting' x-codegen-request-body-name: body security: - BearerToken: [] - BasicAuth: [] components: schemas: Availabilities: type: array items: type: string Appointment: type: object properties: id: type: integer book: type: string start: type: string end: type: string hash: type: string location: 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 notes: This is an appointment. customerId: 5 providerId: 2 serviceId: 6 googleCalendarId: null AppointmentCreate: type: object properties: start: type: string end: type: string location: 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 notes: This is an appointment. customerId: 5 providerId: 2 serviceId: 6 AppointmentUpdate: type: object properties: id: type: integer book: type: string start: type: string end: type: string hash: type: string location: type: string status: type: string notes: type: string customerId: type: integer providerId: type: integer serviceId: type: integer googleCalendarId: type: string example: start: '2021-01-01 17:00:00' end: '2021-01-01 18:00:00' location: Test Street 1A notes: This is an appointment. customerId: 5 providerId: 2 serviceId: 6 Unavailability: type: object properties: id: type: integer book: type: string start: type: string end: type: string notes: type: string providerId: type: integer example: id: 1 book: '2021-01-01 12:00:00' start: '2021-01-01 17:00:00' end: '2021-01-01 17:00:00' notes: This is an unavailability. providerId: 2 UnavailabilityCreate: type: object properties: start: type: string end: type: string notes: type: string providerId: type: integer example: start: '2021-01-01 17:00:00' end: '2021-01-01 17:00:00' notes: This is an unavailability. providerId: 2 UnavailabilityUpdate: type: object properties: start: type: string end: type: string notes: type: string providerId: type: integer example: start: '2021-01-01 17:00:00' end: '2021-01-01 17:00:00' notes: This is an unavailability. providerId: 2 Customer: 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 notes: type: string example: id: 1 firstName: John lastName: Doe email: john@example.org phone: Test Street 1A city: Some Place zip: '12345' notes: This is a customer CustomerCreate: type: object properties: firstName: type: string lastName: type: string email: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string example: firstName: John lastName: Doe email: john@example.org phone: Test Street 1A city: Some Place zip: '12345' notes: This is a customer CustomerUpdate: type: object properties: firstName: type: string lastName: type: string email: type: string phone: type: string address: type: string city: type: string zip: type: string notes: type: string example: firstName: John lastName: Doe email: john@example.org phone: Test Street 1A city: Some Place zip: '12345' notes: This is a customer Service: type: object properties: id: type: integer name: type: string duration: type: integer price: type: number format: float currency: 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 description: This is a test service. availabilitiesType: Flexible attendantsNumber: 1 categoryId: null ServiceCreate: type: object properties: name: type: string duration: type: integer price: type: number currency: type: string description: type: string availabilitiesType: type: string attendantsNumber: type: integer categoryId: type: integer example: name: Test Service duration: 30 price: 10 currency: USD description: This is a test service. availabilitiesType: Flexible attendantsNumber: 1 categoryId: null ServiceUpdate: type: object properties: name: type: string duration: type: integer price: type: number currency: type: string description: type: string availabilitiesType: type: string attendantsNumber: type: integer categoryId: type: integer example: name: Test Service duration: 30 price: 10 currency: USD description: This is a test service. availabilitiesType: Flexible attendantsNumber: 1 categoryId: null Category: type: object properties: id: type: integer name: type: string description: type: string example: id: 1 name: Test Category description: This is a test category. CategoryCreate: type: object properties: name: type: string description: type: string example: name: Test Category description: This is a test category. CategoryUpdate: type: object properties: name: type: string description: type: string example: name: Test Category description: This is a test category. Admin: 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: John lastName: Doe email: john@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: johndoe password: johndoe notifications: true calendarView: default AdminCreate: 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 settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: firstName: John lastName: Doe email: john@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: johndoe password: johndoe notifications: true calendarView: default AdminUpdate: 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 settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: firstName: John lastName: Doe email: john@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: johndoe password: johndoe notifications: true calendarView: default AdminAll: type: array items: $ref: '#/components/schemas/Admin' Provider: 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 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: John lastName: Doe email: john@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test provider. timezone: UTC settings: username: johndoe password: johndoe 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 ProviderCreate: 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 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: John lastName: Doe email: john@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test provider. timezone: UTC settings: username: johndoe password: johndoe 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 ProviderUpdate: 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 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: John lastName: Doe email: john@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test provider. timezone: UTC settings: username: johndoe password: johndoe 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 Secretary: 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 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: John lastName: Doe email: john@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test service. timezone: UTC settings: username: johndoe password: johndoe notifications: true calendarView: default SecretaryCreate: 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 settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: firstName: John lastName: Doe email: john@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test service. timezone: UTC settings: username: johndoe password: johndoe notifications: true calendarView: default SecretaryUpdate: 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 settings: type: object properties: username: type: string password: type: string format: password notifications: type: boolean calendarView: type: string example: firstName: John lastName: Doe email: john@example.org mobile: '+10000000000' phone: '+10000000000' address: Test Street 1A city: Some Place zip: '12345' notes: This is a test service. timezone: UTC settings: username: johndoe password: johndoe notifications: true calendarView: default Setting: type: object properties: name: type: string value: type: string example: name: company_name value: ACME Inc SettingUpdate: type: object properties: value: type: string example: value: ACME Inc 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.