openapi: 3.0.1 info: title: Gladly Agents Business Hours API version: '1.0' description: '# Introducing the Gladly API At Gladly, we believe that customer service is best when it''s a conversation. That means more than just helping customers with one-off questions or issues: it''s about making them feel known, valued, and respected for the individuals they are. The Gladly API was built to help facilitate those relationships, providing agents with the rich customer context they need to deliver seamless experiences that make customers feel like they''re more than just a number in a sea of others. # Overview You can integrate easily with Gladly by calling Gladly''s [REST API](#section/Overview/REST-API) and implementing the [Lookup API](#section/Overview/Lookup-API) to provide data from your own services. Some examples of what you do through Gladly APIs include managing customer profile data, interacting with a customer''s timeline, providing the latest information about a customer''s orders, and more. ## REST API Clients can access the **REST API** via HTTPS at your organization''s Gladly domain (e.g. `https://{organization}.gladly.com`). Resources follow REST semantics and utilize industry-standard HTTP verbs, response codes, and authentication schemes. In addition, all responses and payloads are in JSON with consistent error codes and formats. ## Lookup API The Gladly **Lookup API** allows your organization to provide data services to power the agent''s experience with a complete view of your customers'' information, transactions, and activity. You can provide a web service that implements the Lookup API and Gladly will call it when that data is needed. Like the REST API, the Lookup API is specified using REST semantics, and exchanges JSON requests and responses authenticated and signed with secure keys. Gladly will perform lookups when certain activities occur within Gladly, such as when a customer''s profile is loaded. A detailed overview of Lookup Adaptor architecture, requests, resposnes and more can be found [here](https://help.gladly.com/developer/docs/lookup-adapter-introduction). ## Testing Test the myriad possibilities of the Gladly API in a safe, secure space. We''ll enable the Gladly API in a separate sandbox environment, so you can experiment freely without impacting your production environment (or vice versa). Your sandbox environment is accessible at `https://{organization}.gladly.qa`, where `organization` is your company name. For specific API endpoints, see documentation below. # Getting Started Think of this section as getting the keys to unlocking your access to the Gladly APIs. First, you''ll need to set up an account with the necessary API [permissions](#/section/Getting-Started/Permissions). With these permissions, you can then go on to create the [API Token(s)](#section/Getting-Started/Creating-API-Tokens) you need to access Gladly''s API [resources](#section/Overview/Resources). ## Permissions Gladly Administrators can set API permissions on an agent-by-agent basis. We''ll discuss how this maps to API access in the section on [authentication](#section/Authentication) below. To allow a user to create API tokens and access the API: 1. Log in to your Gladly instance. 2. Open the menu on the top left-hand corner of the page. 3. Navigate to **Settings** > **Users* 4. Search and click the user profile you wish to give access to. 5. You''ll see a permission called **API User**. Select it, while making sure to keep the user''s **Agent** role intact. 6. Hit **Save** to give access. ![Agent profile screen](assets/permissions-agent.png) We recommend creating a dedicated user to make API calls, whose account won''t be used for agent and organization management. This will help you with any future audits of API activity vs. agent activity. ## Creating API Tokens You must create an API token to access Gladly API resources (see above [Permissions](#/section/Getting-Started/Permissions)). If your profile already has access to the **API User** permission, you''ll see a menu item titled **More settings**. Click **More settings**: ![API Token Menu](assets/permissions-token-nav.png) Click **API Tokens**, then the **Create Token** button on the upper right-hand corner of the page: ![API Token Add](assets/permissions-token-add.png) A token will be generated and named, by default, **New Token** (though depending on whether you have existing tokens, it may be named New Token 2, or New Token 3, etc.). You can rename the token to something more easily referenceable by clicking the name to edit. This token will be associated with your agent profile, which we refer to as the API User in this document. ![API Token View](assets/permissions-token-view.png) For security purposes, you''ll only see a new token once before you navigate away from the page. ## Replacing/Rotating API Tokens Should you lose this token, or wish to rotate your application keys, you can do the following: 1. Generate a new token. 2. Store the new token in a secure location. 3. Delete the old token. 4. Update your applications/scripts with the new token. # Authentication ' servers: - url: https://{organization}.gladly.com/api/v1 description: Production variables: organization: default: organization description: Your Gladly organization subdomain - url: https://{organization}.gladly.qa/api/v1 description: Sandbox variables: organization: default: organization description: Your Gladly QA organization subdomain security: - basicAuth: [] tags: - name: Business Hours description: '**Business Hours** define the operating schedule for your organization. They determine when your organization is available to handle customer communications and can be used to control routing, auto-responses, and other time-sensitive workflows. Business hours configurations include: - **Schedule blocks** for each day of the week specifying start and end times - **Timezone** in IANA format (e.g., America/Los_Angeles) - **Exceptions** for holidays or special dates One business hours configuration is marked as **primary** and serves as the default schedule for your organization. The primary business hours cannot be deleted. ' paths: /api/v1/business-hours: get: tags: - Business Hours summary: List Business Hours description: 'Returns a list of all business hours configurations for your organization. ' operationId: getBusinessHours responses: '200': description: Business hours content: application/json: schema: title: BusinessHoursList type: array items: $ref: '#/paths/~1api~1v1~1business-hours/post/responses/201/content/application~1json/schema' example: - id: bh_WmeA3Y51Q5ayCAaZ1AotIA version: 1 createdAt: '2024-01-15T09:00:00Z' updatedAt: '2024-01-15T09:00:00Z' name: Default Hours primary: true officeHours: timezone: America/Los_Angeles monday: - start: 09:00 stop: '17:00' tuesday: - start: 09:00 stop: '17:00' wednesday: - start: 09:00 stop: '17:00' thursday: - start: 09:00 stop: '17:00' friday: - start: 09:00 stop: '17:00' post: tags: - Business Hours summary: Create Business Hours description: 'Creates a new business hours configuration for your organization. ' operationId: createBusinessHours requestBody: required: true description: Business hours configuration to create content: application/json: schema: title: BusinessHoursCreateRequest type: object required: - name - officeHours properties: name: type: string description: Name of the business hours configuration (max 200 characters) example: Default Hours primary: type: boolean description: Whether this should be the primary business hours configuration default: false example: false officeHours: title: OfficeHours type: object required: - timezone properties: timezone: type: string description: IANA timezone identifier (e.g., America/Los_Angeles) example: America/Los_Angeles monday: type: array description: Schedule blocks for Monday items: title: ScheduleBlock type: object required: - start - stop properties: start: type: string description: Start time in HH:MM format (24-hour) pattern: ^([01]?[0-9]|2[0-3]):[0-5][0-9]$ example: 09:00 stop: type: string description: End time in HH:MM format (24-hour) pattern: ^([01]?[0-9]|2[0-3]):[0-5][0-9]$ example: '17:00' tuesday: type: array description: Schedule blocks for Tuesday items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' wednesday: type: array description: Schedule blocks for Wednesday items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' thursday: type: array description: Schedule blocks for Thursday items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' friday: type: array description: Schedule blocks for Friday items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' saturday: type: array description: Schedule blocks for Saturday items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' sunday: type: array description: Schedule blocks for Sunday items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' exceptions: type: array description: Schedule exceptions (e.g., holidays) items: title: ScheduleException type: object required: - name - start - stop properties: name: type: string description: Name of the exception (e.g., 'New Year's Day') example: New Year's Day start: type: string format: date-time description: Start datetime of the exception example: '2024-01-01T00:00:00Z' stop: type: string format: date-time description: End datetime of the exception example: '2024-01-02T00:00:00Z' scheduleBlocks: type: array description: Optional schedule blocks during the exception period (empty for closed) items: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours/properties/monday/items' example: name: Weekend Support primary: false officeHours: timezone: America/Los_Angeles saturday: - start: '10:00' stop: '16:00' sunday: - start: '10:00' stop: '16:00' responses: '201': description: Business hours created content: application/json: schema: title: BusinessHours type: object properties: id: type: string description: Unique identifier for the business hours configuration example: bh_WmeA3Y51Q5ayCAaZ1AotIA version: type: integer description: Version number for optimistic concurrency control example: 1 createdAt: type: string format: date-time description: Timestamp when the business hours were created example: '2024-01-15T09:00:00Z' updatedAt: type: string format: date-time description: Timestamp when the business hours were last updated example: '2024-01-15T09:00:00Z' name: type: string description: Name of the business hours configuration example: Default Hours primary: type: boolean description: Whether this is the primary business hours configuration example: true officeHours: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours' '400': description: Validation error content: application/json: schema: $ref: '#/components/schemas/Errors' examples: blankName: summary: Name is required value: errors: - attr: name code: invalid detail: name cannot be blank missingTimezone: summary: Timezone is required value: errors: - attr: officeHours.timezone code: blank detail: Timezone is required invalidTimezone: summary: Invalid timezone value: errors: - attr: officeHours.timezone code: invalid detail: Timezone is invalid /api/v1/business-hours/{businessHoursId}: parameters: - name: businessHoursId in: path description: ID of the business hours configuration required: true schema: type: string example: bh_WmeA3Y51Q5ayCAaZ1AotIA get: tags: - Business Hours summary: Get Business Hours description: 'Returns a single business hours configuration by its unique ID. ' operationId: getBusinessHoursById responses: '200': description: Business hours content: application/json: schema: $ref: '#/paths/~1api~1v1~1business-hours/post/responses/201/content/application~1json/schema' '404': description: Business hours not found content: application/json: schema: $ref: '#/components/schemas/Errors' example: errors: - code: not_exist detail: business hours does not exist put: tags: - Business Hours summary: Update Business Hours description: 'Updates an existing business hours configuration. The `version` field must match the current version of the business hours to prevent conflicting updates. ' operationId: updateBusinessHours requestBody: required: true description: Updated business hours configuration content: application/json: schema: title: BusinessHoursUpdateRequest type: object required: - version - name - officeHours properties: version: type: integer description: Current version of the business hours (for optimistic concurrency) example: 1 name: type: string description: Name of the business hours configuration (max 200 characters) example: Updated Hours primary: type: boolean description: Whether this should be the primary business hours configuration example: false officeHours: $ref: '#/paths/~1api~1v1~1business-hours/post/requestBody/content/application~1json/schema/properties/officeHours' example: version: 1 name: Updated Business Hours primary: false officeHours: timezone: America/New_York monday: - start: 08:00 stop: '18:00' tuesday: - start: 08:00 stop: '18:00' wednesday: - start: 08:00 stop: '18:00' thursday: - start: 08:00 stop: '18:00' friday: - start: 08:00 stop: '18:00' responses: '200': description: Business hours updated content: application/json: schema: $ref: '#/paths/~1api~1v1~1business-hours/post/responses/201/content/application~1json/schema' '400': description: Validation error content: application/json: schema: $ref: '#/components/schemas/Errors' '404': description: Business hours not found content: application/json: schema: $ref: '#/components/schemas/Errors' example: errors: - code: not_exist detail: business hours does not exist '409': description: Version conflict content: application/json: schema: $ref: '#/components/schemas/Errors' example: errors: - code: version_outdated detail: the version provided is outdated delete: tags: - Business Hours summary: Delete Business Hours description: 'Deletes a business hours configuration. The primary business hours configuration cannot be deleted. ' operationId: deleteBusinessHours responses: '204': description: Business hours deleted '400': description: Cannot delete primary business hours content: application/json: schema: $ref: '#/components/schemas/Errors' example: errors: - code: invalid detail: cannot delete primary business hours '404': description: Business hours not found content: application/json: schema: $ref: '#/components/schemas/Errors' example: errors: - code: not_exist detail: business hours does not exist components: schemas: Errors: type: object properties: errors: type: array items: $ref: '#/components/schemas/Error' example: - attr: content code: blank detail: content cannot be blank Error: type: object properties: attr: type: string description: Identifies the field causing the error code: type: string description: Code indicating the error type detail: type: string description: More details describing what went wrong securitySchemes: BasicAuth: type: http scheme: basic description: 'Gladly API uses token-based **Basic Authentication**. API tokens are associated with designated Gladly users. To create and use an API token, your user must have the API User permission. An API token can be used to perform any API request without restriction. | user name | password | | ----------- | --------- | | agent email | API token | The credentials must be passed via an `Authorization` HTTP header. All requests must be made over HTTPS. ```shell curl -u user@organization.com:$GLADLY_API_TOKEN \ https://organization.gladly.com/api/v1/organization ``` ' basicAuth: type: http scheme: basic description: HTTP Basic auth — username is the API user email; password is the API token. Requires the "API User" permission. x-tagGroups: - name: REST API tags: - Agents - Public Answer - Answer Management - Audiences - Business Hours - Communications - Conversations - Customers - Events - Export - Freeform Topics - Inboxes - Organization - Proactive Conversations - Reports - Tasks - Teams - User Identity - Topics - Webhooks - name: Webhooks tags: - Summary - Payloads - name: Lookup API tags: - Customer Lookup - name: Resources tags: - Versioning - Error Handling - Rate Limit - Rich Content - Launching Soon