iachat/swagger/swagger.json
Gabriel Jablonski b03dfdb751
Chore/merge upstream 4.8.0 (#150)
* chore: Hide "Learn More" button in feature spotlight for self-hosted (#12675)

* feat: single query for reporting event stats (#12664)

This PR collapses multiple queries fetching stats from a single table to
a single query

```sql
SELECT 
  user_id as user_id,
  COUNT(CASE WHEN name = 'conversation_resolved' THEN 1 END) as resolved_count,
  AVG(CASE WHEN name = 'conversation_resolved' THEN value END) as avg_resolution_time,
  AVG(CASE WHEN name = 'first_response' THEN value END) as avg_first_response_time,
  AVG(CASE WHEN name = 'reply_time' THEN value END) as avg_reply_time 
FROM "reporting_events"
WHERE 
  "reporting_events"."account_id" = <account_id> AND 
  "reporting_events"."created_at" >= '2025-09-14 18:30:00' AND 
  "reporting_events"."created_at" < '2025-10-14 18:29:59'
GROUP BY "reporting_events"."user_id";
```

### Why this works?

Here's why this optimization is faster based on PostgreSQL internals:

- Single Table Scan vs Multiple Scans: Earlier we did 4 sequential scans
(or 4 index scans) of the same data, with the same where clause, now in
a single scan all 4 `CASE` expressions are evaluated in a single pass.
- Shared Buffer Cache Efficiency: PostgreSQL's shared buffer cache
stores recently accessed pages, with this, pages are loaded once and
re-used for all aggregation, earlier with separate queries we were
forced to re-read all from the disk each time
- Reduced planning and network overhead (4 vs 1 query)


### How is it tested

1. The specs all pass without making any changes
2. Verified the reports side by side after generating from report seeder

#### How to test

Generate seed data using the following command

```bash
ACCOUNT_ID=1 ENABLE_ACCOUNT_SEEDING=true bundle exec rake db:seed:reports_data
```

Once done download the reports, checkout to this branch and download the
reports again and compare them

* chore: Update translations (#12625)

* chore: Migrate mailers from the worker to jobs (#12331)

Previously, email replies were handled inside workers. There was no
execution logs. This meant if emails silently failed (as reported by a
customer), we had no way to trace where the issue happened, the only
assumption was “no error = mail sent.”

By moving email handling into jobs, we now have proper execution logs
for each attempt. This makes it easier to debug delivery issues and
would have better visibility when investigating customer reports.

Fixes
https://linear.app/chatwoot/issue/CW-5538/emails-are-not-sentdelivered-to-the-contact

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* chore(deps-dev): bump vite from 5.4.20 to 5.4.21 (#12700)

Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite)
from 5.4.20 to 5.4.21.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/releases">vite's
releases</a>.</em></p>
<blockquote>
<h2>v5.4.21</h2>
<p>Please refer to <a
href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">CHANGELOG.md</a>
for details.</p>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/vitejs/vite/blob/v5.4.21/packages/vite/CHANGELOG.md">vite's
changelog</a>.</em></p>
<blockquote>
<h2><!-- raw HTML omitted -->5.4.21 (2025-10-20)<!-- raw HTML omitted
--></h2>
<ul>
<li>fix(dev): trim trailing slash before <code>server.fs.deny</code>
check (<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>)
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>)
(<a
href="cad1d31d06">cad1d31</a>),
closes <a
href="https://redirect.github.com/vitejs/vite/issues/20968">#20968</a>
<a
href="https://redirect.github.com/vitejs/vite/issues/20970">#20970</a></li>
<li>chore: update CHANGELOG (<a
href="ca88ed7398">ca88ed7</a>)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="adce3c22c6"><code>adce3c2</code></a>
release: v5.4.21</li>
<li><a
href="cad1d31d06"><code>cad1d31</code></a>
fix(dev): trim trailing slash before <code>server.fs.deny</code> check
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20968">#20968</a>)
(<a
href="https://github.com/vitejs/vite/tree/HEAD/packages/vite/issues/20970">#20970</a>)</li>
<li><a
href="ca88ed7398"><code>ca88ed7</code></a>
chore: update CHANGELOG</li>
<li>See full diff in <a
href="https://github.com/vitejs/vite/commits/v5.4.21/packages/vite">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=5.4.20&new-version=5.4.21)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/chatwoot/chatwoot/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore: Update translations (#12708)

* chore(sidekiq): log ActiveJob class and job_id on dequeue (#12704)

## Context

Sidekiq logs only showed the Sidekiq wrapper class and JID, which wasn’t
helpful when debugging ActiveJobs.

## Changes

- Updated `ChatwootDequeuedLogger` to log the actual `ActiveJob class`
and `job_id` instead of the generic Sidekiq wrapper and JID.

> Example
> ```
> Dequeued ActionMailer::MailDeliveryJob
123e4567-e89b-12d3-a456-426614174000 from default
> ```

- Remove sidekiq worker and unify everything to `ActiveJob`

* chore: Enforce custom role permissions on conversation access (#12583)

## Summary
- ensure conversation lookup uses the permission filter before fetching
records
- add request specs covering custom role access to unassigned
conversations

## Testing
- bundle exec rspec
spec/enterprise/controllers/api/v1/accounts/conversations_controller_spec.rb

------
https://chatgpt.com/codex/tasks/task_e_68de1f62b9b883268a54882e608a8bb8

* fix: parameterize agent name (#12709)

* chore: Remove channel icons from the create inbox page (#12727)

# Pull Request Template

## Description
This PR removes the frame containing all channel icons from the “Create
Inbox” page.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Screenshots

**Before**
<img width="1314" height="1016" alt="image"
src="https://github.com/user-attachments/assets/2b773495-9ddb-48b4-b15d-9aef18259ce1"
/>


**After**
<img width="1314" height="979" alt="image"
src="https://github.com/user-attachments/assets/f4dc64cf-516c-4faf-a45c-2f7de05cc29b"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: Use gap-4 instead of margins to define space between elements (#12728)

We should avoid using margins to define space between elements, instead
use the gap utility.

The problem with this particular instance was that if Google auth was
turned off and SSO is available, there is a weird spacing at the top
caused by the margin from the SSO element.

This PR will fix that. It also introduces a gap between the divider and
the button, but that should be okay.

* feat(ee): Add a service to fetch website content and prepare a persona of Captain Assistant (#12732)

This PR is the first of many to simplify the process of building an
assistant. The new flow will only require the user’s website. We’ll
automatically crawl it, identify the business name and what the business
does, and then generate a suggested assistant persona, complete with a
proposed name and description.

This service returns the following.
Example: tooljet.com
<img width="795" height="217" alt="Screenshot 2025-10-25 at 2 55 04 PM"
src="https://github.com/user-attachments/assets/9cb3594a-9c9c-4970-a0a1-4c9c8869c193"
/>

Example: replit.com
<img width="797" height="176" alt="Screenshot 2025-10-25 at 2 56 42 PM"
src="https://github.com/user-attachments/assets/6a1b4266-aab6-455f-a5e3-696d3a8243c9"
/>

* chore: Adds URL-based search and tab selection (#12663)

# Pull Request Template

## Description

This PR enables URL-based search and tab selection, allowing search
queries and active tabs to persist in the URL for easy sharing.

Fixes
[CW-5766](https://linear.app/chatwoot/issue/CW-5766/cannot-impersonate-an-account),
https://github.com/chatwoot/chatwoot/issues/12623

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video

https://www.loom.com/share/422a1d61f3fe4278a88e352ef98d2b78?sid=35fabee7-652f-4e17-83bd-e066a3bb804c

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* chore: Add tab params for inbox configuration (#12665)

# Pull Request Template

## Description

This PR enables active tabs in inbox settings to persist in the URL for
easy sharing.

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video

https://www.loom.com/share/63820ecb17ea491a9082339f8bb457b6?sid=4fef1acd-b4fd-431f-855c-7647015a330f


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Muhsin <muhsinkeramam@gmail.com>

* feat: Changelog card components (#12673)

# Pull Request Template

## Description

This PR introduces a new changelog component that can be used in the
sidebar.

Fixes
https://linear.app/chatwoot/issue/CW-5776/changelog-card-ui-component

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Screencast



https://github.com/user-attachments/assets/42e77e82-388a-4fc9-9b37-f3d0ea1a9d7f







## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Muhsin <muhsinkeramam@gmail.com>

* chore: Remove linear integration feature flag (#12716)

This PR removes the linear integration feature flag since the
integration is pretty much stable and we do display the Linear CTA for
users who aren't connected.
Fixes
https://linear.app/chatwoot/issue/CW-5819/remove-linear-feature-flag-from-front-end

* chore: Update translations (#12722)

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>

* perf: Add database index on conversations identifier (#12715)

**Problem**
Slack webhook processing was failing with 500 errors due to database
timeouts. The query `Conversation.where(identifier:
params[:event][:thread_ts]).first` was performing full table scans and
hitting PostgreSQL statement timeout.

**Solution**
Added database index on conversations.identifier and account_id.

* fix: Extend phone number normalization to Twilio WhatsApp (#12655)

### Problem
WhatsApp Cloud channels already handle Brazil/Argentina phone number
format mismatches (PRs #12492, #11173), but Twilio WhatsApp channels
were creating duplicate contacts
  when:
  - Template sent to new format: `whatsapp:+5541988887777` (13 digits)
  - User responds from old format: `whatsapp:+554188887777` (12 digits)

### Solution

The solution extends the existing phone number normalization
infrastructure to support both WhatsApp providers while handling their
different payload formats:

  ### Provider Format Differences
  - **WhatsApp Cloud**: `wa_id: "919745786257"` (clean number)
- **Twilio WhatsApp**: `From: "whatsapp:+919745786257"` (prefixed
format)
  
  
 ### Test Coverage

#### Brazil Phone Number Tests
  **Case 1: New Format (13 digits with "9")**
- **Test 1**: No existing contact → Creates new contact with original
format
- **Test 2**: Contact exists in same format → Appends to existing
conversation

  **Case 2: Old Format (12 digits without "9")**
- **Test 3**: Contact exists in old format → Appends to existing
conversation
- **Test 4** *(Critical)*: Contact exists in new format, message in old
format → Finds existing contact, prevents duplicate
- **Test 5**: No contact exists → Creates new contact with incoming
format

#### Argentina Phone Number Tests
  **Case 3: With "9" after country code**
  - **Test 6**: No existing contact → Creates new contact
- **Test 7**: Contact exists in normalized format → Uses existing
contact

  **Case 4: Without "9" after country code**
  - **Test 8**: Contact exists in same format → Appends to existing
  - **Test 9**: No contact exists → Creates new contact

Fixes
https://linear.app/chatwoot/issue/CW-5565/inconsistencies-for-mobile-numbersargentina-brazil-and-mexico-numbers

* fix: Timezone offset reports broken by DST transition (#12747)

## Description

Fixes timezone offset parameter in V2 reports API that was broken by DST
transitions. The issue occurred when UK DST ended on October 26, 2025,
causing the test to fail starting October 27th.

~~**Initial diagnosis:** The root cause was that
`timezone_name_from_offset` used `zone.now.utc_offset` to match
timezones, which changes based on the current date's DST status rather
than the data being queried.~~

**Actual root cause:** The test was accidentally passing before DST
transition. During BST, `timezone_name_from_offset(0)` matched "Azores"
(UTC-1) instead of "Edinburgh" (UTC+0), and the -1 hour offset
coincidentally split midnight data into [1,5]. After DST ended, it
correctly matched "Edinburgh" (UTC+0), but this grouped all
conversations into one day [6], exposing that the test data was flawed.

The real issue: Test data created all 6 conversations starting at
midnight on a single day, which cannot produce a [1,5] split in true
UTC.

Fixes CW-5846

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [ ] This change requires a documentation update

## How Has This Been Tested?

**Test that was failing:**
```bash
bundle exec rspec spec/controllers/api/v2/accounts/reports_controller_spec.rb:25
```

**Changes:**
~~1. Fixed `timezone_name_from_offset` to use January 1st as reference
date instead of current date~~
~~2. Converted timezone string to `ActiveSupport::TimeZone` object for
`group_by_period` compatibility~~

**Revised approach:**
1. Freeze test time to January 2024 using `travel_to`, making timezone
matching deterministic and aligned with test data period
2. Start test conversations at 23:00 instead of midnight to properly
span two days and test timezone boundary grouping
3. Keep `zone.now.utc_offset` (correct behavior for real users during
DST)

**Why this works:**
- Test runs "in January 2024" → `zone.now.utc_offset` returns January
offsets consistently
- Offset `-8` correctly matches Pacific Standard Time (UTC-8 in January)
- Real users in PDT (summer) with offset `-7` → correctly match Pacific
Daylight Time
- No production impact, test is deterministic year-round

**Verification:**
- Test now passes consistently regardless of current DST status
- Timezone matching works correctly for real users during DST periods
- Reports correctly group data by timezone offset across all seasons

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* fix: Captain response builder not getting triggered (#12729)

## Summary
- Fix captain response builder not getting triggered for cases where
responses are created as completed.

## Testing Instructions 
- Test articles with firecrawl
- Test articles without firecrawl
- Test PDF documents

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* chore: Update captain pending FAQ interface (#12752)

# Pull Request Template

## Description

**This PR includes,**
- Added new pending FAQs view with approve/edit/delete actions for each
response.
- Implemented banner notification showing pending FAQ count on main
approved responses page.
- Created dedicated route for pending FAQs review at
/captain/responses/pending.
- Added automatic pending count updates when switching assistants or
routes.
- Modified ResponseCard component to show action buttons instead of
dropdown in pending view.

Fixes
https://linear.app/chatwoot/issue/CW-5833/pending-faqs-in-a-different-ux

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video
https://www.loom.com/share/5fe8f79b04cd4681b9360c48710b9373


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* fix: Exclude authentication templates from WhatsApp template selection (#12753)

This PR add the changes for excluding the authentication templates from
the WhatsApp template selection in the frontend, as these templates are
not supported at the moment. Reference:
https://www.chatwoot.com/hc/user-guide/articles/1754940076-whatsapp-templates#what-is-not-supported

* feat: Template types components (#12714)

# Pull Request Template

## Description

Fixes
https://linear.app/chatwoot/issue/CW-5806/create-the-story-book-components-for-template-typestext-media-list

**Pending**
Need to standardize the structure to match the template/campaigns.


## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Screenshots

<img width="669" height="179" alt="image"
src="https://github.com/user-attachments/assets/42efd292-8520-4b05-81ec-8bc526fc12db"
/>
<img width="646" height="304" alt="image"
src="https://github.com/user-attachments/assets/431dd964-006c-4877-a693-dae39b90df4c"
/>
<img width="646" height="380" alt="image"
src="https://github.com/user-attachments/assets/9052e31f-9292-4afb-8897-13931655fa00"
/>
<img width="646" height="272" alt="image"
src="https://github.com/user-attachments/assets/873d2488-e856-4a0d-8579-cc1bcc61cc8e"
/>
<img width="646" height="490" alt="image"
src="https://github.com/user-attachments/assets/14c2aa42-bf27-475f-aa70-fe59c1d00e9b"
/>
<img width="646" height="281" alt="image"
src="https://github.com/user-attachments/assets/1f42408e-03e8-4863-b4c7-715d13d67686"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* fix: update omniauth to latest to resolve heroku deployment issues (#12749)

# Pull Request Template

## Description

Fixes https://github.com/chatwoot/chatwoot/issues/12553

Heroku build was failing due to `omniauth` version mismatch. Also, added
`NODE_OPTIONS=--max-old-space-size=4096` to handle OOM during Vite
build.

## Type of change

Please delete options that are not relevant.

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Tested on heroku

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

* chore: Improvements in pending FAQs (#12755)

# Pull Request Template

## Description

**This PR includes:**

1. Added URL-based filter persistence for the responses pages, including
page and search parameters.
2. Introduced a new empty state variant for pending FAQs — without a
backdrop and with a “Clear Filters” option.
3. Made the actions, filter, and search row remain fixed at the top
while scrolling.

Fixes
https://linear.app/chatwoot/issue/CW-5852/improvements-in-pending-faqs

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Loom video
https://www.loom.com/share/1d9eee68c0684f0ab05e08b4ca1e0ce9


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: run captain v2 outside the transaction (#12756)

* feat: Always process email content (#12734)

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* feat: Bulk actions for contacts (#12763)

Introduces APIs and UI for bulk actions in contacts table. The initial
action available will be assign labels

Fixes: #8536 #12253 

## Screens

<img width="1350" height="747" alt="Screenshot 2025-10-29 at 4 05 08 PM"
src="https://github.com/user-attachments/assets/0792dff5-0371-4b2e-bdfb-cd32db773402"
/>
<img width="1345" height="717" alt="Screenshot 2025-10-29 at 4 05 19 PM"
src="https://github.com/user-attachments/assets/ae510404-c6de-4c15-a720-f6d10cdac25b"
/>

---------

Co-authored-by: Muhsin <muhsinkeramam@gmail.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>

* feat: Enable opensearch on paid plans automatically (#12770)

- enable `advanced_search feature` on all paid plans automatically

ref: https://github.com/chatwoot/chatwoot/pull/12503

* chore: Make contacts bulk action bar sticky (#12773)

# Pull Request Template

## Description

This PR makes the contacts bulk action bar sticky while scrolling.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

### Screenshots
<img width="1080" height="300" alt="image"
src="https://github.com/user-attachments/assets/21f8f3c6-813e-4ef6-b40a-8dd14e6ffb26"
/>
<img width="1080" height="300" alt="image"
src="https://github.com/user-attachments/assets/bb939f1d-9a13-4f9f-953d-b9872c984b74"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* chore: Add dependant destroy_async for sla events (#12774)

Added the destroy_async to prevent timeout during SLA policy deletion by
processing SLA events asynchronously.

* chore: Update translations (#12748)

* feat: Add company backfill migration for existing contacts (Part 1) (#12657)

## Description

Implements company backfill migration infrastructure for existing
contacts. This is **Part 1 of 2** for the company model production
rollout as described in
[CW-5726](https://linear.app/chatwoot/issue/CW-5726/company-model-setting-it-up-on-production).

Creates jobs and services to associate existing contacts with companies
based on their email domains, filtering out free email providers (gmail,
yahoo, etc.) and disposable addresses.
 

**What's included:**
- Business email detector service with ValidEmail2 (uses
`disposable_domain?` to avoid DNS lookups)
- Per-account batch job to process contacts for one account
- Orchestrator job to iterate all accounts
- Rake task: `bundle exec rake companies:backfill`

~~*NOTE*: I'm using a hard-coded approach to determine if something is a
"business" email by filtering out emails that are usually personal. I've
also added domains that are common to some of our customers' regions.
This should be simpler. I looked into `Valid_Email2` and I couldn't find
anything to dictate whether an email is a personal email or a business
one. I don't think the approach used in the frontend is valid here.~~
UPDATE: Using `email_provider_info` gem instead.


**Pending - Part 2 (separate PR):** Real-time company creation for new
contacts

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

```bash
# Run all new tests
bundle exec rspec spec/enterprise/services/companies/business_email_detector_service_spec.rb \\
                   spec/enterprise/jobs/migration/company_account_batch_job_spec.rb \\
                   spec/enterprise/jobs/migration/company_backfill_job_spec.rb

# Run RuboCop
bundle exec rubocop enterprise/app/services/companies/business_email_detector_service.rb \\
                     enterprise/app/jobs/migration/company_account_batch_job.rb \\
                     enterprise/app/jobs/migration/company_backfill_job.rb \\
                     lib/tasks/companies.rake
```

**Performance optimization:**
- Uses `disposable_domain?` instead of `disposable?` to avoid DNS MX
lookups (discovered via tcpdump analysis - `disposable?` was making
network calls for every email, causing 100x slowdown)

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>

* feat: Add company auto-association for contacts (CW-5726 Part 2) (#12711)

## Description

Implements real-time company auto-association for contacts based on
email domains. This is **Part 2** of the company model production
rollout (CW-5726).

**Task:**
- When a contact is created with a business email, automatically create
and associate a company from the email domain
- When a contact is updated with an email for the first time (email was
previously nil), associate with a company
- Preserve existing company associations when email changes to avoid
user confusion
- Skip free email providers and disposable domains

**Dependencies:**
⚠️ Requires PR #12657 (Part 1: Backfill migration) to be merged first

**Linear ticket:**
[CW-5726](https://linear.app/chatwoot/issue/CW-5726/company-model-setting-it-up-on-production)

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Service specs: Tests business email detection, company creation,
association logic, edge cases (existing companies, free emails, nil
emails)
- Integration specs: Tests full callback flow for contact create/update
scenarios
- All tests passing: 10 examples, 0 failures
- RuboCop: 0 offenses

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules (PR #12657 pending)

---------

Co-authored-by: Sojan Jose <sojan@pepalo.com>

* fix: Optimize Message search_data to prevent OpenSearch field explosion (#12786)

## Description

Refactored the `Message#search_data` method to prevent exceeding
OpenSearch's 1000 field limit during reindex operations.

**Problem:** The previous implementation serialized entire ActiveRecord
objects (Inbox, Sender, Conversation) with all their JSONB fields,
causing dynamic field explosion in OpenSearch. This resulted in
`Searchkick::ImportError` with "Limit of total fields [1000] has been
exceeded".

**Solution:** Whitelisted only necessary fields for search and
filtering, and flattened JSONB `custom_attributes` into key-value pair
arrays to prevent unbounded field creation.

Linked to: CW-5861

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing
functionality not to work as expected)
- [x] This change requires a documentation update

## How Has This Been Tested?

- Verified rubocop passes with no offenses
- Code review of search field usage from
`enterprise/app/services/enterprise/search_service.rb`
- Analyzed actual search queries to determine required indexed fields

**Still needed:**
- Full reindex test on staging/production environment
- Verify search functionality still works after reindex
- Confirm field count is under 1000 limit

## Changes Made

### Before
- Indexed 1000+ fields (entire AR objects with JSONB)
- `inbox` = full Inbox object (23+ fields + JSONB)
- `sender` = full Contact/User/AgentBot object (10+ fields + JSONB)
- `conversation` = full push_event_data
- Dynamic JSONB keys creating unlimited fields

### After
- ~35-40 controlled fields
- Whitelisted search fields: `content`, `attachment_transcribed_text`,
`email_subject`
- Filter fields: `account_id`, `inbox_id`, `conversation_id`,
`sender_id`, `sender_type`, etc.
- Flattened `custom_attributes`: `[{key, value, value_type}]` format
- Helper methods: `search_conversation_data`, `search_inbox_data`,
`search_sender_data`, `search_additional_data`

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

## Post-merge Steps

After merging, the following steps are required:

1. **Reindex all messages:**
   ```bash
   bundle exec rails runner "Message.reindex"
   ```

2. **Verify field count:**
   ```bash
   bundle exec rails runner "
     client = Searchkick.client
     index_name = Message.searchkick_index.name
     mapping = client.indices.get_mapping(index: index_name)
     fields = mapping.dig(index_name, 'mappings', 'properties')
     puts 'Total fields: ' + fields.keys.count.to_s
   "
   ```

3. **Test search functionality** to ensure queries still work as
expected

---------

Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com>
Co-authored-by: Pranav <pranav@chatwoot.com>

* fix: Avoid introducing new attributes in search (#12791)

Fix `Limit of total fields [1000] has been exceeded`


https://linear.app/chatwoot/issue/CW-5861/searchkickimporterror-type-=-illegal-argument-exception-reason-=-limit#comment-6b6e41bd

* fix: Gate Sidekiq dequeue logger behind env (#12790)

## Summary
- wrap the dequeue middleware registration in a boolean env flag
- document the ENABLE_SIDEKIQ_DEQUEUE_LOGGER option in .env.example

* feat: Bulk delete for contacts (#12778)

Introduces a new bulk action `delete` for contacts

ref: https://github.com/chatwoot/chatwoot/pull/12763

## Screens

<img width="1492" height="973" alt="Screenshot 2025-10-31 at 6 27 21 PM"
src="https://github.com/user-attachments/assets/30dab1bb-2c2c-4168-9800-44e0eb5f8e3a"
/>
<img width="1492" height="985" alt="Screenshot 2025-10-31 at 6 27 32 PM"
src="https://github.com/user-attachments/assets/5be610c4-b19e-4614-a164-103b22337382"
/>

* fix: Video bubble click and play issue (#12764)

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* feat: Differentiate bot and user in the summary (#12801)

While generating the summary, use the appropriate sender type for the
message.

* fix: Invalid image URL issue in Help Center articles (#12806)

* feat: allow bots to handle campaigns when sender_id is nil (#12805)

* fix: Add empty line before signature in compose conversation editor (#12702)

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* feat: Enhance button interactions (#12738)

* fix: Remove the same account validation for whatsapp channels (#12811)

## Description

Modified the phone number validation in Whatsapp::ChannelCreationService
to check for duplicate phone numbers across ALL accounts, not just
within the current account.

## Type of change

- [ ] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Added test coverage for cross-account phone number validation
- Using actual UI flow 
<img width="1493" height="532" alt="image"
src="https://github.com/user-attachments/assets/67d2bb99-2eb9-4115-8d56-449e4785e0d8"
/>


## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* feat: Update Captain navigation structure (#12761)

# Pull Request Template

## Description

This PR includes an update to the Captain navigation structure.

## Route Structure

```javascript
1. captain_assistants_responses_index    → /captain/:assistantId/faqs
2. captain_assistants_documents_index    → /captain/:assistantId/documents
3. captain_assistants_scenarios_index    → /captain/:assistantId/scenarios
4. captain_assistants_playground_index   → /captain/:assistantId/playground
5. captain_assistants_inboxes_index      → /captain/:assistantId/inboxes
6. captain_tools_index                   → /captain/tools
7. captain_assistants_settings_index     → /captain/:assistantId/settings
8. captain_assistants_guardrails_index   → /captain/:assistantId/settings/guardrails
9. captain_assistants_guidelines_index   → /captain/:assistantId/settings/guidelines
10. captain_assistants_index             → /captain/:navigationPath
```

**How it works:**

1. User clicks sidebar item → Routes to `captain_assistants_index` with
`navigationPath`
2. `AssistantsIndexPage` validates route and gets last active assistant,
if not redirects to assistant create page.
3. Routes to actual page: `/captain/:assistantId/:page`
4. Page loads with correct assistant context

Fixes
https://linear.app/chatwoot/issue/CW-5832/updating-captain-navigation

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?




## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>

* fix: Handle login when there are no accounts (#12816)

* chore: Update translations (#12794)

* chore(docs): Fix typos in some files (#12817)

This PR fixes typos in the file file using codespell.

* refactor: strategy pattern for mailbox conversation finding (#12766)

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>

* fix: Issue with processing variables in outgoing email content (#12799)

Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>

* fix: hide pdf citations in captain faq responses (#12839)

* fix: Use contact_id instead of sender_id for Instagram message locks (#12841)

Previously, the lock key for Instagram used sender_id, which for echo
messages (outgoing) would be the account's own ID. This caused all
outgoing messages to compete for the same lock, creating a bottleneck
during bulk messaging.

The fix introduces contact_instagram_id method that correctly identifies
the contact's ID regardless of message direction:
- For echo messages (outgoing): uses recipient.id (the contact)
- For incoming messages: uses sender.id (the contact)

This ensures each conversation has a unique lock, allowing parallel
processing of webhooks while maintaining race condition protection
within individual conversations.

Fixes lock acquisition errors in Sidekiq when processing bulk Instagram
messages.

Fixes
https://linear.app/chatwoot/issue/CW-5931/p0-mutexapplicationjoblockacquisitionerror-failed-to-acquire-lock-for

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

* fix: label tags for contactable inboxes (#12838)

* chore: Improve captain layout (#12820)

* feat: allow selecting month range in overview reports (#12701)

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>

* fix: respect status parameter when creating articles via API (#12846)

## Description

The Articles API was ignoring the `status` parameter when creating new
articles. All articles were forced to be drafts due to a hardcoded
`@article.draft!` call in the controller, even when users explicitly
sent `status: 1` (published) in their API request.

This PR removes the hardcoded draft enforcement and allows the status
parameter to be respected while maintaining backward compatibility.

Fixes #12063

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

**Before:**
- API POST with `status: 1` → Created as draft (ignored parameter)
- API POST without status → Created as draft

**After:**
- API POST with `status: 1` → Created as published 
- API POST without status → Created as draft (backward compatible) 
- UI creates articles → Still creates as draft (UI doesn't send status)


**Tests run:**
```bash
bundle exec rspec spec/controllers/api/v1/accounts/articles_controller_spec.rb
# 17 examples, 0 failures
```

Updated tests:
1. Changed 2 existing tests that were verifying the broken behavior
(expecting draft when published was sent)
2. Added new test to verify articles default to draft when status is not
provided
3. All existing tests pass, confirming backward compatibility

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes

Co-authored-by: Sojan Jose <sojan@pepalo.com>

* feat: allow querying reporting events via the API (#12832)

* feat(webhooks): add name to webhook (#12641)

## Description

When working with webhooks, it's easy to lose track of which URL is
which. Adding a `name` (optional) column to the webhook model is a
straight-forward solution to make it significantly easier to identify
webhooks.

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

Model and controller specs, and also running in production over several
months without any issues.

| Before | After |
| --- | --- |
| <img width="949" height="990" alt="image copy 3"
src="https://github.com/user-attachments/assets/6b33c072-7d16-4a9c-a129-f9c0751299f5"
/> | <img width="806" height="941" alt="image"
src="https://github.com/user-attachments/assets/77f3cb3a-2eb0-41ac-95bf-d02915589690"
/> |
| <img width="1231" height="650" alt="image copy 2"
src="https://github.com/user-attachments/assets/583374af-96e0-4436-b026-4ce79b7f9321"
/> | <img width="1252" height="650" alt="image copy"
src="https://github.com/user-attachments/assets/aa81fb31-fd18-4e21-a40e-d8ab0dc76b4e"
/> |


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [x] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [x] Any dependent changes have been merged and published in downstream
modules

* perf: speed up docker builds (#12859)

- Use separate keys to avoid cache overwrites across different
architecture builds


https://linear.app/chatwoot/issue/CW-5945/perf-speed-up-docker-builds

### 25 mins  ---> 5mins


## before

<img width="971" height="452" alt="image"
src="https://github.com/user-attachments/assets/535cebd6-6c16-48d1-a62d-ffb6f2fc9b08"
/>


## after
<img width="940" height="428" alt="image"
src="https://github.com/user-attachments/assets/359eb313-4bb5-4e0e-9492-a8ad48645159"
/>

* chore: Update missing places with new colors (#12862)

# Pull Request Template

## Description

This PR updates the colors in places that were missed during the color
update migration.

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: Brand installation name not showing (#12861)

# Pull Request Template

## Description

Fixes
https://linear.app/chatwoot/issue/CW-5946/fix-brand-installation-name-issue-in-dyte

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)


## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

* fix: migrate from deprecated annotate gem to annotaterb (#12845)

## Description

The `annotate` gem has been deprecated and users are experiencing
annotation errors with the new Rails 7 `serialize` syntax. This PR
migrates to `annotaterb`, the actively maintained fork.

Users reported errors when running `make db`:
```
Unable to annotate app/models/installation_config.rb: no implicit conversion of Hash into String  
Unable to annotate app/models/installation_config.rb: no implicit conversion of nil into Array
```

This PR updates the Gemfile and rake configuration to use `annotaterb`
instead.

Fixes #11673

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

Tested locally with the following steps:
1. Run `bundle install` - successfully installed annotaterb 4.20.0
2. Run `RAILS_ENV=development bundle exec rails db:chatwoot_prepare` -
completed without annotation errors
3. Run `RAILS_ENV=development bundle exec rails annotate_rb:models` -
successfully annotated all models including InstallationConfig
4. Verified InstallationConfig model annotations are present and correct

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] New and existing unit tests pass locally with my changes

* chore: disable worker MemoryHigh throttling in systemd unit (#12871)

- set MemoryHigh to infinity in deployment/chatwoot-worker.1.service so
the worker is throttled only by the existing
    MemoryMax hard limit
- prevents cgroup reclaim from slowing Sidekiq under transient spikes
while still keeping the hard stop at 1.5 GB

* chore: Update translations (#12818)

* fix: revert annotaterb migration due to persistent annotation errors (#12881)

## Description

This PR reverts the migration from the `annotate` gem to `annotaterb`
introduced in PR #12845. The annotation errors reported in #11673
persist with both gems, and the old `annotate` gem handles the errors
more gracefully by continuing to process other models instead of
crashing.

**Testing reveals both gems fail with the same underlying issue:**

**Old annotate gem (3.2.0):**
```
Unable to annotate app/models/installation_config.rb: no implicit conversion of Hash into String
Unable to annotate app/models/installation_config.rb: no implicit conversion of nil into Array
Model files unchanged.
```
(Logs error but continues processing)

**New annotaterb gem (4.20.0):**
```
❯ bundle exec annotaterb models
ruby/3.4.4/lib/ruby/gems/3.4.0/gems/reline-0.3.6/lib/reline/terminfo.rb:2: warning: ruby/3.4.4/lib/ruby/3.4.0/fiddle.rb was loaded from the standard library, but will no longer be part of the default gems starting from Ruby 3.5.0.
You can add fiddle to your Gemfile or gemspec to silence this warning.
Also please contact the author of reline-0.3.6 to request adding fiddle into its gemspec.
Annotating models
bundler: failed to load command: annotaterb (ruby/3.4.4/bin/annotaterb)
ruby/3.4.4/lib/ruby/3.4.0/psych/parser.rb:62:in 'Psych::Parser#_native_parse': no implicit conversion of Hash into String (TypeError)

      _native_parse @handler, yaml, path
                    ^^^^^^^^^^^^^^^^^^^^
        from ruby/3.4.4/lib/ruby/3.4.0/psych/parser.rb:62:in 'Psych::Parser#parse'
        from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:457:in 'Psych.parse_stream'
        from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:401:in 'Psych.parse'
        from ruby/3.4.4/lib/ruby/3.4.0/psych.rb:325:in 'Psych.safe_load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/coders/yaml_column.rb:37:in 'ActiveRecord::Coders::YAMLColumn::SafeCoder#load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/coders/column_serializer.rb:37:in 'ActiveRecord::Coders::ColumnSerializer#load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/type/serialized.rb:22:in 'ActiveRecord::Type::Serialized#deserialize'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute.rb:175:in 'ActiveModel::Attribute::FromDatabase#type_cast'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute.rb:43:in 'ActiveModel::Attribute#value'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute_set.rb:37:in 'block in ActiveModel::AttributeSet#to_hash'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'block in Enumerable#index_with'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'Array#each'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activesupport-7.1.5.2/lib/active_support/core_ext/enumerable.rb:78:in 'Enumerable#index_with'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activemodel-7.1.5.2/lib/active_model/attribute_set.rb:37:in 'ActiveModel::AttributeSet#to_hash'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/activerecord-7.1.5.2/lib/active_record/model_schema.rb:499:in 'ActiveRecord::ModelSchema::ClassMethods#column_defaults'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:68:in 'AnnotateRb::ModelAnnotator::ModelWrapper#column_defaults'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:139:in 'block in AnnotateRb::ModelAnnotator::ModelWrapper#built_attributes'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:136:in 'Array#map'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/model_wrapper.rb:136:in 'AnnotateRb::ModelAnnotator::ModelWrapper#built_attributes'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/column_annotation/annotation_builder.rb:15:in 'AnnotateRb::ModelAnnotator::ColumnAnnotation::AnnotationBuilder#build'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:52:in 'block in AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#columns'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:51:in 'Array#map'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:51:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#columns'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:26:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#body'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:35:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder::Annotation#build'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotation/annotation_builder.rb:71:in 'AnnotateRb::ModelAnnotator::Annotation::AnnotationBuilder#build'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:43:in 'AnnotateRb::ModelAnnotator::ProjectAnnotator#build_instructions_for_file'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:17:in 'block in AnnotateRb::ModelAnnotator::ProjectAnnotator#annotate'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:13:in 'Array#map'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/project_annotator.rb:13:in 'AnnotateRb::ModelAnnotator::ProjectAnnotator#annotate'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotator.rb:21:in 'AnnotateRb::ModelAnnotator::Annotator#do_annotations'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/model_annotator/annotator.rb:8:in 'AnnotateRb::ModelAnnotator::Annotator.do_annotations'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/commands/annotate_models.rb:17:in 'AnnotateRb::Commands::AnnotateModels#call'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/runner.rb:38:in 'AnnotateRb::Runner#run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/lib/annotate_rb/runner.rb:11:in 'AnnotateRb::Runner.run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/annotaterb-4.20.0/exe/annotaterb:18:in '<top (required)>'
        from ruby/3.4.4/bin/annotaterb:25:in 'Kernel#load'
        from ruby/3.4.4/bin/annotaterb:25:in '<top (required)>'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:58:in 'Kernel.load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:58:in 'Bundler::CLI::Exec#kernel_load'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli/exec.rb:23:in 'Bundler::CLI::Exec#run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:455:in 'Bundler::CLI#exec'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/command.rb:28:in 'Bundler::Thor::Command#run'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in 'Bundler::Thor::Invocation#invoke_command'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor.rb:527:in 'Bundler::Thor.dispatch'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:35:in 'Bundler::CLI.dispatch'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/vendor/thor/lib/thor/base.rb:584:in 'Bundler::Thor::Base::ClassMethods#start'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/cli.rb:29:in 'Bundler::CLI.start'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/exe/bundle:28:in 'block in <top (required)>'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/lib/bundler/friendly_errors.rb:117:in 'Bundler.with_friendly_errors'
        from ruby/3.4.4/lib/ruby/gems/3.4.0/gems/bundler-2.5.16/exe/bundle:20:in '<top (required)>'
        from ruby/3.4.4/bin/bundle:25:in 'Kernel#load'
        from ruby/3.4.4/bin/bundle:25:in '<main>'


```
(Crashes immediately, stops all processing)

**Root cause:** The `InstallationConfig` model uses YAML serialization
(`serialize :serialized_value, coder: YAML`) on a JSONB database column.
When annotation tools read column defaults, PostgreSQL returns JSONB as
a Hash, but YAML expects a String, causing the type error.

The migration to annotaterb doesn't solve the problem - both gems
encounter the same error. The old gem is preferable as it continues
working despite the error.

Reverts #12845
Related to #11673

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

1. Reverted commit 559d1b657
2. Ran `bundle install` to reinstall annotate gem v3.2.0
3. Ran `RAILS_ENV=development bundle exec annotate` 
- Result: Logs errors for InstallationConfig but completes successfully
4. Re-applied the annotaterb changes and tested `bundle exec annotaterb
models`
   - Result: Crashes with full stack trace and stops processing

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] New and existing unit tests pass locally with my changes


---
*Edited to truncate environment-specific info from error dump*

* chore: Hide assistant switcher on paywall screen (#12875)

* feat: Assignment service (v2) (#12320)

## Linear Link

 
## Description

This PR introduces a new robust auto-assignment system for conversations
in Chatwoot. The system replaces the existing round-robin assignment
with a more sophisticated service-based architecture that supports
multiple assignment strategies, rate limiting, and Enterprise features
like capacity-based assignment and balanced distribution.

## Type of change

- [ ] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Unit test cases
- Test conversations getting assigned on status change to open
- Test the job directly via rails console

## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> Adds a new service-based auto-assignment system with scheduled jobs,
rate limiting, enterprise capacity/balanced selection, and wiring via
inbox/handler; includes Redis helpers and comprehensive tests.
> 
> - **Auto-assignment v2 (core services)**:
> - Add `AutoAssignment::AssignmentService` with bulk assignment,
configurable conversation priority, RR selection, and per-agent rate
limiting via `AutoAssignment::RateLimiter`.
>   - Add `AutoAssignment::RoundRobinSelector` for agent selection.
> - **Jobs & scheduling**:
> - Add `AutoAssignment::AssignmentJob` (per-inbox bulk assign;
env-based limit) and `AutoAssignment::PeriodicAssignmentJob` (batch over
accounts/inboxes).
> - Schedule periodic run in `config/schedule.yml`
(`periodic_assignment_job`).
> - **Model/concerns wiring**:
> - Include `InboxAgentAvailability` in `Inbox`; add
`Inbox#auto_assignment_v2_enabled?`.
> - Update `AutoAssignmentHandler` to trigger v2 job when
`auto_assignment_v2_enabled?`, else fallback to legacy.
> - **Enterprise extensions**:
> - Add `Enterprise::InboxAgentAvailability` (capacity-aware filtering)
and `Enterprise::Concerns::Inbox` association `inbox_capacity_limits`.
> - Extend service via `Enterprise::AutoAssignment::AssignmentService`
(policy-driven config, capacity filtering, exclusion rules) and add
selectors/services: `BalancedSelector`, `CapacityService`.
> - **Infrastructure**:
> - Enhance `Redis::Alfred` with `expire`, key scan/count, and extended
ZSET helpers (`zadd`, `zcount`, `zcard`, `zrangebyscore`).
> - **Tests**:
> - Add specs for jobs, core service, rate limiter, RR selector, and
enterprise features (capacity, balanced selection, exclusions).
> 
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
0ebe187c8aea73765b0122a44b18d6f465c2477f. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* fix: Change contact_inboxes.source_id to text column (#12882)

## Description

Fixes CW-5961 where IMAP email processing failed with
`ActiveRecord::RecordInvalid: Validation failed: Source is too long
(maximum is 255 characters)` error.

This changes the `contact_inboxes.source_id` column from `string` (255
character limit) to `text` (unlimited) to accommodate long email message
IDs that were causing validation failures.

Fixes CW-5961

## Type of change

- [x] Bug fix (non-breaking change which fixes an issue)

## How Has This Been Tested?

- Added spec test validating `source_id` values longer than 255
characters (300 chars)
- All existing `contact_inbox_spec.rb` tests pass (7 examples, 0
failures)
- Migration applied successfully with reversible up/down methods
- Verified `source_id` column type changed to `text` with `null: false`
constraint preserved

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes

* feat: allow configuring attachment upload limit (#12835)

## Summary
- add a configurable MAXIMUM_FILE_UPLOAD_SIZE installation setting and
surface it through super admin and global config payloads
- apply the configurable limit to attachment validations and shared
upload helpers on dashboard and widget
- introduce a reusable helper with unit tests for parsing the limit and
extend attachment specs for configurability


------
[Codex
Task](https://chatgpt.com/codex/tasks/task_e_6912644786b08326bc8dee9401af6d0a)

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>

* feat: Customizable webhook timeout configuration (#12777)

## Summary
- Ability to configure the webhook timeout for Chatwoot self hosted
installations

fixes: https://github.com/chatwoot/chatwoot/issues/12754

* feat: Control the allowed login methods via Super Admin (#12892)

- Control the allowed authentication methods for a chatwoot installation
via super admin configs. [SAML, Google Auth etc]
------
[Codex
Task](https://chatgpt.com/codex/tasks/task_e_6917d503b6e48326a261672c1de91462)

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>

* chore: Update translations (#12876)

* feat: Backend - Companies API endpoint with pagination and search (#12840)

## Description

Adds API endpoint to list companies with pagination, search, and
sorting.

Fixes
https://linear.app/chatwoot/issue/CW-5930/add-backend-routes-to-get-companies-result
Parent issue:
https://linear.app/chatwoot/issue/CW-5928/add-companies-tab-to-dashboard

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

Added comprehensive specs to
`spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb`:
- Pagination (25 per page, multiple pages)
- Search by name and domain (case-insensitive)
- Counter cache for contacts_count
- Account scoping
- Authorization

To reproduce:
```bash
bundle exec rspec spec/enterprise/controllers/api/v1/accounts/companies_controller_spec.rb
bundle exec rubocop enterprise/app/controllers/api/v1/accounts/companies_controller.rb
```

## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>

* feat: Companies page (#12842)

# Pull Request Template

## Description

This PR introduces a new Companies section in the Chatwoot dashboard. It
lists all companies associated with the account and includes features
such as **search**, **sorting**, and **pagination** to enable easier
navigation and efficient management.

Fixes
https://linear.app/chatwoot/issue/CW-5928/add-companies-tab-to-dashboard

## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

### Screenshot
<img width="1619" height="1200" alt="image"
src="https://github.com/user-attachments/assets/21f0a666-c3d6-4dec-bd02-1e38e0cd9542"
/>



## Checklist:

- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my code
- [x] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>

* feat: Add Amazon SES inbound email support (#12893)

## Summary
- add AWS ActionMailbox SES gems
- document SES as incoming email provider
- note SES option in configuration

## Testing
- `bundle exec rubocop config/initializers/mailer.rb
config/environments/production.rb Gemfile`


------
[Codex
Task](https://chatgpt.com/codex/tasks/task_e_68bbb7d482288326b8f04bb795af0322)

---------

Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>

* feat: hide email forwarding address if INBOUND_EMAIL_DOMAIN is not configured (#12768)

#### Summary

- Improved email inbox setup flow to handle cases where inbound email
forwarding is not configured on the installation
- Added conditional display of email forwarding address based on
MAILER_INBOUND_EMAIL_DOMAIN environment variable availability
- Enhanced user messaging to guide users toward configuring SMTP/IMAP
settings when forwarding is unavailable

#### Changes

**Backend (app/views/api/v1/models/_inbox.json.jbuilder)**
- Added forwarding_enabled boolean flag to inbox API response based on
MAILER_INBOUND_EMAIL_DOMAIN presence
- Made forward_to_email conditional - only included when forwarding is
enabled

  **Frontend - Inbox Creation Flow**
- Created new EmailInboxFinish.vue component to handle email inbox setup
completion
  - Shows different messages based on whether forwarding is enabled:
- With forwarding: displays forwarding address and encourages SMTP/IMAP
configuration
- Without forwarding: warns that SMTP/IMAP configuration is required for
emails to be processed
- Added link to configuration page for easy access to SMTP/IMAP settings

<img width="988" height="312" alt="Screenshot 2025-11-18 at 3 27 27 PM"
src="https://github.com/user-attachments/assets/928aff78-df73-49fa-9a26-dbbd1297b26a"
/>

<img width="765" height="489" alt="Screenshot 2025-11-18 at 3 24 46 PM"
src="https://github.com/user-attachments/assets/6a182c7d-087f-4e88-92a5-30f147a567a7"
/>


Fixes
https://linear.app/chatwoot/issue/CW-5881/hide-forwaring-email-section-if-inbound-email-domain-is-not-configured


## Type of change

- [x] New feature (non-breaking change which adds functionality)

## How Has This Been Tested?

- Tested locally

## Checklist:

- [ ] My code follows the style guidelines of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented on my code, particularly in hard-to-understand
areas
- [ ] I have made corresponding changes to the documentation
- [ ] My changes generate no new warnings
- [ ] I have added tests that prove my fix is effective or that my
feature works
- [ ] New and existing unit tests pass locally with my changes
- [ ] Any dependent changes have been merged and published in downstream
modules

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* feat: APIs to assign agents_bots as assignee in conversations (#12836)

## Summary
- add an assignee_agent_bot_id column as an initital step to prototype
this before fully switching to polymorphic assignee
- update assignment APIs and conversation list / show endpoints to
reflect assignee as agent bot
- ensure webhook payloads contains agent bot assignee


[Codex
Task](https://chatgpt.com/codex/tasks/task_e_6912833377e48326b6641b9eee32d50f)

---------

Co-authored-by: Pranav <pranav@chatwoot.com>

* Bump version to 4.8.0

* chore: remove migration

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
Co-authored-by: Shivam Mishra <scm.mymail@gmail.com>
Co-authored-by: Chatwoot Bot <92152627+chatwoot-bot@users.noreply.github.com>
Co-authored-by: Pranav <pranav@chatwoot.com>
Co-authored-by: Sojan Jose <sojan@pepalo.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Muhsin <muhsinkeramam@gmail.com>
Co-authored-by: Vinay Keerthi <11478411+stonecharioteer@users.noreply.github.com>
Co-authored-by: Vishnu Narayanan <iamwishnu@gmail.com>
Co-authored-by: iamsivin <iamsivin@gmail.com>
Co-authored-by: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com>
Co-authored-by: Lê Nam Khánh <55955273+khanhkhanhlele@users.noreply.github.com>
2025-11-19 16:25:58 -03:00

12701 lines
361 KiB
JSON

{
"openapi": "3.0.4",
"info": {
"title": "Chatwoot",
"description": "This is the API documentation for Chatwoot server.",
"version": "1.1.0",
"termsOfService": "https://www.chatwoot.com/terms-of-service/",
"contact": {
"email": "hello@chatwoot.com"
},
"license": {
"name": "MIT License",
"url": "https://opensource.org/licenses/MIT"
}
},
"servers": [
{
"url": "https://app.chatwoot.com/"
}
],
"paths": {
"/platform/api/v1/accounts": {
"post": {
"tags": [
"Accounts"
],
"operationId": "create-an-account",
"summary": "Create an Account",
"description": "Create an Account",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/platform_account"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/accounts/{account_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Accounts"
],
"operationId": "get-details-of-an-account",
"summary": "Get an account details",
"description": "Get the details of an account",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/platform_account"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given account does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Accounts"
],
"operationId": "update-an-account",
"summary": "Update an account",
"description": "Update an account's attributes",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/platform_account"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Accounts"
],
"operationId": "delete-an-account",
"summary": "Delete an Account",
"description": "Delete an Account",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The account does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/accounts/{account_id}/account_users": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Account Users"
],
"operationId": "list-all-account-users",
"summary": "List all Account Users",
"description": "List all account users",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_user"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Account Users"
],
"operationId": "create-an-account-user",
"summary": "Create an Account User",
"description": "Create an Account User",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_user_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"account_id": {
"type": "integer",
"description": "The ID of the account"
},
"user_id": {
"type": "integer",
"description": "The ID of the user"
},
"role": {
"type": "string",
"description": "whether user is an administrator or agent"
}
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Account Users"
],
"operationId": "delete-an-account-user",
"summary": "Delete an Account User",
"description": "Delete an Account User",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The account does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/agent_bots": {
"get": {
"tags": [
"AgentBots"
],
"operationId": "list-all-agent-bots",
"summary": "List all AgentBots",
"description": "List all agent bots available",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of agent bots",
"items": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"AgentBots"
],
"operationId": "create-an-agent-bot",
"summary": "Create an Agent Bot",
"description": "Create an agent bot",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/platform_agent_bot_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/agent_bots/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/agent_bot_id"
}
],
"get": {
"tags": [
"AgentBots"
],
"operationId": "get-details-of-a-single-agent-bot",
"summary": "Get an agent bot details",
"description": "Get the details of an agent bot",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given agent bot ID does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"AgentBots"
],
"operationId": "update-an-agent-bot",
"summary": "Update an agent bot",
"description": "Update an agent bot's attributes",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/platform_agent_bot_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"AgentBots"
],
"operationId": "delete-an-agent-bot",
"summary": "Delete an AgentBot",
"description": "Delete an AgentBot",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The agent bot does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/users": {
"post": {
"tags": [
"Users"
],
"operationId": "create-a-user",
"summary": "Create a User",
"description": "Create a User",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/users/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/platform_user_id"
}
],
"get": {
"tags": [
"Users"
],
"operationId": "get-details-of-a-user",
"summary": "Get an user details",
"description": "Get the details of an user",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given user does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Users"
],
"operationId": "update-a-user",
"summary": "Update a user",
"description": "Update a user's attributes",
"security": [
{
"platformAppApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Users"
],
"operationId": "delete-a-user",
"summary": "Delete a User",
"description": "Delete a User",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The user does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/platform/api/v1/users/{id}/login": {
"parameters": [
{
"$ref": "#/components/parameters/platform_user_id"
}
],
"get": {
"tags": [
"Users"
],
"operationId": "get-sso-url-of-a-user",
"summary": "Get User SSO Link",
"description": "Get the sso link of a user",
"security": [
{
"platformAppApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "SSO url to autenticate the user"
}
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given user does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
}
],
"get": {
"tags": [
"Inbox API"
],
"operationId": "get-details-of-a-inbox",
"summary": "Inbox details",
"description": "Get the details of an inbox",
"security": [],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_inbox"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given inbox does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
}
],
"post": {
"tags": [
"Contacts API"
],
"operationId": "create-a-contact",
"summary": "Create a contact",
"description": "Create a contact",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_contact_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_contact"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
}
],
"get": {
"tags": [
"Contacts API"
],
"operationId": "get-details-of-a-contact",
"summary": "Get a contact",
"description": "Get the details of a contact",
"security": [],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_contact"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given contact does not exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Contacts API"
],
"operationId": "update-a-contact",
"summary": "Update a contact",
"description": "Update a contact's attributes",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_contact_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_contact"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
}
],
"post": {
"tags": [
"Conversations API"
],
"operationId": "create-a-conversation",
"summary": "Create a conversation",
"description": "Create a conversation",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_conversation_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_conversation"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"get": {
"tags": [
"Conversations API"
],
"operationId": "list-all-contact-conversations",
"summary": "List all conversations",
"description": "List all conversations for the contact",
"security": [],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of conversations",
"items": {
"$ref": "#/components/schemas/public_conversation"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"get": {
"tags": [
"Conversations API"
],
"operationId": "get-single-conversation",
"summary": "Get a single conversation",
"description": "Retrieves the details of a specific conversation",
"security": [],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_conversation"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/toggle_status": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversations API"
],
"operationId": "resolve-conversation",
"summary": "Resolve a conversation",
"description": "Marks a conversation as resolved",
"security": [],
"responses": {
"200": {
"description": "Conversation resolved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_conversation"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/toggle_typing": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversations API"
],
"operationId": "toggle-typing-status",
"summary": "Toggle typing status",
"description": "Toggles the typing status in a conversation",
"security": [],
"parameters": [
{
"name": "typing_status",
"in": "query",
"required": true,
"schema": {
"type": "string"
},
"description": "Typing status, either 'on' or 'off'"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"typing_status": {
"type": "string",
"enum": [
"on",
"off"
],
"description": "The typing status to set",
"example": "on"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Typing status toggled successfully"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/update_last_seen": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversations API"
],
"operationId": "update-last-seen",
"summary": "Update last seen",
"description": "Updates the last seen time of the contact in a conversation",
"security": [],
"responses": {
"200": {
"description": "Last seen updated successfully"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/messages": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Messages API"
],
"operationId": "create-a-message",
"summary": "Create a message",
"description": "Create a message",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_message_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_message"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"get": {
"tags": [
"Messages API"
],
"operationId": "list-all-converation-messages",
"summary": "List all messages",
"description": "List all messages in the conversation",
"security": [],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of messages",
"items": {
"$ref": "#/components/schemas/public_message"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/public/api/v1/inboxes/{inbox_identifier}/contacts/{contact_identifier}/conversations/{conversation_id}/messages/{message_id}": {
"parameters": [
{
"$ref": "#/components/parameters/public_inbox_identifier"
},
{
"$ref": "#/components/parameters/public_contact_identifier"
},
{
"$ref": "#/components/parameters/conversation_id"
},
{
"$ref": "#/components/parameters/message_id"
}
],
"patch": {
"tags": [
"Messages API"
],
"operationId": "update-a-message",
"summary": "Update a message",
"description": "Update a message",
"security": [],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_message_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/public_message"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/survey/responses/{conversation_uuid}": {
"parameters": [
{
"$ref": "#/components/parameters/conversation_uuid"
}
],
"get": {
"tags": [
"CSAT Survey Page"
],
"operationId": "get-csat-survey-page",
"summary": "Get CSAT survey page",
"description": "You can redirect the client to this URL, instead of implementing the CSAT survey component yourself.",
"security": [],
"responses": {
"200": {
"description": "Success"
}
}
}
},
"/api/v1/accounts/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Account"
],
"operationId": "get-account-details",
"summary": "Get account details",
"description": "Get the details of the current account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_show_response"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Account not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Account"
],
"operationId": "update-account",
"summary": "Update account",
"description": "Update account details, settings, and custom attributes",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_update_payload"
}
},
"application/x-www-form-urlencoded": {
"schema": {
"$ref": "#/components/schemas/account_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_detail"
}
}
}
},
"401": {
"description": "Unauthorized (requires administrator role)",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Account not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "Validation error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/audit_logs": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Audit Logs"
],
"operationId": "get-account-audit-logs",
"summary": "List Audit Logs in Account",
"description": "Get Details of Audit Log entries for an Account. This endpoint is only available in Enterprise editions and requires the audit_logs feature to be enabled.",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"name": "page",
"in": "query",
"description": "Page number for pagination",
"required": false,
"schema": {
"type": "integer",
"default": 1
}
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"per_page": {
"type": "integer",
"description": "Number of items per page",
"example": 15
},
"total_entries": {
"type": "integer",
"description": "Total number of audit log entries",
"example": 150
},
"current_page": {
"type": "integer",
"description": "Current page number",
"example": 1
},
"audit_logs": {
"type": "array",
"description": "Array of audit log entries",
"items": {
"$ref": "#/components/schemas/audit_log"
}
}
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "Feature not enabled or not available in current plan",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/agent_bots": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Account AgentBots"
],
"operationId": "list-all-account-agent-bots",
"summary": "List all AgentBots",
"description": "List all agent bots available for the current account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of agent bots",
"items": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Account AgentBots"
],
"operationId": "create-an-account-agent-bot",
"summary": "Create an Agent Bot",
"description": "Create an agent bot in the account",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/agent_bots/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/agent_bot_id"
}
],
"get": {
"tags": [
"Account AgentBots"
],
"operationId": "get-details-of-a-single-account-agent-bot",
"summary": "Get an agent bot details",
"description": "Get the details of an agent bot in the account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given agent bot ID does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Account AgentBots"
],
"operationId": "update-an-account-agent-bot",
"summary": "Update an agent bot",
"description": "Update an agent bot's attributes",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Account AgentBots"
],
"operationId": "delete-an-account-agent-bot",
"summary": "Delete an AgentBot",
"description": "Delete an AgentBot from the account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The agent bot does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/agents": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Agents"
],
"operationId": "get-account-agents",
"summary": "List Agents in Account",
"description": "Get Details of Agents in an Account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of all active agents",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Agents"
],
"operationId": "add-new-agent-to-account",
"summary": "Add a New Agent",
"description": "Add a new Agent to Account",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/agents/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"patch": {
"tags": [
"Agents"
],
"operationId": "update-agent-in-account",
"summary": "Update Agent in Account",
"description": "Update an Agent in Account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the agent to be updated."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent"
}
}
}
},
"404": {
"description": "Agent not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Agents"
],
"operationId": "delete-agent-from-account",
"summary": "Remove an Agent from Account",
"description": "Remove an Agent from Account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the agent to be deleted."
}
],
"responses": {
"200": {
"description": "Success"
},
"404": {
"description": "Agent not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/canned_responses": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Canned Responses"
],
"operationId": "get-account-canned-response",
"summary": "List all Canned Responses in an Account",
"description": "Get Details of Canned Responses in an Account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of all canned responses",
"items": {
"$ref": "#/components/schemas/canned_response"
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Canned Responses"
],
"operationId": "add-new-canned-response-to-account",
"summary": "Add a New Canned Response",
"description": "Add a new Canned Response to Account",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/canned_response_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/canned_response"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/canned_responses/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"patch": {
"tags": [
"Canned Responses"
],
"operationId": "update-canned-response-in-account",
"summary": "Update Canned Response in Account",
"description": "Update a Canned Response in Account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the canned response to be updated."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/canned_response_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/canned_response"
}
}
}
},
"404": {
"description": "Agent not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Canned Responses"
],
"operationId": "delete-canned-response-from-account",
"summary": "Remove a Canned Response from Account",
"description": "Remove a Canned Response from Account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the canned response to be deleted"
}
],
"responses": {
"200": {
"description": "Success"
},
"404": {
"description": "Canned Response not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/custom_attribute_definitions": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Custom Attributes"
],
"operationId": "get-account-custom-attribute",
"summary": "List all custom attributes in an account",
"parameters": [
{
"name": "attribute_model",
"in": "query",
"schema": {
"type": "string",
"enum": [
"0",
"1"
]
},
"description": "conversation_attribute(0)/contact_attribute(1)",
"required": true
}
],
"description": "Get details of custom attributes in an Account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of all custom attributes",
"items": {
"$ref": "#/components/schemas/custom_attribute"
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Custom Attributes"
],
"operationId": "add-new-custom-attribute-to-account",
"summary": "Add a new custom attribute",
"description": "Add a new custom attribute to account",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_attribute_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_attribute"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/custom_attribute_definitions/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the custom attribute",
"required": true
}
],
"get": {
"tags": [
"Custom Attributes"
],
"operationId": "get-details-of-a-single-custom-attribute",
"summary": "Get a custom attribute details",
"security": [
{
"userApiKey": []
}
],
"description": "Get the details of a custom attribute in the account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the custom attribute to be updated."
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_attribute"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given attribute ID does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Custom Attributes"
],
"operationId": "update-custom-attribute-in-account",
"summary": "Update custom attribute in Account",
"description": "Update a custom attribute in account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the custom attribute to be updated."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_attribute_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_attribute"
}
}
}
},
"404": {
"description": "Agent not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Custom Attributes"
],
"operationId": "delete-custom-attribute-from-account",
"summary": "Remove a custom attribute from account",
"description": "Remove a custom attribute from account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the custom attribute to be deleted"
}
],
"responses": {
"200": {
"description": "Success"
},
"404": {
"description": "Custom attribute not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts": {
"get": {
"tags": [
"Contacts"
],
"operationId": "contactList",
"description": "Listing all the resolved contacts with pagination (Page size = 15). Resolved contacts are the ones with a value for identifier, email or phone number",
"summary": "List Contacts",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/contact_sort_param"
},
{
"$ref": "#/components/parameters/page"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contacts_list_response"
}
}
}
},
"400": {
"description": "Bad Request Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Contacts"
],
"operationId": "contactCreate",
"description": "Create a new Contact",
"summary": "Create Contact",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/extended_contact"
}
}
}
},
"400": {
"description": "Bad Request Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "number"
},
"description": "ID of the contact"
}
],
"get": {
"tags": [
"Contacts"
],
"operationId": "contactDetails",
"summary": "Show Contact",
"security": [
{
"userApiKey": []
}
],
"description": "Get a contact belonging to the account using ID",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_show_response"
}
}
}
},
"404": {
"description": "Contact not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"put": {
"tags": [
"Contacts"
],
"operationId": "contactUpdate",
"summary": "Update Contact",
"security": [
{
"userApiKey": []
}
],
"description": "Update a contact belonging to the account using ID",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_update_payload"
}
}
}
},
"responses": {
"204": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_base"
}
}
}
},
"404": {
"description": "Contact not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Contacts"
],
"operationId": "contactDelete",
"summary": "Delete Contact",
"security": [
{
"userApiKey": []
}
],
"description": "Delete a contact belonging to the account using ID",
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Contact not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/{id}/conversations": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "number"
},
"description": "ID of the contact"
}
],
"get": {
"tags": [
"Contacts"
],
"operationId": "contactConversations",
"summary": "Contact Conversations",
"description": "Get conversations associated with that contact",
"parameters": [
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "number"
},
"description": "ID of the contact"
}
],
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_conversations_response"
}
}
}
},
"404": {
"description": "Contact not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/{id}/labels": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"required": true,
"schema": {
"type": "number"
},
"description": "ID of the contact"
}
],
"get": {
"tags": [
"Contact Labels"
],
"operationId": "list-all-labels-of-a-contact",
"summary": "List Labels",
"description": "Lists all the labels of a contact",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_labels"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Contact not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Contact Labels"
],
"operationId": "contact-add-labels",
"summary": "Add Labels",
"description": "Add labels to a contact. Note that this API would overwrite the existing list of labels associated to the conversation.",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"labels"
],
"properties": {
"labels": {
"type": "array",
"description": "Array of labels (comma-separated strings)",
"items": {
"type": "string"
},
"example": [
"support",
"billing"
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_labels"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Contact not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/search": {
"get": {
"tags": [
"Contacts"
],
"operationId": "contactSearch",
"description": "Search the resolved contacts using a search key, currently supports email search (Page size = 15). Resolved contacts are the ones with a value for identifier, email or phone number",
"summary": "Search Contacts",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "q",
"in": "query",
"schema": {
"type": "string"
},
"description": "Search using contact `name`, `identifier`, `email` or `phone number`"
},
{
"$ref": "#/components/parameters/contact_sort_param"
},
{
"$ref": "#/components/parameters/page"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contacts_list_response"
}
}
}
},
"401": {
"description": "Authentication error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/filter": {
"post": {
"tags": [
"Contacts"
],
"operationId": "contactFilter",
"description": "Filter contacts with custom filter options and pagination",
"summary": "Contact Filter",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "page",
"in": "query",
"schema": {
"type": "number"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"items": {
"type": "object",
"properties": {
"attribute_key": {
"type": "string",
"description": "filter attribute name"
},
"filter_operator": {
"type": "string",
"description": "filter operator name",
"enum": [
"equal_to",
"not_equal_to",
"contains",
"does_not_contain"
]
},
"values": {
"type": "array",
"items": {
"type": "string"
},
"description": "array of the attribute values to filter"
},
"query_operator": {
"type": "string",
"description": "query operator name",
"enum": [
"AND",
"OR"
]
}
}
},
"example": [
{
"attribute_key": "name",
"filter_operator": "equal_to",
"values": [
"en"
],
"query_operator": "AND"
},
{
"attribute_key": "country_code",
"filter_operator": "equal_to",
"values": [
"us"
],
"query_operator": null
}
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contacts_list_response"
}
}
}
},
"400": {
"description": "Bad Request Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/{id}/contact_inboxes": {
"post": {
"tags": [
"Contacts"
],
"operationId": "contactInboxCreation",
"description": "Create a contact inbox record for an inbox",
"summary": "Create contact inbox",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the contact",
"required": true
}
],
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"inbox_id"
],
"properties": {
"inbox_id": {
"type": "number",
"description": "The ID of the inbox",
"example": 1
},
"source_id": {
"type": "string",
"description": "Contact Inbox Source Id"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contact_inboxes"
}
}
}
},
"401": {
"description": "Authentication error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "Incorrect payload",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/contacts/{id}/contactable_inboxes": {
"get": {
"tags": [
"Contacts"
],
"operationId": "contactableInboxesGet",
"description": "Get List of contactable Inboxes",
"summary": "Get Contactable Inboxes",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the contact",
"required": true
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/contactable_inboxes_response"
}
}
}
},
"401": {
"description": "Authentication error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "Incorrect payload",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/automation_rules": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Automation Rule"
],
"operationId": "get-account-automation-rule",
"summary": "List all automation rules in an account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/page"
}
],
"description": "Get details of automation rules in an Account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/automation_rule"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Automation Rule"
],
"operationId": "add-new-automation-rule-to-account",
"summary": "Add a new automation rule",
"description": "Add a new automation rule to account",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/automation_rule_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/automation_rule"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/automation_rules/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the Automation Rule",
"required": true
}
],
"get": {
"tags": [
"Automation Rule"
],
"operationId": "get-details-of-a-single-automation-rule",
"summary": "Get a automation rule details",
"description": "Get the details of a automation rule in the account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the automation rule to be updated."
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/automation_rule"
},
"example": {
"payload": {
"id": 90,
"account_id": 1,
"name": "add-label-bug-if-message-contains-bug",
"description": "add-label-bug-if-message-contains-bug",
"event_name": "message_created",
"conditions": [
{
"values": [
"incoming"
],
"attribute_key": "message_type",
"query_operator": "and",
"filter_operator": "equal_to"
},
{
"values": [
"bug"
],
"attribute_key": "content",
"filter_operator": "contains"
}
],
"actions": [
{
"action_name": "add_label",
"action_params": [
"bugs",
"support-query"
]
}
],
"created_on": 1650555440,
"active": true
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given rule ID does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Automation Rule"
],
"operationId": "update-automation-rule-in-account",
"summary": "Update automation rule in Account",
"description": "Update a automation rule in account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the automation rule to be updated."
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/automation_rule_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/automation_rule"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Rule not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Automation Rule"
],
"operationId": "delete-automation-rule-from-account",
"summary": "Remove a automation rule from account",
"description": "Remove a automation rule from account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the automation rule to be deleted"
}
],
"responses": {
"200": {
"description": "Success"
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "automation rule not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/portals": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"post": {
"tags": [
"Help Center"
],
"operationId": "add-new-portal-to-account",
"summary": "Add a new portal",
"description": "Add a new portal to account",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/portal_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/portal"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"get": {
"tags": [
"Help Center"
],
"operationId": "get-portal",
"summary": "List all portals in an account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"description": "Get details of portals in an Account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/portal"
},
"example": {
"payload": [
{
"id": 4,
"color": "#1F93FF",
"custom_domain": "chatwoot.help",
"header_text": "Handbook",
"homepage_link": "https://www.chatwoot.com",
"name": "Handbook",
"page_title": "Handbook",
"slug": "handbook",
"archived": false,
"account_id": 1,
"config": {
"allowed_locales": [
{
"code": "en",
"articles_count": 32,
"categories_count": 9
}
]
},
"inbox": {
"id": 37,
"avatar_url": "https://example.com/avatar.png",
"channel_id": 1,
"name": "Chatwoot",
"channel_type": "Channel::WebWidget",
"greeting_enabled": true,
"widget_color": "#1F93FF",
"website_url": "chatwoot.com"
},
"logo": {
"id": 19399916,
"portal_id": 4,
"file_type": "image/png",
"account_id": 1,
"file_url": "https://example.com/logo.png",
"blob_id": 21239614,
"filename": "square.png"
},
"meta": {
"all_articles_count": 0,
"categories_count": 9,
"default_locale": "en"
}
}
]
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/portals/{id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/portal_id"
}
],
"patch": {
"tags": [
"Help Center"
],
"operationId": "update-portal-to-account",
"summary": "Update a portal",
"description": "Update a portal to account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/portal_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/portal_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/portal_single"
},
"example": {
"payload": {
"id": 123,
"archived": false,
"color": "#1F93FF",
"config": {
"allowed_locales": [
{
"code": "en",
"articles_count": 32,
"categories_count": 9
}
]
},
"custom_domain": "chatwoot.help",
"header_text": "Handbook",
"homepage_link": "https://www.chatwoot.com",
"name": "Handbook",
"slug": "handbook",
"page_title": "Handbook",
"account_id": 123,
"inbox": {
"id": 123,
"name": "Chatwoot",
"website_url": "chatwoot.com",
"channel_type": "Channel::WebWidget",
"avatar_url": "https://example.com/avatar.png",
"widget_color": "#1F93FF",
"website_token": "4cWzuf9i9jxN9tbnv8K9STKU",
"enable_auto_assignment": true,
"web_widget_script": "<script>...</script>",
"welcome_title": "Hi there ! 🙌🏼",
"welcome_tagline": "We make it simple to connect with us.",
"greeting_enabled": true,
"greeting_message": "Hey there 👋, Thank you for reaching out to us.",
"channel_id": 123,
"working_hours_enabled": true,
"enable_email_collect": true,
"csat_survey_enabled": true,
"timezone": "America/Los_Angeles",
"business_name": "Chatwoot",
"hmac_mandatory": true
},
"logo": {
"id": 123,
"portal_id": 123,
"file_type": "image/png",
"account_id": 123,
"file_url": "https://example.com/logo.png",
"blob_id": 123,
"filename": "square.png"
},
"meta": {
"all_articles_count": 32,
"categories_count": 9,
"default_locale": "en"
}
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Portal not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/portals/{id}/categories": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/portal_id"
}
],
"post": {
"tags": [
"Help Center"
],
"operationId": "add-new-category-to-account",
"summary": "Add a new category",
"description": "Add a new category to portal",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/category_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/category"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/portals/{id}/articles": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/portal_id"
}
],
"post": {
"tags": [
"Help Center"
],
"operationId": "add-new-article-to-account",
"summary": "Add a new article",
"description": "Add a new article to portal",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/article_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/article"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/meta": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Conversations"
],
"operationId": "conversationListMeta",
"description": "Get open, unassigned and all Conversation counts",
"summary": "Get Conversation Counts",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"all",
"open",
"resolved",
"pending",
"snoozed"
],
"default": "open"
},
"description": "Filter by conversation status."
},
{
"name": "q",
"in": "query",
"schema": {
"type": "string"
},
"description": "Filters conversations with messages containing the search term"
},
{
"name": "inbox_id",
"in": "query",
"schema": {
"type": "integer"
}
},
{
"name": "team_id",
"in": "query",
"schema": {
"type": "integer"
}
},
{
"name": "labels",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"mine_count": {
"type": "number"
},
"unassigned_count": {
"type": "number"
},
"assigned_count": {
"type": "number"
},
"all_count": {
"type": "number"
}
}
}
}
}
}
}
},
"400": {
"description": "Bad Request Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Conversations"
],
"operationId": "conversationList",
"description": "List all the conversations with pagination",
"summary": "Conversations List",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"name": "assignee_type",
"in": "query",
"schema": {
"type": "string",
"enum": [
"me",
"unassigned",
"all",
"assigned"
],
"default": "all"
},
"description": "Filter conversations by assignee type."
},
{
"name": "status",
"in": "query",
"schema": {
"type": "string",
"enum": [
"all",
"open",
"resolved",
"pending",
"snoozed"
],
"default": "open"
},
"description": "Filter by conversation status."
},
{
"name": "q",
"in": "query",
"schema": {
"type": "string"
},
"description": "Filters conversations with messages containing the search term"
},
{
"name": "inbox_id",
"in": "query",
"schema": {
"type": "integer"
}
},
{
"name": "team_id",
"in": "query",
"schema": {
"type": "integer"
}
},
{
"name": "labels",
"in": "query",
"schema": {
"type": "array",
"items": {
"type": "string"
}
}
},
{
"name": "page",
"in": "query",
"schema": {
"type": "integer",
"default": 1
},
"description": "paginate through conversations"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_list"
}
}
}
},
"400": {
"description": "Bad Request Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Conversations"
],
"operationId": "newConversation",
"summary": "Create New Conversation",
"description": "Creating a conversation in chatwoot requires a source id. \n\n Learn more about source_id: https://www.chatwoot.com/hc/user-guide/articles/1677839703-how-to-create-an-api-channel-inbox#send-messages-to-the-api-channel",
"security": [
{
"userApiKey": []
},
{
"agentBotApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID of the conversation"
},
"account_id": {
"type": "number",
"description": "Account Id"
},
"inbox_id": {
"type": "number",
"description": "ID of the inbox"
}
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/filter": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"post": {
"tags": [
"Conversations"
],
"operationId": "conversationFilter",
"description": "Filter conversations with custom filter options and pagination",
"summary": "Conversations Filter",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"name": "page",
"in": "query",
"schema": {
"type": "number"
}
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"items": {
"type": "object",
"properties": {
"attribute_key": {
"type": "string",
"description": "filter attribute name"
},
"filter_operator": {
"type": "string",
"description": "filter operator name",
"enum": [
"equal_to",
"not_equal_to",
"contains",
"does_not_contain"
]
},
"values": {
"type": "array",
"items": {
"type": "string"
},
"description": "array of the attribute values to filter"
},
"query_operator": {
"type": "string",
"description": "query operator name",
"enum": [
"AND",
"OR"
]
}
}
},
"example": [
{
"attribute_key": "browser_language",
"filter_operator": "not_equal_to",
"values": [
"en"
],
"query_operator": "AND"
},
{
"attribute_key": "status",
"filter_operator": "equal_to",
"values": [
"pending"
],
"query_operator": null
}
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_list"
}
}
}
},
"400": {
"description": "Bad Request Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"get": {
"tags": [
"Conversations"
],
"operationId": "get-details-of-a-conversation",
"summary": "Conversation Details",
"security": [
{
"userApiKey": []
}
],
"description": "Get all details regarding a conversation with all messages in the conversation",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_show"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Conversations"
],
"operationId": "update-conversation",
"summary": "Update Conversation",
"description": "Update Conversation Attributes",
"security": [
{
"userApiKey": []
},
{
"agentBotApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"priority": {
"type": "string",
"enum": [
"urgent",
"high",
"medium",
"low",
"none"
],
"description": "The priority of the conversation",
"example": "high"
},
"sla_policy_id": {
"type": "number",
"description": "The ID of the SLA policy (Available only in Enterprise edition)",
"example": 1
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/toggle_status": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversations"
],
"operationId": "toggle-status-of-a-conversation",
"summary": "Toggle Status",
"description": "Toggle the status of a conversation. Pass `status` to explicitly set the\nconversation state. Use `snoozed` along with `snoozed_until` to snooze a\nconversation until a specific time. If `snoozed_until` is omitted, the\nconversation is snoozed until the next reply from the contact. Regardless\nof the value provided, snoozed conversations always reopen on the next\nreply from the contact.",
"security": [
{
"userApiKey": []
},
{
"agentBotApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"status"
],
"properties": {
"status": {
"type": "string",
"enum": [
"open",
"resolved",
"pending",
"snoozed"
],
"description": "The status of the conversation",
"example": "open"
},
"snoozed_until": {
"type": "number",
"description": "When status is `snoozed`, schedule the reopen time as a Unix timestamp in seconds. If not provided, the conversation is snoozed until the next customer reply. The conversation always reopens when the customer replies.",
"example": 1757506877
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"meta": {
"type": "object"
},
"payload": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"current_status": {
"type": "string",
"enum": [
"open",
"resolved",
"pending",
"snoozed"
]
},
"conversation_id": {
"type": "number"
}
}
}
}
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/toggle_priority": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversations"
],
"operationId": "toggle-priority-of-a-conversation",
"summary": "Toggle Priority",
"description": "Toggles the priority of conversation",
"security": [
{
"userApiKey": []
},
{
"agentBotApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"priority"
],
"properties": {
"priority": {
"type": "string",
"enum": [
"urgent",
"high",
"medium",
"low",
"none"
],
"description": "The priority of the conversation",
"example": "high"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/custom_attributes": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversations"
],
"operationId": "update-custom-attributes-of-a-conversation",
"summary": "Update Custom Attributes",
"description": "Updates the custom attributes of a conversation",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"custom_attributes"
],
"properties": {
"custom_attributes": {
"type": "object",
"description": "The custom attributes to be set for the conversation",
"example": {
"order_id": "12345",
"previous_conversation": "67890"
}
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the conversation"
}
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/assignments": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"post": {
"tags": [
"Conversation Assignments"
],
"operationId": "assign-a-conversation",
"summary": "Assign Conversation",
"description": "Assign a conversation to an agent or a team",
"security": [
{
"userApiKey": []
},
{
"agentBotApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"assignee_id": {
"type": "number",
"description": "Id of the assignee user",
"example": 1
},
"team_id": {
"type": "number",
"description": "Id of the team. If the assignee_id is present, this param would be ignored",
"example": 1
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/labels": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"get": {
"tags": [
"Conversations"
],
"operationId": "list-all-labels-of-a-conversation",
"summary": "List Labels",
"security": [
{
"userApiKey": []
}
],
"description": "Lists all the labels of a conversation",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_labels"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Conversations"
],
"operationId": "conversation-add-labels",
"summary": "Add Labels",
"security": [
{
"userApiKey": []
}
],
"description": "Add labels to a conversation. Note that this API would overwrite the existing list of labels associated to the conversation.",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"labels"
],
"properties": {
"labels": {
"type": "array",
"description": "Array of labels (comma-separated strings)",
"items": {
"type": "string"
},
"example": [
"support",
"billing"
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_labels"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/reporting_events": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"get": {
"tags": [
"Conversations"
],
"operationId": "get-conversation-reporting-events",
"summary": "Conversation Reporting Events",
"security": [
{
"userApiKey": []
}
],
"description": "Get reporting events for a specific conversation. This endpoint returns events such as first response time, resolution time, and other metrics for the conversation, sorted by creation time in ascending order.",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"items": {
"$ref": "#/components/schemas/reporting_event"
},
"description": "Array of reporting events for the conversation"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inboxes": {
"get": {
"tags": [
"Inboxes"
],
"operationId": "listAllInboxes",
"summary": "List all inboxes",
"description": "List all inboxes available in the current account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of inboxes",
"items": {
"$ref": "#/components/schemas/inbox"
}
}
}
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inboxes/{id}/": {
"get": {
"tags": [
"Inboxes"
],
"operationId": "GetInbox",
"summary": "Get an inbox",
"security": [
{
"userApiKey": []
}
],
"description": "Get an inbox available in the current account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the inbox",
"required": true
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inbox"
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inboxes/": {
"post": {
"tags": [
"Inboxes"
],
"operationId": "inboxCreation",
"summary": "Create an inbox",
"description": "You can create more than one website inbox in each account",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inbox_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inbox"
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inboxes/{id}": {
"patch": {
"tags": [
"Inboxes"
],
"operationId": "updateInbox",
"summary": "Update Inbox",
"security": [
{
"userApiKey": []
}
],
"description": "Update an existing inbox",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the inbox",
"required": true
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inbox_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/inbox"
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inboxes/{id}/agent_bot": {
"get": {
"tags": [
"Inboxes"
],
"operationId": "getInboxAgentBot",
"summary": "Show Inbox Agent Bot",
"description": "See if an agent bot is associated to the Inbox",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the inbox",
"required": true
}
],
"responses": {
"204": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/agent_bot"
}
}
}
},
"404": {
"description": "Inbox not found, Agent bot not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inboxes/{id}/set_agent_bot": {
"post": {
"tags": [
"Inboxes"
],
"operationId": "updateAgentBot",
"summary": "Add or remove agent bot",
"security": [
{
"userApiKey": []
}
],
"description": "To add an agent bot pass agent_bot id, to remove agent bot from an inbox pass null",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "id",
"in": "path",
"schema": {
"type": "number"
},
"description": "ID of the inbox",
"required": true
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"agent_bot"
],
"properties": {
"agent_bot": {
"type": "number",
"description": "Agent bot ID",
"example": 1
}
}
}
}
}
},
"responses": {
"204": {
"description": "Success"
},
"404": {
"description": "Inbox not found, Agent bot not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inbox_members/{inbox_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/inbox_id"
}
],
"get": {
"tags": [
"Inboxes"
],
"operationId": "get-inbox-members",
"summary": "List Agents in Inbox",
"description": "Get Details of Agents in an Inbox",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/inbox_id"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of all active agents",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/inbox_members": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"post": {
"tags": [
"Inboxes"
],
"operationId": "add-new-agent-to-inbox",
"summary": "Add a New Agent",
"description": "Add a new Agent to Inbox",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"inbox_id",
"user_ids"
],
"properties": {
"inbox_id": {
"type": "integer",
"description": "The ID of the inbox",
"example": 1
},
"user_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of users to be added to the inbox",
"example": [
1
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of all active agents",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "User must exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Inboxes"
],
"operationId": "update-agents-in-inbox",
"summary": "Update Agents in Inbox",
"description": "All agents except the one passed in params will be removed",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"inbox_id",
"user_ids"
],
"properties": {
"inbox_id": {
"type": "string",
"description": "The ID of the inbox",
"example": 1
},
"user_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of users to be added to the inbox",
"example": [
1
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of all active agents",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
}
}
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "User must exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Inboxes"
],
"operationId": "delete-agent-in-inbox",
"summary": "Remove an Agent from Inbox",
"description": "Remove an Agent from Inbox",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"inbox_id",
"user_ids"
],
"properties": {
"inbox_id": {
"type": "string",
"description": "The ID of the inbox"
},
"user_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of users to be deleted from the inbox"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success"
},
"404": {
"description": "Inbox not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "User must exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
}
],
"get": {
"tags": [
"Messages"
],
"operationId": "list-all-messages",
"summary": "Get messages",
"security": [
{
"userApiKey": []
}
],
"description": "List all messages of a conversation",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"labels": {
"type": "array",
"items": {
"type": "string"
}
},
"additional_attributes": {
"type": "object"
},
"contact": {
"$ref": "#/components/schemas/contact"
},
"assignee": {
"$ref": "#/components/schemas/agent"
},
"agent_last_seen_at": {
"type": "string",
"format": "date-time"
},
"assignee_last_seen_at": {
"type": "string",
"format": "date-time"
}
}
},
"payload": {
"type": "array",
"description": "Array of messages",
"items": {
"$ref": "#/components/schemas/message"
}
}
}
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Messages"
],
"operationId": "create-a-new-message-in-a-conversation",
"summary": "Create New Message",
"description": "Create a new message in the conversation.\n\n## WhatsApp Template Messages\n\nFor WhatsApp channels, you can send structured template messages using the `template_params` field. \nTemplates must be pre-approved in WhatsApp Business Manager.\n\n### Example Templates\n\n**Text with Image Header:**\n```json\n{\n \"content\": \"Hi your order 121212 is confirmed. Please wait for further updates\",\n \"template_params\": {\n \"name\": \"order_confirmation\",\n \"category\": \"MARKETING\",\n \"language\": \"en\",\n \"processed_params\": {\n \"body\": {\n \"1\": \"121212\"\n },\n \"header\": {\n \"media_url\": \"https://picsum.photos/200/300\",\n \"media_type\": \"image\"\n }\n }\n }\n}\n```\n\n**Text with Copy Code Button:**\n```json\n{\n \"content\": \"Special offer! Get 30% off your next purchase. Use the code below\",\n \"template_params\": {\n \"name\": \"discount_coupon\",\n \"category\": \"MARKETING\",\n \"language\": \"en\",\n \"processed_params\": {\n \"body\": {\n \"discount_percentage\": \"30\"\n },\n \"buttons\": [{\n \"type\": \"copy_code\",\n \"parameter\": \"SAVE20\"\n }]\n }\n }\n}\n```\n",
"security": [
{
"userApiKey": []
},
{
"agentBotApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_message_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"allOf": [
{
"$ref": "#/components/schemas/generic_id"
},
{
"$ref": "#/components/schemas/message"
}
]
}
}
}
},
"404": {
"description": "Conversation not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/conversations/{conversation_id}/messages/{message_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/conversation_id"
},
{
"$ref": "#/components/parameters/message_id"
}
],
"delete": {
"tags": [
"Messages"
],
"operationId": "delete-a-message",
"summary": "Delete a message",
"security": [
{
"userApiKey": []
}
],
"description": "Delete a message and it's attachments from the conversation.",
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The message or conversation does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/integrations/apps": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Integrations"
],
"operationId": "get-details-of-all-integrations",
"summary": "List all the Integrations",
"security": [
{
"userApiKey": []
}
],
"description": "Get the details of all Integrations available for the account",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of Integration apps",
"items": {
"$ref": "#/components/schemas/integrations_app"
}
}
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Url not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/integrations/hooks": {
"post": {
"tags": [
"Integrations"
],
"operationId": "create-an-integration-hook",
"summary": "Create an integration hook",
"description": "Create an integration hook",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/integrations_hook_create_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/integrations_hook"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/integrations/hooks/{hook_id}": {
"patch": {
"tags": [
"Integrations"
],
"operationId": "update-an-integrations-hook",
"summary": "Update an Integration Hook",
"description": "Update an Integration Hook",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/hook_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/integrations_hook_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/integrations_hook"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Integrations"
],
"operationId": "delete-an-integration-hook",
"summary": "Delete an Integration Hook",
"description": "Delete an Integration Hook",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/hook_id"
}
],
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The hook does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/profile": {
"get": {
"tags": [
"Profile"
],
"operationId": "fetchProfile",
"summary": "Fetch user profile",
"description": "Get the user profile details",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/user"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/teams": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Teams"
],
"operationId": "list-all-teams",
"summary": "List all teams",
"security": [
{
"userApiKey": []
}
],
"description": "List all teams available in the current account",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of teams",
"items": {
"$ref": "#/components/schemas/team"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Teams"
],
"operationId": "create-a-team",
"summary": "Create a team",
"security": [
{
"userApiKey": []
}
],
"description": "Create a team in the account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/team_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/team"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/teams/{team_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/team_id"
}
],
"get": {
"tags": [
"Teams"
],
"operationId": "get-details-of-a-single-team",
"summary": "Get a team details",
"security": [
{
"userApiKey": []
}
],
"description": "Get the details of a team in the account",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/team"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given team ID does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Teams"
],
"operationId": "update-a-team",
"summary": "Update a team",
"security": [
{
"userApiKey": []
}
],
"description": "Update a team's attributes",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/team_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/team"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Teams"
],
"operationId": "delete-a-team",
"summary": "Delete a team",
"security": [
{
"userApiKey": []
}
],
"description": "Delete a team from the account",
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The team does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/teams/{team_id}/team_members": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/team_id"
}
],
"get": {
"tags": [
"Teams"
],
"operationId": "get-team-members",
"summary": "List Agents in Team",
"description": "Get Details of Agents in an Team",
"security": [
{
"userApiKey": []
}
],
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/team_id"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of all agents in the team",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Team not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Teams"
],
"operationId": "add-new-agent-to-team",
"summary": "Add a New Agent",
"description": "Add a new Agent to Team",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"user_ids"
],
"properties": {
"user_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of users to be added to the team",
"example": [
1
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of all active agents",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Team not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "User must exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Teams"
],
"operationId": "update-agents-in-team",
"summary": "Update Agents in Team",
"description": "All agents except the one passed in params will be removed",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"user_ids"
],
"properties": {
"user_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of users to be added to the team",
"example": [
1
]
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of all agents in the team",
"items": {
"$ref": "#/components/schemas/agent"
}
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Team not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "User must exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Teams"
],
"operationId": "delete-agent-in-team",
"summary": "Remove an Agent from Team",
"description": "Remove an Agent from Team",
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"user_ids"
],
"properties": {
"user_ids": {
"type": "array",
"items": {
"type": "integer"
},
"description": "IDs of users to be deleted from the team"
}
}
}
}
}
},
"responses": {
"200": {
"description": "Success"
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "Team not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"422": {
"description": "User must exist",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/custom_filters": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"in": "query",
"name": "filter_type",
"schema": {
"type": "string",
"enum": [
"conversation",
"contact",
"report"
]
},
"required": false,
"description": "The type of custom filter"
}
],
"get": {
"tags": [
"Custom Filters"
],
"operationId": "list-all-filters",
"summary": "List all custom filters",
"description": "List all custom filters in a category of a user",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of custom filters",
"items": {
"$ref": "#/components/schemas/custom_filter"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Custom Filters"
],
"operationId": "create-a-custom-filter",
"summary": "Create a custom filter",
"description": "Create a custom filter in the account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"security": [
{
"userApiKey": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_filter_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_filter"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/custom_filters/{custom_filter_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/custom_filter_id"
}
],
"get": {
"tags": [
"Custom Filters"
],
"operationId": "get-details-of-a-single-custom-filter",
"summary": "Get a custom filter details",
"description": "Get the details of a custom filter in the account",
"security": [
{
"userApiKey": []
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_filter"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The given team ID does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"patch": {
"tags": [
"Custom Filters"
],
"operationId": "update-a-custom-filter",
"summary": "Update a custom filter",
"security": [
{
"userApiKey": []
}
],
"description": "Update a custom filter's attributes",
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_filter_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/custom_filter"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Custom Filters"
],
"operationId": "delete-a-custom-filter",
"summary": "Delete a custom filter",
"security": [
{
"userApiKey": []
}
],
"description": "Delete a custom filter from the account",
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"404": {
"description": "The custom filter does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/webhooks": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Webhooks"
],
"operationId": "list-all-webhooks",
"summary": "List all webhooks",
"security": [
{
"userApiKey": []
}
],
"description": "List all webhooks in the account",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of webhook objects",
"items": {
"$ref": "#/components/schemas/webhook"
}
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"post": {
"tags": [
"Webhooks"
],
"operationId": "create-a-webhook",
"summary": "Add a webhook",
"security": [
{
"userApiKey": []
}
],
"description": "Add a webhook subscription to the account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/webhook_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/webhook"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/webhooks/{webhook_id}": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/webhook_id"
}
],
"patch": {
"tags": [
"Webhooks"
],
"operationId": "update-a-webhook",
"summary": "Update a webhook object",
"security": [
{
"userApiKey": []
}
],
"description": "Update a webhook object in the account",
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/webhook_create_update_payload"
}
}
}
},
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/webhook"
}
}
}
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
},
"delete": {
"tags": [
"Webhooks"
],
"operationId": "delete-a-webhook",
"summary": "Delete a webhook",
"security": [
{
"userApiKey": []
}
],
"description": "Delete a webhook from the account",
"responses": {
"200": {
"description": "Success"
},
"401": {
"description": "Unauthorized",
"content": {
"application/json": {
"schema": {
"type": "object"
}
}
}
},
"404": {
"description": "The webhook does not exist in the account",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v1/accounts/{account_id}/reporting_events": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
}
],
"get": {
"tags": [
"Reports"
],
"operationId": "get-account-reporting-events",
"summary": "Account Reporting Events",
"security": [
{
"userApiKey": []
}
],
"description": "Get paginated reporting events for the account. This endpoint returns reporting events such as first response time, resolution time, and other metrics. Only administrators can access this endpoint. Results are paginated with 25 items per page.",
"parameters": [
{
"$ref": "#/components/parameters/page"
},
{
"in": "query",
"name": "since",
"schema": {
"type": "string"
},
"description": "The timestamp from where events should start (Unix timestamp in seconds)"
},
{
"in": "query",
"name": "until",
"schema": {
"type": "string"
},
"description": "The timestamp from where events should stop (Unix timestamp in seconds)"
},
{
"in": "query",
"name": "inbox_id",
"schema": {
"type": "number"
},
"description": "Filter events by inbox ID"
},
{
"in": "query",
"name": "user_id",
"schema": {
"type": "number"
},
"description": "Filter events by user/agent ID"
},
{
"in": "query",
"name": "name",
"schema": {
"type": "string"
},
"description": "Filter events by event name (e.g., first_response, resolution, reply_time)"
}
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/reporting_events_list_response"
}
}
}
},
"403": {
"description": "Access denied - Only administrators can access this endpoint",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v2/accounts/{account_id}/reports": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/report_metric"
},
{
"$ref": "#/components/parameters/report_type"
},
{
"in": "query",
"name": "id",
"schema": {
"type": "string"
},
"description": "The Id of specific object in case of agent/inbox/label"
},
{
"in": "query",
"name": "since",
"schema": {
"type": "string"
},
"description": "The timestamp from where report should start."
},
{
"in": "query",
"name": "until",
"schema": {
"type": "string"
},
"description": "The timestamp from where report should stop."
}
],
"get": {
"tags": [
"Reports"
],
"operationId": "list-all-conversation-statistics",
"summary": "Get Account reports",
"security": [
{
"userApiKey": []
}
],
"description": "Get Account reports for a specific type, metric and date range",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of date based conversation statistics",
"items": {
"type": "object",
"properties": {
"value": {
"type": "string"
},
"timestamp": {
"type": "number"
}
}
}
}
}
}
},
"404": {
"description": "reports not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v2/accounts/{account_id}/reports/summary": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"$ref": "#/components/parameters/report_type"
},
{
"in": "query",
"name": "id",
"schema": {
"type": "string"
},
"description": "The Id of specific object in case of agent/inbox/label"
},
{
"in": "query",
"name": "since",
"schema": {
"type": "string"
},
"description": "The timestamp from where report should start."
},
{
"in": "query",
"name": "until",
"schema": {
"type": "string"
},
"description": "The timestamp from where report should stop."
}
],
"get": {
"tags": [
"Reports"
],
"operationId": "list-all-conversation-statistics-summary",
"summary": "Get Account reports summary",
"security": [
{
"userApiKey": []
}
],
"description": "Get Account reports summary for a specific type and date range",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/account_summary"
}
}
}
},
"404": {
"description": "reports not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v2/accounts/{account_id}/reports/conversations": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"in": "query",
"name": "type",
"schema": {
"type": "string",
"enum": [
"account"
]
},
"required": true,
"description": "Type of report"
}
],
"get": {
"tags": [
"Reports"
],
"operationId": "get-account-conversation-metrics",
"summary": "Account Conversation Metrics",
"security": [
{
"userApiKey": []
}
],
"description": "Get conversation metrics for Account",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "Object of account conversation metrics",
"properties": {
"open": {
"type": "number"
},
"unattended": {
"type": "number"
},
"unassigned": {
"type": "number"
}
}
}
}
}
},
"404": {
"description": "reports not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/api/v2/accounts/{account_id}/reports/conversations/": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"in": "query",
"name": "type",
"schema": {
"type": "string",
"enum": [
"agent"
]
},
"required": true,
"description": "Type of report"
},
{
"in": "query",
"name": "user_id",
"schema": {
"type": "string"
},
"description": "The numeric ID of the user"
}
],
"get": {
"tags": [
"Reports"
],
"operationId": "get-agent-conversation-metrics",
"summary": "Agent Conversation Metrics",
"security": [
{
"userApiKey": []
}
],
"description": "Get conversation metrics for Agent",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"type": "array",
"description": "Array of agent based conversation metrics",
"items": {
"$ref": "#/components/schemas/agent_conversation_metrics"
}
}
}
}
},
"404": {
"description": "reports not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
},
"403": {
"description": "Access denied",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/bad_request_error"
}
}
}
}
}
}
},
"/accounts/{account_id}/conversations/{conversation_id}/messages": {
"parameters": [
{
"$ref": "#/components/parameters/account_id"
},
{
"name": "conversation_id",
"in": "path",
"description": "ID of the conversation",
"required": true,
"schema": {
"type": "number"
}
}
],
"get": {
"tags": [
"Conversation"
],
"summary": "Get messages from a conversation",
"description": "Returns all messages from a specific conversation",
"operationId": "getConversationMessages",
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/conversation_messages"
}
}
}
}
}
}
}
},
"components": {
"schemas": {
"bad_request_error": {
"title": "data",
"type": "object",
"properties": {
"description": {
"type": "string"
},
"errors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/request_error"
}
}
}
},
"request_error": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"message": {
"type": "string"
},
"code": {
"type": "string"
}
}
},
"generic_id": {
"type": "object",
"properties": {
"id": {
"type": "number"
}
}
},
"canned_response": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "ID of the canned response"
},
"account_id": {
"type": "integer",
"description": "Account Id"
},
"short_code": {
"type": "string",
"description": "Short Code for quick access of the canned response"
},
"content": {
"type": "string",
"description": "Message content for canned response"
},
"created_at": {
"type": "string",
"description": "The date and time when the canned response was created"
},
"updated_at": {
"type": "string",
"description": "The date and time when the canned response was updated"
}
}
},
"custom_attribute": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Identifier"
},
"attribute_display_name": {
"type": "string",
"description": "Attribute display name"
},
"attribute_display_type": {
"type": "string",
"description": "Attribute display type (text, number, currency, percent, link, date, list, checkbox)"
},
"attribute_description": {
"type": "string",
"description": "Attribute description"
},
"attribute_key": {
"type": "string",
"description": "Attribute unique key value"
},
"regex_pattern": {
"type": "string",
"description": "Regex pattern"
},
"regex_cue": {
"type": "string",
"description": "Regex cue"
},
"attribute_values": {
"type": "string",
"description": "Attribute values"
},
"attribute_model": {
"type": "string",
"description": "Attribute type(conversation_attribute/contact_attribute)"
},
"default_value": {
"type": "string",
"description": "Attribute default value"
},
"created_at": {
"type": "string",
"description": "The date and time when the custom attribute was created"
},
"updated_at": {
"type": "string",
"description": "The date and time when the custom attribute was updated"
}
}
},
"automation_rule": {
"type": "object",
"properties": {
"payload": {
"description": "Response payload that contains automation rule(s)",
"oneOf": [
{
"type": "array",
"description": "Array of automation rules (for listing endpoint)",
"items": {
"$ref": "#/components/schemas/automation_rule_item"
}
},
{
"type": "object",
"description": "Single automation rule (for show/create/update endpoints)",
"allOf": [
{
"$ref": "#/components/schemas/automation_rule_item"
}
]
}
]
}
}
},
"automation_rule_item": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The ID of the automation rule"
},
"account_id": {
"type": "integer",
"description": "Account Id"
},
"name": {
"type": "string",
"description": "The name of the rule",
"example": "Add label on message create event"
},
"description": {
"type": "string",
"description": "Description to give more context about the rule",
"example": "Add label support and sales on message create event if incoming message content contains text help"
},
"event_name": {
"type": "string",
"description": "Automation Rule event, on which we call the actions(conversation_created, conversation_updated, message_created)",
"enum": [
"conversation_created",
"conversation_updated",
"message_created"
],
"example": "message_created"
},
"conditions": {
"type": "array",
"description": "Array of conditions on which conversation/message filter would work",
"items": {
"type": "object",
"properties": {
"values": {
"type": "array",
"items": {
"type": "string"
}
},
"attribute_key": {
"type": "string"
},
"query_operator": {
"type": "string"
},
"filter_operator": {
"type": "string"
}
},
"example": {
"attribute_key": "content",
"filter_operator": "contains",
"values": [
"help"
],
"query_operator": "and"
}
}
},
"actions": {
"type": "array",
"description": "Array of actions which we perform when condition matches",
"items": {
"type": "object",
"properties": {
"action_name": {
"type": "string"
},
"action_params": {
"type": "array",
"items": {
"type": "string"
}
}
},
"example": {
"action_name": "add_label",
"action_params": [
"support",
"sales"
]
}
}
},
"created_on": {
"type": "integer",
"description": "The timestamp when the rule was created"
},
"active": {
"type": "boolean",
"description": "Enable/disable automation rule"
}
}
},
"portal": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"items": {
"$ref": "#/components/schemas/portal_item"
}
}
}
},
"portal_single": {
"type": "object",
"properties": {
"payload": {
"$ref": "#/components/schemas/portal_item"
}
}
},
"portal_config": {
"type": "object",
"description": "Configuration settings for the portal",
"properties": {
"allowed_locales": {
"type": "array",
"description": "List of allowed locales for the portal",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"description": "The language code"
},
"articles_count": {
"type": "integer",
"description": "Number of articles in this locale"
},
"categories_count": {
"type": "integer",
"description": "Number of categories in this locale"
}
}
}
}
}
},
"portal_logo": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "ID of the logo file"
},
"portal_id": {
"type": "integer",
"description": "ID of the portal this logo belongs to"
},
"file_type": {
"type": "string",
"description": "MIME type of the file"
},
"account_id": {
"type": "integer",
"description": "ID of the account"
},
"file_url": {
"type": "string",
"description": "URL to access the logo file"
},
"blob_id": {
"type": "integer",
"description": "ID of the blob"
},
"filename": {
"type": "string",
"description": "Name of the file"
}
}
},
"portal_meta": {
"type": "object",
"properties": {
"all_articles_count": {
"type": "integer",
"description": "Total number of articles"
},
"archived_articles_count": {
"type": "integer",
"nullable": true,
"description": "Number of archived articles"
},
"published_count": {
"type": "integer",
"nullable": true,
"description": "Number of published articles"
},
"draft_articles_count": {
"type": "integer",
"nullable": true,
"description": "Number of draft articles"
},
"categories_count": {
"type": "integer",
"description": "Number of categories"
},
"default_locale": {
"type": "string",
"description": "Default locale for the portal"
}
}
},
"portal_item": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "The ID of the portal"
},
"archived": {
"type": "boolean",
"description": "Whether the portal is archived"
},
"color": {
"type": "string",
"description": "The color code for the portal"
},
"config": {
"$ref": "#/components/schemas/portal_config"
},
"custom_domain": {
"type": "string",
"description": "Custom domain for the portal"
},
"header_text": {
"type": "string",
"description": "The header text for the portal"
},
"homepage_link": {
"type": "string",
"description": "Homepage link for the portal"
},
"name": {
"type": "string",
"description": "Name of the portal"
},
"slug": {
"type": "string",
"description": "URL slug for the portal"
},
"page_title": {
"type": "string",
"description": "Page title for the portal"
},
"account_id": {
"type": "integer",
"description": "ID of the account the portal belongs to"
},
"inbox": {
"$ref": "#/components/schemas/inbox"
},
"logo": {
"$ref": "#/components/schemas/portal_logo"
},
"meta": {
"$ref": "#/components/schemas/portal_meta"
}
}
},
"category": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"description": {
"type": "string",
"description": "The text content."
},
"locale": {
"type": "string"
},
"name": {
"type": "string"
},
"slug": {
"type": "string"
},
"position": {
"type": "integer"
},
"portal_id": {
"type": "integer"
},
"account_id": {
"type": "integer"
},
"associated_category_id": {
"type": "integer",
"description": "To associate similar categories to each other, e.g same category of product documentation in different languages"
},
"parent_category_id": {
"type": "integer",
"description": "To define parent category, e.g product documentation has multiple level features in sales category or in engineering category."
}
}
},
"article": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"content": {
"type": "string",
"description": "The text content."
},
"meta": {
"type": "object"
},
"position": {
"type": "integer"
},
"status": {
"type": "integer",
"enum": [
"draft",
"published",
"archived"
]
},
"title": {
"type": "string"
},
"slug": {
"type": "string"
},
"views": {
"type": "integer"
},
"portal_id": {
"type": "integer"
},
"account_id": {
"type": "integer"
},
"author_id": {
"type": "integer"
},
"category_id": {
"type": "integer"
},
"folder_id": {
"type": "integer"
},
"associated_article_id": {
"type": "integer",
"description": "To associate similar articles to each other, e.g to provide the link for the reference."
}
}
},
"contact": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"items": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The object containing additional attributes related to the contact"
},
"availability_status": {
"type": "string",
"description": "The availability status of the contact"
},
"email": {
"type": "string",
"description": "The email address of the contact"
},
"id": {
"type": "integer",
"description": "The ID of the contact"
},
"name": {
"type": "string",
"description": "The name of the contact"
},
"phone_number": {
"type": "string",
"description": "The phone number of the contact"
},
"blocked": {
"type": "boolean",
"description": "Whether the contact is blocked"
},
"identifier": {
"type": "string",
"description": "The identifier of the contact"
},
"thumbnail": {
"type": "string",
"description": "The thumbnail of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the contact",
"example": {
"attribute_key": "attribute_value",
"signed_up_at": "dd/mm/yyyy"
}
},
"last_activity_at": {
"type": "integer",
"description": "The last activity at of the contact"
},
"created_at": {
"type": "integer",
"description": "The created at of the contact"
},
"contact_inboxes": {
"type": "array",
"items": {
"$ref": "#/components/schemas/contact_inboxes"
}
}
}
}
}
}
},
"conversation": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID of the conversation"
},
"messages": {
"type": "array",
"items": {
"$ref": "#/components/schemas/message"
}
},
"account_id": {
"type": "number",
"description": "Account Id"
},
"uuid": {
"type": "string",
"description": "UUID of the conversation"
},
"additional_attributes": {
"type": "object",
"description": "The object containing additional attributes related to the conversation"
},
"agent_last_seen_at": {
"type": "number",
"description": "The last activity at of the agent"
},
"assignee_last_seen_at": {
"type": "number",
"description": "The last activity at of the assignee"
},
"can_reply": {
"type": "boolean",
"description": "Whether the conversation can be replied to"
},
"contact_last_seen_at": {
"type": "number",
"description": "The last activity at of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The object to save custom attributes for conversation, accepts custom attributes key and value"
},
"inbox_id": {
"type": "number",
"description": "ID of the inbox"
},
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "The labels of the conversation"
},
"muted": {
"type": "boolean",
"description": "Whether the conversation is muted"
},
"snoozed_until": {
"type": "number",
"description": "The time at which the conversation will be unmuted"
},
"status": {
"type": "string",
"enum": [
"open",
"resolved",
"pending"
],
"description": "The status of the conversation"
},
"created_at": {
"type": "number",
"description": "The time at which conversation was created"
},
"updated_at": {
"type": "number",
"description": "The time at which conversation was updated"
},
"timestamp": {
"type": "string",
"description": "The time at which conversation was created"
},
"first_reply_created_at": {
"type": "number",
"description": "The time at which the first reply was created"
},
"unread_count": {
"type": "number",
"description": "The number of unread messages"
},
"last_non_activity_message": {
"$ref": "#/components/schemas/message"
},
"last_activity_at": {
"type": "number",
"description": "The last activity at of the conversation"
},
"priority": {
"type": "string",
"description": "The priority of the conversation"
},
"waiting_since": {
"type": "number",
"description": "The time at which the conversation was waiting"
},
"sla_policy_id": {
"type": "number",
"description": "The ID of the SLA policy"
},
"applied_sla": {
"type": "object",
"description": "The applied SLA"
},
"sla_events": {
"type": "array",
"items": {
"type": "object",
"description": "SLA event objects"
}
}
}
},
"message": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "The ID of the message"
},
"content": {
"type": "string",
"description": "The text content of the message"
},
"account_id": {
"type": "number",
"description": "The ID of the account"
},
"inbox_id": {
"type": "number",
"description": "The ID of the inbox"
},
"conversation_id": {
"type": "number",
"description": "The ID of the conversation"
},
"message_type": {
"type": "integer",
"enum": [
0,
1,
2
],
"description": "The type of the message"
},
"created_at": {
"type": "integer",
"description": "The time at which message was created"
},
"updated_at": {
"type": "integer",
"description": "The time at which message was updated"
},
"private": {
"type": "boolean",
"description": "The flags which shows whether the message is private or not"
},
"status": {
"type": "string",
"enum": [
"sent",
"delivered",
"read",
"failed"
],
"description": "The status of the message"
},
"source_id": {
"type": "string",
"description": "The source ID of the message"
},
"content_type": {
"type": "string",
"enum": [
"text",
"input_select",
"cards",
"form"
],
"description": "The type of the template message"
},
"content_attributes": {
"type": "object",
"description": "The content attributes for each content_type"
},
"sender_type": {
"type": "string",
"enum": [
"contact",
"agent",
"agent_bot"
],
"description": "The type of the sender"
},
"sender_id": {
"type": "number",
"description": "The ID of the sender"
},
"external_source_ids": {
"type": "object",
"description": "The external source IDs of the message"
},
"additional_attributes": {
"type": "object",
"description": "The additional attributes of the message"
},
"processed_message_content": {
"type": "string",
"description": "The processed message content"
},
"sentiment": {
"type": "object",
"description": "The sentiment of the message"
},
"conversation": {
"type": "object",
"description": "The conversation object"
},
"attachment": {
"type": "object",
"description": "The file object attached to the image"
},
"sender": {
"type": "object",
"description": "User/Agent/AgentBot object"
}
}
},
"user": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"access_token": {
"type": "string"
},
"account_id": {
"type": "number"
},
"available_name": {
"type": "string"
},
"avatar_url": {
"type": "string"
},
"confirmed": {
"type": "boolean"
},
"display_name": {
"type": "string",
"nullable": true
},
"message_signature": {
"type": "string",
"nullable": true
},
"email": {
"type": "string"
},
"hmac_identifier": {
"type": "string"
},
"inviter_id": {
"type": "number"
},
"name": {
"type": "string"
},
"provider": {
"type": "string"
},
"pubsub_token": {
"type": "string"
},
"role": {
"type": "string",
"enum": [
"agent",
"administrator"
]
},
"ui_settings": {
"type": "object"
},
"uid": {
"type": "string"
},
"type": {
"type": "string",
"nullable": true
},
"custom_attributes": {
"type": "object",
"description": "Available for users who are created through platform APIs and has custom attributes associated."
},
"accounts": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"status": {
"type": "string"
},
"active_at": {
"type": "string",
"format": "date-time"
},
"role": {
"type": "string",
"enum": [
"administrator",
"agent"
]
},
"permissions": {
"type": "array",
"items": {
"type": "string"
}
},
"availability": {
"type": "string"
},
"availability_status": {
"type": "string"
},
"auto_offline": {
"type": "boolean"
},
"custom_role_id": {
"type": "number",
"nullable": true
},
"custom_role": {
"type": "object",
"nullable": true
}
}
}
}
}
},
"agent": {
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"account_id": {
"type": "integer"
},
"availability_status": {
"type": "string",
"enum": [
"available",
"busy",
"offline"
],
"description": "The availability status of the agent computed by Chatwoot."
},
"auto_offline": {
"type": "boolean",
"description": "Whether the availability status of agent is configured to go offline automatically when away."
},
"confirmed": {
"type": "boolean",
"description": "Whether the agent has confirmed their email address."
},
"email": {
"type": "string",
"description": "The email of the agent"
},
"available_name": {
"type": "string",
"description": "The available name of the agent"
},
"name": {
"type": "string",
"description": "The name of the agent"
},
"role": {
"type": "string",
"enum": [
"agent",
"administrator"
],
"description": "The role of the agent"
},
"thumbnail": {
"type": "string",
"description": "The thumbnail of the agent"
},
"custom_role_id": {
"type": "integer",
"description": "The custom role id of the agent"
}
}
},
"inbox": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID of the inbox"
},
"name": {
"type": "string",
"description": "The name of the inbox"
},
"website_url": {
"type": "string",
"description": "Website URL"
},
"channel_type": {
"type": "string",
"description": "The type of the inbox"
},
"avatar_url": {
"type": "string",
"description": "The avatar image of the inbox"
},
"widget_color": {
"type": "string",
"description": "Widget Color used for customization of the widget"
},
"website_token": {
"type": "string",
"description": "Website Token"
},
"enable_auto_assignment": {
"type": "boolean",
"description": "The flag which shows whether Auto Assignment is enabled or not"
},
"web_widget_script": {
"type": "string",
"description": "Script used to load the website widget"
},
"welcome_title": {
"type": "string",
"description": "Welcome title to be displayed on the widget"
},
"welcome_tagline": {
"type": "string",
"description": "Welcome tagline to be displayed on the widget"
},
"greeting_enabled": {
"type": "boolean",
"description": "The flag which shows whether greeting is enabled"
},
"greeting_message": {
"type": "string",
"description": "A greeting message when the user starts the conversation"
},
"channel_id": {
"type": "number",
"description": "ID of the channel this inbox belongs to"
},
"working_hours_enabled": {
"type": "boolean",
"description": "The flag which shows whether working hours feature is enabled"
},
"enable_email_collect": {
"type": "boolean",
"description": "The flag to enable collecting email from contacts"
},
"csat_survey_enabled": {
"type": "boolean",
"description": "The flag to enable CSAT survey"
},
"auto_assignment_config": {
"type": "object",
"description": "Configuration settings for auto assignment"
},
"out_of_office_message": {
"type": "string",
"description": "Message to show when agents are out of office"
},
"working_hours": {
"type": "array",
"description": "Configuration for working hours of the inbox",
"items": {
"type": "object",
"properties": {
"day_of_week": {
"type": "number",
"description": "Day of the week (0-6, where 0 is Sunday)"
},
"closed_all_day": {
"type": "boolean",
"description": "Whether the inbox is closed for the entire day"
},
"open_hour": {
"type": "number",
"description": "Hour when inbox opens (0-23)"
},
"open_minutes": {
"type": "number",
"description": "Minutes of the hour when inbox opens (0-59)"
},
"close_hour": {
"type": "number",
"description": "Hour when inbox closes (0-23)"
},
"close_minutes": {
"type": "number",
"description": "Minutes of the hour when inbox closes (0-59)"
},
"open_all_day": {
"type": "boolean",
"description": "Whether the inbox is open for the entire day"
}
}
}
},
"timezone": {
"type": "string",
"description": "Timezone configuration for the inbox"
},
"callback_webhook_url": {
"type": "string",
"description": "Webhook URL for callbacks"
},
"allow_messages_after_resolved": {
"type": "boolean",
"description": "Whether to allow messages after a conversation is resolved"
},
"lock_to_single_conversation": {
"type": "boolean",
"description": "Whether to lock a contact to a single conversation"
},
"sender_name_type": {
"type": "string",
"description": "Type of sender name to display (e.g., friendly)"
},
"business_name": {
"type": "string",
"description": "Business name associated with the inbox"
},
"hmac_mandatory": {
"type": "boolean",
"description": "Whether HMAC verification is mandatory"
},
"selected_feature_flags": {
"type": "object",
"description": "Selected feature flags for the inbox"
},
"reply_time": {
"type": "string",
"description": "Expected reply time"
},
"messaging_service_sid": {
"type": "string",
"description": "Messaging service SID for SMS providers"
},
"phone_number": {
"type": "string",
"description": "Phone number associated with the inbox"
},
"medium": {
"type": "string",
"description": "Medium of communication (e.g., sms, email)"
},
"provider": {
"type": "string",
"description": "Provider of the channel"
}
}
},
"inbox_contact": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID of the inbox"
},
"avatar_url": {
"type": "string",
"description": "The avatar image of the inbox"
},
"channel_id": {
"type": "number",
"description": "The ID of the channel"
},
"name": {
"type": "string",
"description": "The name of the inbox"
},
"channel_type": {
"type": "string",
"description": "The type of the inbox"
},
"provider": {
"type": "string",
"description": "The provider of the inbox"
}
}
},
"agent_bot": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID of the agent bot"
},
"name": {
"type": "string",
"description": "The name of the agent bot"
},
"description": {
"type": "string",
"description": "The description about the agent bot"
},
"thumbnail": {
"type": "string",
"description": "The thumbnail of the agent bot"
},
"outgoing_url": {
"type": "string",
"description": "The webhook URL for the bot"
},
"bot_type": {
"type": "string",
"description": "The type of the bot"
},
"bot_config": {
"type": "object",
"description": "The configuration of the bot"
},
"account_id": {
"type": "number",
"description": "Account ID if it's an account specific bot"
},
"access_token": {
"type": "string",
"description": "The access token for the bot"
},
"system_bot": {
"type": "boolean",
"description": "Whether the bot is a system bot"
}
}
},
"contact_inboxes": {
"type": "object",
"properties": {
"source_id": {
"type": "string",
"description": "Contact Inbox Source Id"
},
"inbox": {
"$ref": "#/components/schemas/inbox_contact"
}
}
},
"contactable_inboxes": {
"type": "object",
"properties": {
"source_id": {
"type": "string",
"description": "Contact Inbox Source Id"
},
"inbox": {
"$ref": "#/components/schemas/inbox"
}
}
},
"custom_filter": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "The ID of the custom filter"
},
"name": {
"type": "string",
"description": "The name of the custom filter"
},
"type": {
"type": "string",
"enum": [
"conversation",
"contact",
"report"
],
"description": "The description about the custom filter"
},
"query": {
"type": "object",
"description": "A query that needs to be saved as a custom filter"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "The time at which the custom filter was created"
},
"updated_at": {
"type": "string",
"format": "date-time",
"description": "The time at which the custom filter was updated"
}
}
},
"webhook": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "The ID of the webhook"
},
"url": {
"type": "string",
"description": "The url to which the events will be send"
},
"name": {
"type": "string",
"description": "The name of the webhook"
},
"subscriptions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"conversation_created",
"conversation_status_changed",
"conversation_updated",
"contact_created",
"contact_updated",
"message_created",
"message_updated",
"webwidget_triggered"
]
},
"description": "The list of subscribed events"
},
"account_id": {
"type": "number",
"description": "The id of the account which the webhook object belongs to"
}
}
},
"account": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Name of the account"
},
"role": {
"type": "string",
"enum": [
"administrator",
"agent"
],
"description": "The user role in the account"
}
}
},
"account_detail": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Name of the account"
},
"locale": {
"type": "string",
"description": "The locale of the account"
},
"domain": {
"type": "string",
"description": "The domain of the account"
},
"support_email": {
"type": "string",
"description": "The support email of the account"
},
"status": {
"type": "string",
"description": "The status of the account"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "The creation date of the account"
},
"cache_keys": {
"type": "object",
"description": "Cache keys for the account"
},
"features": {
"type": "array",
"items": {
"type": "string"
},
"description": "Enabled features for the account"
},
"settings": {
"type": "object",
"description": "Account settings",
"properties": {
"auto_resolve_after": {
"type": "number",
"description": "Auto resolve conversations after specified minutes"
},
"auto_resolve_message": {
"type": "string",
"description": "Message to send when auto resolving"
},
"auto_resolve_ignore_waiting": {
"type": "boolean",
"description": "Whether to ignore waiting conversations for auto resolve"
}
}
},
"custom_attributes": {
"type": "object",
"description": "Custom attributes of the account",
"properties": {
"plan_name": {
"type": "string",
"description": "Subscription plan name"
},
"subscribed_quantity": {
"type": "number",
"description": "Subscribed quantity"
},
"subscription_status": {
"type": "string",
"description": "Subscription status"
},
"subscription_ends_on": {
"type": "string",
"format": "date",
"description": "Subscription end date"
},
"industry": {
"type": "string",
"description": "Industry type"
},
"company_size": {
"type": "string",
"description": "Company size"
},
"timezone": {
"type": "string",
"description": "Account timezone"
},
"logo": {
"type": "string",
"description": "Account logo URL"
},
"onboarding_step": {
"type": "string",
"description": "Current onboarding step"
},
"marked_for_deletion_at": {
"type": "string",
"format": "date-time",
"description": "When account was marked for deletion"
},
"marked_for_deletion_reason": {
"type": "string",
"description": "Reason for account deletion"
}
}
}
}
},
"account_show_response": {
"allOf": [
{
"$ref": "#/components/schemas/account_detail"
},
{
"type": "object",
"properties": {
"latest_chatwoot_version": {
"type": "string",
"description": "Latest version of Chatwoot available",
"example": "3.0.0"
},
"subscribed_features": {
"type": "array",
"items": {
"type": "string"
},
"description": "List of subscribed enterprise features (if enterprise edition is enabled)"
}
}
}
]
},
"account_user": {
"type": "array",
"description": "Array of account users",
"items": {
"type": "object",
"properties": {
"account_id": {
"type": "integer",
"description": "The ID of the account"
},
"user_id": {
"type": "integer",
"description": "The ID of the user"
},
"role": {
"type": "string",
"description": "whether user is an administrator or agent"
}
}
}
},
"platform_account": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "Account ID"
},
"name": {
"type": "string",
"description": "Name of the account"
}
}
},
"team": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "The ID of the team"
},
"name": {
"type": "string",
"description": "The name of the team"
},
"description": {
"type": "string",
"description": "The description about the team"
},
"allow_auto_assign": {
"type": "boolean",
"description": "If this setting is turned on, the system would automatically assign the conversation to an agent in the team while assigning the conversation to a team"
},
"account_id": {
"type": "number",
"description": "The ID of the account with the team is a part of"
},
"is_member": {
"type": "boolean",
"description": "This field shows whether the current user is a part of the team"
}
}
},
"integrations_app": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID of the integration"
},
"name": {
"type": "string",
"description": "The name of the integration"
},
"description": {
"type": "string",
"description": "The description about the team"
},
"hook_type": {
"type": "string",
"description": "Whether the integration is an account or inbox integration"
},
"enabled": {
"type": "boolean",
"description": "Whether the integration is enabled for the account"
},
"allow_multiple_hooks": {
"type": "boolean",
"description": "Whether multiple hooks can be created for the integration"
},
"hooks": {
"type": "array",
"items": {
"type": "object"
},
"description": "If there are any hooks created for this integration"
}
}
},
"integrations_hook": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The ID of the integration hook"
},
"app_id": {
"type": "string",
"description": "The ID of the integration app"
},
"inbox_id": {
"type": "string",
"description": "Inbox ID if its an Inbox integration"
},
"account_id": {
"type": "string",
"description": "Account ID of the integration"
},
"status": {
"type": "boolean",
"description": "Whether the integration hook is enabled for the account"
},
"hook_type": {
"type": "boolean",
"description": "Whether its an account or inbox integration hook"
},
"settings": {
"type": "object",
"description": "The associated settings for the integration"
}
}
},
"audit_log": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Unique identifier for the audit log entry"
},
"auditable_id": {
"type": "integer",
"description": "The ID of the audited object"
},
"auditable_type": {
"type": "string",
"description": "The type of the audited object (e.g., Conversation, Contact, User)"
},
"auditable": {
"type": "object",
"description": "The audited object data"
},
"associated_id": {
"type": "integer",
"description": "The ID of the associated object (typically the account ID)"
},
"associated_type": {
"type": "string",
"description": "The type of the associated object"
},
"user_id": {
"type": "integer",
"description": "The ID of the user who performed the action"
},
"user_type": {
"type": "string",
"description": "The type of user who performed the action"
},
"username": {
"type": "string",
"description": "The email/username of the user who performed the action"
},
"action": {
"type": "string",
"enum": [
"create",
"update",
"destroy"
],
"description": "The action performed on the object"
},
"audited_changes": {
"type": "object",
"description": "JSON object containing the changes made to the audited object"
},
"version": {
"type": "integer",
"description": "Version number of the audit log entry"
},
"comment": {
"type": "string",
"nullable": true,
"description": "Optional comment associated with the audit log entry"
},
"request_uuid": {
"type": "string",
"description": "UUID to identify the request that generated this audit log"
},
"created_at": {
"type": "integer",
"description": "Unix timestamp when the audit log entry was created"
},
"remote_address": {
"type": "string",
"nullable": true,
"description": "IP address from which the action was performed"
}
}
},
"public_contact": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Id of the contact"
},
"source_id": {
"type": "string",
"description": "The session identifier of the contact"
},
"name": {
"type": "string",
"description": "Name of the contact"
},
"email": {
"type": "string",
"description": "Email of the contact"
},
"pubsub_token": {
"type": "string",
"description": "The token to be used to connect to chatwoot websocket"
}
}
},
"public_conversation": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "Id of the conversation"
},
"inbox_id": {
"type": "string",
"description": "The inbox id of the conversation"
},
"messages": {
"type": "array",
"items": {
"$ref": "#/components/schemas/message"
},
"description": "Messages in the conversation"
},
"contact": {
"type": "object",
"description": "The contact information associated to the conversation"
}
}
},
"public_message": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Id of the message"
},
"content": {
"type": "string",
"description": "Text content of the message"
},
"message_type": {
"type": "string",
"description": "Denotes the message type"
},
"content_type": {
"type": "string",
"description": "Content type of the message"
},
"content_attributes": {
"type": "string",
"description": "Additional content attributes of the message"
},
"created_at": {
"type": "string",
"description": "Created at time stamp of the message"
},
"conversation_id": {
"type": "string",
"description": "Conversation Id of the message"
},
"attachments": {
"type": "array",
"items": {
"type": "object"
},
"description": "Attachments if any"
},
"sender": {
"type": "object",
"description": "Details of the sender"
}
}
},
"public_inbox": {
"type": "object",
"properties": {
"identifier": {
"type": "string",
"description": "Inbox identifier"
},
"name": {
"type": "string",
"description": "Name of the inbox"
},
"timezone": {
"type": "string",
"description": "The timezone defined on the inbox"
},
"working_hours": {
"type": "array",
"description": "The working hours defined on the inbox",
"items": {
"type": "object",
"properties": {
"day_of_week": {
"type": "integer",
"description": "Day of the week as a number. Sunday -> 0, Saturday -> 6"
},
"open_all_day": {
"type": "boolean",
"description": "Whether or not the business is open the whole day"
},
"closed_all_day": {
"type": "boolean",
"description": "Whether or not the business is closed the whole day"
},
"open_hour": {
"type": "integer",
"description": "Opening hour. Can be null if closed all day"
},
"open_minutes": {
"type": "integer",
"description": "Opening minute. Can be null if closed all day"
},
"close_hour": {
"type": "integer",
"description": "Closing hour. Can be null if closed all day"
},
"close_minutes": {
"type": "integer",
"description": "Closing minute. Can be null if closed all day"
}
}
}
},
"working_hours_enabled": {
"type": "boolean",
"description": "Whether of not the working hours are enabled on the inbox"
},
"csat_survey_enabled": {
"type": "boolean",
"description": "Whether of not the Customer Satisfaction survey is enabled on the inbox"
},
"greeting_enabled": {
"type": "boolean",
"description": "Whether of not the Greeting Message is enabled on the inbox"
},
"identity_validation_enabled": {
"type": "boolean",
"description": "Whether of not the User Identity Validation is enforced on the inbox"
}
}
},
"account_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the account",
"example": "My Account"
},
"locale": {
"type": "string",
"description": "The locale of the account",
"example": "en"
},
"domain": {
"type": "string",
"description": "The domain of the account",
"example": "example.com"
},
"support_email": {
"type": "string",
"description": "The support email of the account",
"example": "support@example.com"
},
"status": {
"type": "string",
"enum": [
"active",
"suspended"
],
"description": "The status of the account",
"example": "active"
},
"limits": {
"type": "object",
"description": "The limits of the account",
"example": {}
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the account",
"example": {}
}
}
},
"account_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the account",
"example": "My Account"
},
"locale": {
"type": "string",
"description": "The locale of the account",
"example": "en"
},
"domain": {
"type": "string",
"description": "The domain of the account",
"example": "example.com"
},
"support_email": {
"type": "string",
"description": "The support email of the account",
"example": "support@example.com"
},
"auto_resolve_after": {
"type": "integer",
"minimum": 10,
"maximum": 1439856,
"nullable": true,
"description": "Auto resolve conversations after specified minutes",
"example": 1440
},
"auto_resolve_message": {
"type": "string",
"nullable": true,
"description": "Message to send when auto resolving",
"example": "This conversation has been automatically resolved due to inactivity"
},
"auto_resolve_ignore_waiting": {
"type": "boolean",
"nullable": true,
"description": "Whether to ignore waiting conversations for auto resolve",
"example": false
},
"industry": {
"type": "string",
"description": "Industry type",
"example": "Technology"
},
"company_size": {
"type": "string",
"description": "Company size",
"example": "50-100"
},
"timezone": {
"type": "string",
"description": "Account timezone",
"example": "UTC"
}
}
},
"account_user_create_update_payload": {
"type": "object",
"required": [
"user_id",
"role"
],
"properties": {
"user_id": {
"type": "integer",
"description": "The ID of the user",
"example": 1
},
"role": {
"type": "string",
"description": "whether user is an administrator or agent",
"example": "administrator"
}
}
},
"platform_agent_bot_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the agent bot",
"example": "My Agent Bot"
},
"description": {
"type": "string",
"description": "The description of the agent bot",
"example": "This is a sample agent bot"
},
"outgoing_url": {
"type": "string",
"description": "The webhook URL for the bot",
"example": "https://example.com/webhook"
},
"account_id": {
"type": "integer",
"description": "The account ID to associate the agent bot with",
"example": 1
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Send the form data with the avatar image binary or use the avatar_url"
},
"avatar_url": {
"type": "string",
"description": "The url to a jpeg, png file for the agent bot avatar",
"example": "https://example.com/avatar.png"
}
}
},
"agent_bot_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the agent bot",
"example": "My Agent Bot"
},
"description": {
"type": "string",
"description": "The description of the agent bot",
"example": "This is a sample agent bot"
},
"outgoing_url": {
"type": "string",
"description": "The webhook URL for the bot",
"example": "https://example.com/webhook"
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Send the form data with the avatar image binary or use the avatar_url"
},
"avatar_url": {
"type": "string",
"description": "The url to a jpeg, png file for the agent bot avatar",
"example": "https://example.com/avatar.png"
},
"bot_type": {
"type": "integer",
"description": "The type of the bot (0 for webhook)",
"example": 0
},
"bot_config": {
"type": "object",
"description": "The configuration for the bot",
"example": {}
}
}
},
"user_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Name of the user",
"example": "Daniel"
},
"display_name": {
"type": "string",
"description": "Display name of the user",
"example": "Dan"
},
"email": {
"type": "string",
"description": "Email of the user",
"example": "daniel@acme.inc"
},
"password": {
"type": "string",
"description": "Password must contain uppercase, lowercase letters, number and a special character",
"example": "Password2!"
},
"custom_attributes": {
"type": "object",
"description": "Custom attributes you want to associate with the user",
"example": {}
}
}
},
"canned_response_create_update_payload": {
"type": "object",
"properties": {
"content": {
"type": "string",
"description": "Message content for canned response",
"example": "Hello, {{contact.name}}! Welcome to our service."
},
"short_code": {
"type": "string",
"description": "Short Code for quick access of the canned response",
"example": "welcome"
}
}
},
"custom_attribute_create_update_payload": {
"type": "object",
"properties": {
"attribute_display_name": {
"type": "string",
"description": "Attribute display name",
"example": "Custom Attribute"
},
"attribute_display_type": {
"type": "integer",
"description": "Attribute display type (text- 0, number- 1, currency- 2, percent- 3, link- 4, date- 5, list- 6, checkbox- 7)",
"example": 0
},
"attribute_description": {
"type": "string",
"description": "Attribute description",
"example": "This is a custom attribute"
},
"attribute_key": {
"type": "string",
"description": "Attribute unique key value",
"example": "custom_attribute"
},
"attribute_values": {
"type": "array",
"description": "Attribute values",
"items": {
"type": "string"
},
"example": [
"value1",
"value2"
]
},
"attribute_model": {
"type": "integer",
"description": "Attribute type(conversation_attribute- 0, contact_attribute- 1)",
"example": 0
},
"regex_pattern": {
"type": "string",
"description": "Regex pattern (Only applicable for type- text). The regex pattern is used to validate the attribute value(s).",
"example": "^[a-zA-Z0-9]+$"
},
"regex_cue": {
"type": "string",
"description": "Regex cue message (Only applicable for type- text). The cue message is shown when the regex pattern is not matched.",
"example": "Please enter a valid value"
}
}
},
"agent_create_payload": {
"type": "object",
"required": [
"name",
"email",
"role"
],
"properties": {
"name": {
"type": "string",
"description": "Full Name of the agent",
"example": "John Doe"
},
"email": {
"type": "string",
"description": "Email of the Agent",
"example": "john.doe@acme.inc"
},
"role": {
"type": "string",
"enum": [
"agent",
"administrator"
],
"description": "Whether its administrator or agent",
"example": "agent"
},
"availability_status": {
"type": "string",
"enum": [
"available",
"busy",
"offline"
],
"description": "The availability setting of the agent.",
"example": "available"
},
"auto_offline": {
"type": "boolean",
"description": "Whether the availability status of agent is configured to go offline automatically when away.",
"example": true
}
}
},
"agent_update_payload": {
"type": "object",
"required": [
"role"
],
"properties": {
"role": {
"type": "string",
"enum": [
"agent",
"administrator"
],
"description": "Whether its administrator or agent",
"example": "agent"
},
"availability_status": {
"type": "string",
"enum": [
"available",
"busy",
"offline"
],
"description": "The availability status of the agent.",
"example": "available"
},
"auto_offline": {
"type": "boolean",
"description": "Whether the availability status of agent is configured to go offline automatically when away.",
"example": true
}
}
},
"contact_create_payload": {
"type": "object",
"required": [
"inbox_id"
],
"properties": {
"inbox_id": {
"type": "number",
"description": "ID of the inbox to which the contact belongs",
"example": 1
},
"name": {
"type": "string",
"description": "name of the contact",
"example": "Alice"
},
"email": {
"type": "string",
"description": "email of the contact",
"example": "alice@acme.inc"
},
"blocked": {
"type": "boolean",
"description": "whether the contact is blocked or not",
"example": false
},
"phone_number": {
"type": "string",
"description": "phone number of the contact",
"example": "+123456789"
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Send the form data with the avatar image binary or use the avatar_url"
},
"avatar_url": {
"type": "string",
"description": "The url to a jpeg, png file for the contact avatar",
"example": "https://example.com/avatar.png"
},
"identifier": {
"type": "string",
"description": "A unique identifier for the contact in external system",
"example": "1234567890"
},
"additional_attributes": {
"type": "object",
"description": "An object where you can store additional attributes for contact. example {\"type\":\"customer\", \"age\":30}",
"example": {
"type": "customer",
"age": 30
}
},
"custom_attributes": {
"type": "object",
"description": "An object where you can store custom attributes for contact. example {\"type\":\"customer\", \"age\":30}, this should have a valid custom attribute definition.",
"example": {}
}
}
},
"contact_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "name of the contact",
"example": "Alice"
},
"email": {
"type": "string",
"description": "email of the contact",
"example": "alice@acme.inc"
},
"blocked": {
"type": "boolean",
"description": "whether the contact is blocked or not",
"example": false
},
"phone_number": {
"type": "string",
"description": "phone number of the contact",
"example": "+123456789"
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Send the form data with the avatar image binary or use the avatar_url"
},
"avatar_url": {
"type": "string",
"description": "The url to a jpeg, png file for the contact avatar",
"example": "https://example.com/avatar.png"
},
"identifier": {
"type": "string",
"description": "A unique identifier for the contact in external system",
"example": "1234567890"
},
"additional_attributes": {
"type": "object",
"description": "An object where you can store additional attributes for contact. example {\"type\":\"customer\", \"age\":30}",
"example": {
"type": "customer",
"age": 30
}
},
"custom_attributes": {
"type": "object",
"description": "An object where you can store custom attributes for contact. example {\"type\":\"customer\", \"age\":30}, this should have a valid custom attribute definition.",
"example": {}
}
}
},
"conversation_create_payload": {
"type": "object",
"required": [
"source_id",
"inbox_id"
],
"properties": {
"source_id": {
"type": "string",
"description": "Conversation source id",
"example": "1234567890"
},
"inbox_id": {
"type": "integer",
"description": "Id of inbox in which the conversation is created <br/> Allowed Inbox Types: Website, Phone, Api, Email",
"example": 1
},
"contact_id": {
"type": "integer",
"description": "Contact Id for which conversation is created",
"example": 1
},
"additional_attributes": {
"type": "object",
"description": "Lets you specify attributes like browser information",
"example": {
"browser": "Chrome",
"browser_version": "89.0.4389.82",
"os": "Windows",
"os_version": "10"
}
},
"custom_attributes": {
"type": "object",
"description": "The object to save custom attributes for conversation, accepts custom attributes key and value",
"example": {
"attribute_key": "attribute_value",
"priority_conversation_number": 3
}
},
"status": {
"type": "string",
"enum": [
"open",
"resolved",
"pending"
],
"description": "Specify the conversation whether it's pending, open, closed",
"example": "open"
},
"assignee_id": {
"type": "integer",
"description": "Agent Id for assigning a conversation to an agent",
"example": 1
},
"team_id": {
"type": "integer",
"description": "Team Id for assigning a conversation to a team\\",
"example": 1
},
"snoozed_until": {
"type": "string",
"format": "date-time",
"description": "Snoozed until date time",
"example": "2030-07-21T17:32:28Z"
},
"message": {
"type": "object",
"description": "The initial message to be sent to the conversation",
"required": [
"content"
],
"properties": {
"content": {
"type": "string",
"description": "The content of the message",
"example": "Hello, how can I help you?"
},
"template_params": {
"type": "object",
"description": "The template params for the message in case of whatsapp Channel",
"properties": {
"name": {
"type": "string",
"description": "Name of the template",
"example": "sample_issue_resolution"
},
"category": {
"type": "string",
"description": "Category of the template",
"example": "UTILITY"
},
"language": {
"type": "string",
"description": "Language of the template",
"example": "en_US"
},
"processed_params": {
"type": "object",
"description": "The processed param values for template variables in template",
"example": {
"1": "Chatwoot"
}
}
}
}
}
}
}
},
"conversation_message_create_payload": {
"type": "object",
"required": [
"content"
],
"properties": {
"content": {
"type": "string",
"description": "The content of the message",
"example": "Hello, how can I help you?"
},
"message_type": {
"type": "string",
"enum": [
"outgoing",
"incoming"
],
"description": "The type of the message",
"example": "outgoing"
},
"private": {
"type": "boolean",
"description": "Flag to identify if it is a private note",
"example": false
},
"content_type": {
"type": "string",
"enum": [
"text",
"input_email",
"cards",
"input_select",
"form",
"article"
],
"description": "Content type of the message",
"example": "text"
},
"content_attributes": {
"type": "object",
"description": "Attributes based on the content type",
"example": {}
},
"campaign_id": {
"type": "integer",
"description": "The campaign id to which the message belongs",
"example": 1
},
"template_params": {
"type": "object",
"description": "WhatsApp template parameters for sending structured messages",
"required": [
"name",
"category",
"language",
"processed_params"
],
"properties": {
"name": {
"type": "string",
"description": "Name of the WhatsApp template (must be approved in WhatsApp Business Manager)",
"example": "purchase_receipt"
},
"category": {
"type": "string",
"enum": [
"UTILITY",
"MARKETING",
"SHIPPING_UPDATE",
"TICKET_UPDATE",
"ISSUE_RESOLUTION"
],
"description": "Category of the template",
"example": "UTILITY"
},
"language": {
"type": "string",
"description": "Language code of the template (BCP 47 format)",
"example": "en_US"
},
"processed_params": {
"type": "object",
"description": "Processed template parameters organized by component type",
"properties": {
"body": {
"type": "object",
"description": "Body component parameters with variable placeholders",
"additionalProperties": {
"type": "string"
},
"example": {
"1": "Visa",
"2": "Nike",
"3": "Bill"
}
},
"header": {
"type": "object",
"description": "Header component parameters for media templates",
"properties": {
"media_url": {
"type": "string",
"format": "uri",
"description": "Publicly accessible URL for IMAGE, VIDEO, or DOCUMENT headers",
"example": "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"
},
"media_type": {
"type": "string",
"enum": [
"image",
"video",
"document"
],
"description": "Type of media for the header",
"example": "document"
}
}
},
"buttons": {
"type": "array",
"description": "Button component parameters for interactive templates",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"enum": [
"url",
"copy_code"
],
"description": "Type of button parameter"
},
"parameter": {
"type": "string",
"description": "Dynamic parameter value for the button",
"example": "SSFSDFSD"
}
}
}
}
}
}
}
}
}
},
"inbox_create_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the inbox",
"example": "Support"
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Image file for avatar"
},
"greeting_enabled": {
"type": "boolean",
"description": "Enable greeting message",
"example": true
},
"greeting_message": {
"type": "string",
"description": "Greeting message to be displayed on the widget",
"example": "Hello, how can I help you?"
},
"enable_email_collect": {
"type": "boolean",
"description": "Enable email collection",
"example": true
},
"csat_survey_enabled": {
"type": "boolean",
"description": "Enable CSAT survey",
"example": true
},
"enable_auto_assignment": {
"type": "boolean",
"description": "Enable Auto Assignment",
"example": true
},
"working_hours_enabled": {
"type": "boolean",
"description": "Enable working hours",
"example": true
},
"out_of_office_message": {
"type": "string",
"description": "Out of office message to be displayed on the widget",
"example": "We are currently out of office. Please leave a message and we will get back to you."
},
"timezone": {
"type": "string",
"description": "Timezone of the inbox",
"example": "America/New_York"
},
"allow_messages_after_resolved": {
"type": "boolean",
"description": "Allow messages after conversation is resolved",
"example": true
},
"lock_to_single_conversation": {
"type": "boolean",
"description": "Lock to single conversation",
"example": true
},
"portal_id": {
"type": "integer",
"description": "Id of the help center portal to attach to the inbox",
"example": 1
},
"sender_name_type": {
"type": "string",
"description": "Sender name type for the inbox",
"enum": [
"friendly",
"professional"
],
"example": "friendly"
},
"business_name": {
"type": "string",
"description": "Business name for the inbox",
"example": "My Business"
},
"channel": {
"type": "object",
"properties": {
"type": {
"type": "string",
"description": "Type of the channel",
"enum": [
"web_widget",
"api",
"email",
"line",
"telegram",
"whatsapp",
"sms"
],
"example": "web_widget"
},
"website_url": {
"type": "string",
"description": "URL at which the widget will be loaded",
"example": "https://example.com"
},
"welcome_title": {
"type": "string",
"description": "Welcome title to be displayed on the widget",
"example": "Welcome to our support"
},
"welcome_tagline": {
"type": "string",
"description": "Welcome tagline to be displayed on the widget",
"example": "We are here to help you"
},
"widget_color": {
"type": "string",
"description": "A Hex-color string used to customize the widget",
"example": "#FF5733"
}
}
}
}
},
"inbox_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the inbox",
"example": "Support"
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Image file for avatar"
},
"greeting_enabled": {
"type": "boolean",
"description": "Enable greeting message",
"example": true
},
"greeting_message": {
"type": "string",
"description": "Greeting message to be displayed on the widget",
"example": "Hello, how can I help you?"
},
"enable_email_collect": {
"type": "boolean",
"description": "Enable email collection",
"example": true
},
"csat_survey_enabled": {
"type": "boolean",
"description": "Enable CSAT survey",
"example": true
},
"enable_auto_assignment": {
"type": "boolean",
"description": "Enable Auto Assignment",
"example": true
},
"working_hours_enabled": {
"type": "boolean",
"description": "Enable working hours",
"example": true
},
"out_of_office_message": {
"type": "string",
"description": "Out of office message to be displayed on the widget",
"example": "We are currently out of office. Please leave a message and we will get back to you."
},
"timezone": {
"type": "string",
"description": "Timezone of the inbox",
"example": "America/New_York"
},
"allow_messages_after_resolved": {
"type": "boolean",
"description": "Allow messages after conversation is resolved",
"example": true
},
"lock_to_single_conversation": {
"type": "boolean",
"description": "Lock to single conversation",
"example": true
},
"portal_id": {
"type": "integer",
"description": "Id of the help center portal to attach to the inbox",
"example": 1
},
"sender_name_type": {
"type": "string",
"description": "Sender name type for the inbox",
"enum": [
"friendly",
"professional"
],
"example": "friendly"
},
"business_name": {
"type": "string",
"description": "Business name for the inbox",
"example": "My Business"
},
"channel": {
"type": "object",
"properties": {
"website_url": {
"type": "string",
"description": "URL at which the widget will be loaded",
"example": "https://example.com"
},
"welcome_title": {
"type": "string",
"description": "Welcome title to be displayed on the widget",
"example": "Welcome to our support"
},
"welcome_tagline": {
"type": "string",
"description": "Welcome tagline to be displayed on the widget",
"example": "We are here to help you"
},
"widget_color": {
"type": "string",
"description": "A Hex-color string used to customize the widget",
"example": "#FF5733"
}
}
}
}
},
"team_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the team",
"example": "Support Team"
},
"description": {
"type": "string",
"description": "The description of the team",
"example": "This is a team of support agents"
},
"allow_auto_assign": {
"type": "boolean",
"description": "If this setting is turned on, the system would automatically assign the conversation to an agent in the team while assigning the conversation to a team",
"example": true
}
}
},
"custom_filter_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the custom filter",
"example": "My Custom Filter"
},
"type": {
"type": "string",
"enum": [
"conversation",
"contact",
"report"
],
"description": "The description about the custom filter",
"example": "conversation"
},
"query": {
"type": "object",
"description": "A query that needs to be saved as a custom filter",
"example": {}
}
}
},
"webhook_create_update_payload": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The url where the events should be sent",
"example": "https://example.com/webhook"
},
"name": {
"type": "string",
"description": "The name of the webhook"
},
"subscriptions": {
"type": "array",
"items": {
"type": "string",
"enum": [
"conversation_created",
"conversation_status_changed",
"conversation_updated",
"message_created",
"message_updated",
"contact_created",
"contact_updated",
"webwidget_triggered"
]
},
"description": "The events you want to subscribe to.",
"example": [
"conversation_created",
"conversation_status_changed"
]
}
}
},
"integrations_hook_create_payload": {
"type": "object",
"properties": {
"app_id": {
"type": "integer",
"description": "The ID of app for which integration hook is being created",
"example": 1
},
"inbox_id": {
"type": "integer",
"description": "The inbox ID, if the hook is an inbox hook",
"example": 1
},
"status": {
"type": "integer",
"description": "The status of the integration (0 for inactive, 1 for active)",
"example": 1
},
"settings": {
"type": "object",
"description": "The settings required by the integration",
"example": {}
}
}
},
"integrations_hook_update_payload": {
"type": "object",
"properties": {
"status": {
"type": "integer",
"description": "The status of the integration (0 for inactive, 1 for active)",
"example": 1
},
"settings": {
"type": "object",
"description": "The settings required by the integration",
"example": {}
}
}
},
"automation_rule_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Rule name",
"example": "Add label on message create event"
},
"description": {
"type": "string",
"description": "The description about the automation and actions",
"example": "Add label support and sales on message create event if incoming message content contains text help"
},
"event_name": {
"type": "string",
"enum": [
"conversation_created",
"conversation_updated",
"conversation_resolved",
"message_created"
],
"example": "message_created",
"description": "The event when you want to execute the automation actions"
},
"active": {
"type": "boolean",
"description": "Enable/disable automation rule"
},
"actions": {
"type": "array",
"description": "Array of actions which you want to perform when condition matches, e.g add label support if message contains content help.",
"items": {
"type": "object",
"example": {
"action_name": "add_label",
"action_params": [
"support"
]
}
}
},
"conditions": {
"type": "array",
"description": "Array of conditions on which conversation filter would work, e.g message content contains text help.",
"items": {
"type": "object",
"example": {
"attribute_key": "content",
"filter_operator": "contains",
"query_operator": "OR",
"values": [
"help"
]
}
}
}
}
},
"portal_create_update_payload": {
"type": "object",
"properties": {
"color": {
"type": "string",
"description": "Header color for help-center in hex format",
"example": "#FFFFFF"
},
"custom_domain": {
"type": "string",
"description": "Custom domain to display help center.",
"example": "chatwoot.help"
},
"header_text": {
"type": "string",
"description": "Help center header",
"example": "Handbook"
},
"homepage_link": {
"type": "string",
"description": "link to main dashboard",
"example": "https://www.chatwoot.com/"
},
"name": {
"type": "string",
"description": "Name for the portal",
"example": "Handbook"
},
"page_title": {
"type": "string",
"description": "Page title for the portal",
"example": "Handbook"
},
"slug": {
"type": "string",
"description": "Slug for the portal to display in link",
"example": "handbook"
},
"archived": {
"type": "boolean",
"description": "Status to check if portal is live",
"example": false
},
"config": {
"type": "object",
"description": "Configuration about supporting locales",
"example": {
"allowed_locales": [
"en",
"es"
],
"default_locale": "en"
}
}
}
},
"category_create_update_payload": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "The name of the category",
"example": "Category Name"
},
"description": {
"type": "string",
"description": "A description for the category",
"example": "Category description"
},
"position": {
"type": "integer",
"description": "Category position in the portal list to sort",
"example": 1
},
"slug": {
"type": "string",
"description": "The category slug used in the URL",
"example": "category-name"
},
"locale": {
"type": "string",
"description": "The locale of the category",
"example": "en"
},
"icon": {
"type": "string",
"description": "The icon of the category as a string (emoji)",
"example": "📚"
},
"parent_category_id": {
"type": "integer",
"description": "To define parent category, e.g product documentation has multiple level features in sales category or in engineering category.",
"example": 1
},
"associated_category_id": {
"type": "integer",
"description": "To associate similar categories to each other, e.g same category of product documentation in different languages",
"example": 2
}
}
},
"article_create_update_payload": {
"type": "object",
"properties": {
"title": {
"type": "string",
"description": "The title of the article",
"example": "Article Title"
},
"slug": {
"type": "string",
"description": "The slug of the article",
"example": "article-title"
},
"position": {
"type": "integer",
"description": "article position in category",
"example": 1
},
"content": {
"type": "string",
"description": "The text content.",
"example": "This is the content of the article"
},
"description": {
"type": "string",
"description": "The description of the article",
"example": "This is the description of the article"
},
"category_id": {
"type": "integer",
"description": "The category id of the article",
"example": 1
},
"author_id": {
"type": "integer",
"description": "The author agent id of the article",
"example": 1
},
"associated_article_id": {
"type": "integer",
"description": "To associate similar articles to each other, e.g to provide the link for the reference.",
"example": 2
},
"status": {
"type": "integer",
"description": "The status of the article. 0 for draft, 1 for published, 2 for archived",
"example": 1
},
"locale": {
"type": "string",
"description": "The locale of the article",
"example": "en"
},
"meta": {
"type": "object",
"description": "Use for search",
"example": {
"tags": [
"article_name"
],
"title": "article title",
"description": "article description"
}
}
}
},
"public_contact_create_update_payload": {
"type": "object",
"properties": {
"identifier": {
"type": "string",
"description": "External identifier of the contact",
"example": "1234567890"
},
"identifier_hash": {
"type": "string",
"description": "Identifier hash prepared for HMAC authentication",
"example": "e93275d4eba0e5679ad55f5360af00444e2a888df9b0afa3e8b691c3173725f9"
},
"email": {
"type": "string",
"description": "Email of the contact",
"example": "alice@acme.inc"
},
"name": {
"type": "string",
"description": "Name of the contact",
"example": "Alice"
},
"phone_number": {
"type": "string",
"description": "Phone number of the contact",
"example": "+123456789"
},
"avatar": {
"type": "string",
"format": "binary",
"description": "Send the form data with the avatar image binary or use the avatar_url"
},
"custom_attributes": {
"type": "object",
"description": "Custom attributes of the customer",
"example": {}
}
}
},
"public_message_create_payload": {
"type": "object",
"properties": {
"content": {
"type": "string",
"description": "Content for the message",
"example": "Hello, how can I help you?"
},
"echo_id": {
"type": "string",
"description": "Temporary identifier which will be passed back via websockets",
"example": "1234567890"
}
}
},
"public_message_update_payload": {
"type": "object",
"properties": {
"submitted_values": {
"type": "object",
"description": "Replies to the Bot Message Types",
"properties": {
"name": {
"type": "string",
"description": "The name of the submiitted value",
"example": "My Name"
},
"title": {
"type": "string",
"description": "The title of the submitted value",
"example": "My Title"
},
"value": {
"type": "string",
"description": "The value of the submitted value",
"example": "value"
},
"csat_survey_response": {
"type": "object",
"description": "The CSAT survey response",
"properties": {
"feedback_message": {
"type": "string",
"description": "The feedback message of the CSAT survey response",
"example": "Great service!"
},
"rating": {
"type": "integer",
"description": "The rating of the CSAT survey response",
"example": 5
}
}
}
}
}
}
},
"public_conversation_create_payload": {
"type": "object",
"properties": {
"custom_attributes": {
"type": "object",
"description": "Custom attributes of the conversation",
"example": {}
}
}
},
"extended_contact": {
"allOf": [
{
"$ref": "#/components/schemas/contact"
},
{
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "Id of the user"
},
"availability_status": {
"type": "string",
"enum": [
"online",
"offline"
],
"description": "Availability status of the user"
}
}
}
]
},
"contact_base": {
"allOf": [
{
"$ref": "#/components/schemas/generic_id"
},
{
"$ref": "#/components/schemas/contact"
}
]
},
"contact_list": {
"type": "array",
"description": "array of contacts",
"items": {
"allOf": [
{
"$ref": "#/components/schemas/contact"
}
]
}
},
"contact_conversations": {
"type": "array",
"description": "array of conversations",
"items": {
"allOf": [
{
"$ref": "#/components/schemas/conversation"
},
{
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"sender": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The additional attributes of the sender"
},
"availability_status": {
"type": "string",
"description": "The availability status of the sender"
},
"email": {
"type": "string",
"description": "The email of the sender"
},
"id": {
"type": "number",
"description": "ID fo the sender"
},
"name": {
"type": "string",
"description": "The name of the sender"
},
"phone_number": {
"type": "string",
"description": "The phone number of the sender"
},
"blocked": {
"type": "boolean",
"description": "Whether the sender is blocked"
},
"identifier": {
"type": "string",
"description": "The identifier of the sender"
},
"thumbnail": {
"type": "string",
"description": "Avatar URL of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the sender"
},
"last_activity_at": {
"type": "number",
"description": "The last activity at of the sender"
},
"created_at": {
"type": "number",
"description": "The created at of the sender"
}
}
},
"channel": {
"type": "string",
"description": "Channel Type"
},
"assignee": {
"$ref": "#/components/schemas/user"
},
"hmac_verified": {
"type": "boolean",
"description": "Whether the hmac is verified"
}
}
}
}
},
{
"type": "object",
"properties": {
"display_id": {
"type": "number"
}
}
}
]
}
},
"contact_labels": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of labels",
"items": {
"type": "string"
}
}
}
},
"conversation_list": {
"type": "object",
"properties": {
"data": {
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"mine_count": {
"type": "number"
},
"unassigned_count": {
"type": "number"
},
"assigned_count": {
"type": "number"
},
"all_count": {
"type": "number"
}
}
},
"payload": {
"type": "array",
"description": "array of conversations",
"items": {
"allOf": [
{
"$ref": "#/components/schemas/generic_id"
},
{
"$ref": "#/components/schemas/conversation"
},
{
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"sender": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The additional attributes of the sender"
},
"availability_status": {
"type": "string",
"description": "The availability status of the sender"
},
"email": {
"type": "string",
"description": "The email of the sender"
},
"id": {
"type": "number",
"description": "ID fo the sender"
},
"name": {
"type": "string",
"description": "The name of the sender"
},
"phone_number": {
"type": "string",
"description": "The phone number of the sender"
},
"blocked": {
"type": "boolean",
"description": "Whether the sender is blocked"
},
"identifier": {
"type": "string",
"description": "The identifier of the sender"
},
"thumbnail": {
"type": "string",
"description": "Avatar URL of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the sender"
},
"last_activity_at": {
"type": "number",
"description": "The last activity at of the sender"
},
"created_at": {
"type": "number",
"description": "The created at of the sender"
}
}
},
"channel": {
"type": "string",
"description": "Channel Type"
},
"assignee": {
"$ref": "#/components/schemas/user"
},
"hmac_verified": {
"type": "boolean",
"description": "Whether the hmac is verified"
}
}
}
}
}
]
}
}
}
}
}
},
"conversation_show": {
"type": "object",
"allOf": [
{
"$ref": "#/components/schemas/conversation"
},
{
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"sender": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The additional attributes of the sender"
},
"availability_status": {
"type": "string",
"description": "The availability status of the sender"
},
"email": {
"type": "string",
"description": "The email of the sender"
},
"id": {
"type": "number",
"description": "ID fo the sender"
},
"name": {
"type": "string",
"description": "The name of the sender"
},
"phone_number": {
"type": "string",
"description": "The phone number of the sender"
},
"blocked": {
"type": "boolean",
"description": "Whether the sender is blocked"
},
"identifier": {
"type": "string",
"description": "The identifier of the sender"
},
"thumbnail": {
"type": "string",
"description": "Avatar URL of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the sender"
},
"last_activity_at": {
"type": "number",
"description": "The last activity at of the sender"
},
"created_at": {
"type": "number",
"description": "The created at of the sender"
}
}
},
"channel": {
"type": "string",
"description": "Channel Type"
},
"assignee": {
"$ref": "#/components/schemas/user"
},
"hmac_verified": {
"type": "boolean",
"description": "Whether the hmac is verified"
}
}
}
}
}
]
},
"conversation_status_toggle": {
"type": "object",
"properties": {
"meta": {
"type": "object"
},
"payload": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"current_status": {
"type": "string",
"enum": [
"open",
"resolved"
]
},
"conversation_id": {
"type": "number"
}
}
}
}
},
"conversation_labels": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"description": "Array of labels",
"items": {
"type": "string"
}
}
}
},
"account_summary": {
"type": "object",
"properties": {
"avg_first_response_time": {
"type": "string"
},
"avg_resolution_time": {
"type": "string"
},
"conversations_count": {
"type": "number"
},
"incoming_messages_count": {
"type": "number"
},
"outgoing_messages_count": {
"type": "number"
},
"resolutions_count": {
"type": "number"
},
"previous": {
"type": "object",
"properties": {
"avg_first_response_time": {
"type": "string"
},
"avg_resolution_time": {
"type": "string"
},
"conversations_count": {
"type": "number"
},
"incoming_messages_count": {
"type": "number"
},
"outgoing_messages_count": {
"type": "number"
},
"resolutions_count": {
"type": "number"
}
}
}
}
},
"agent_conversation_metrics": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"email": {
"type": "string"
},
"thumbnail": {
"type": "string"
},
"availability": {
"type": "string"
},
"metric": {
"type": "object",
"properties": {
"open": {
"type": "number"
},
"unattended": {
"type": "number"
}
}
}
}
},
"contact_detail": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The object containing additional attributes related to the contact",
"properties": {
"city": {
"type": "string",
"description": "City of the contact"
},
"country": {
"type": "string",
"description": "Country of the contact"
},
"country_code": {
"type": "string",
"description": "Country code of the contact"
},
"created_at_ip": {
"type": "string",
"description": "IP address when the contact was created"
}
}
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the contact"
},
"email": {
"type": "string",
"description": "The email address of the contact"
},
"id": {
"type": "integer",
"description": "The ID of the contact"
},
"identifier": {
"type": "string",
"description": "The identifier of the contact",
"nullable": true
},
"name": {
"type": "string",
"description": "The name of the contact"
},
"phone_number": {
"type": "string",
"description": "The phone number of the contact",
"nullable": true
},
"thumbnail": {
"type": "string",
"description": "The thumbnail of the contact"
},
"blocked": {
"type": "boolean",
"description": "Whether the contact is blocked"
},
"type": {
"type": "string",
"description": "The type of entity",
"enum": [
"contact"
]
}
}
},
"message_detailed": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "The ID of the message"
},
"content": {
"type": "string",
"description": "The text content of the message"
},
"inbox_id": {
"type": "number",
"description": "The ID of the inbox"
},
"conversation_id": {
"type": "number",
"description": "The ID of the conversation"
},
"message_type": {
"type": "integer",
"enum": [
0,
1,
2,
3
],
"description": "The type of the message (0: incoming, 1: outgoing, 2: activity, 3: template)"
},
"content_type": {
"type": "string",
"enum": [
"text",
"input_select",
"cards",
"form",
"input_csat"
],
"description": "The type of the message content"
},
"status": {
"type": "string",
"enum": [
"sent",
"delivered",
"read",
"failed"
],
"description": "The status of the message"
},
"content_attributes": {
"type": "object",
"description": "The content attributes for each content_type",
"properties": {
"in_reply_to": {
"type": "string",
"description": "ID of the message this is replying to",
"nullable": true
}
}
},
"created_at": {
"type": "integer",
"description": "The timestamp when message was created"
},
"private": {
"type": "boolean",
"description": "The flag which shows whether the message is private or not"
},
"source_id": {
"type": "string",
"description": "The source ID of the message",
"nullable": true
},
"sender": {
"$ref": "#/components/schemas/contact_detail"
}
}
},
"conversation_meta": {
"type": "object",
"properties": {
"labels": {
"type": "array",
"items": {
"type": "string"
},
"description": "Labels associated with the conversation"
},
"additional_attributes": {
"type": "object",
"properties": {
"browser": {
"type": "object",
"properties": {
"device_name": {
"type": "string",
"description": "Name of the device"
},
"browser_name": {
"type": "string",
"description": "Name of the browser"
},
"platform_name": {
"type": "string",
"description": "Name of the platform"
},
"browser_version": {
"type": "string",
"description": "Version of the browser"
},
"platform_version": {
"type": "string",
"description": "Version of the platform"
}
}
},
"referer": {
"type": "string",
"description": "Referrer URL"
},
"initiated_at": {
"type": "object",
"properties": {
"timestamp": {
"type": "string",
"description": "Timestamp when the conversation was initiated"
}
}
},
"browser_language": {
"type": "string",
"description": "Browser language setting"
},
"conversation_language": {
"type": "string",
"description": "Conversation language"
}
},
"description": "Additional attributes of the conversation"
},
"contact": {
"$ref": "#/components/schemas/contact_detail"
},
"agent_last_seen_at": {
"type": "string",
"description": "Timestamp when the agent last saw the conversation",
"nullable": true
},
"assignee_last_seen_at": {
"type": "string",
"description": "Timestamp when the assignee last saw the conversation",
"nullable": true
}
}
},
"conversation_messages": {
"type": "object",
"properties": {
"meta": {
"$ref": "#/components/schemas/conversation_meta"
},
"payload": {
"type": "array",
"items": {
"$ref": "#/components/schemas/message_detailed"
},
"description": "List of messages in the conversation"
}
}
},
"contact_meta": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"description": "Total number of contacts"
},
"current_page": {
"type": "string",
"description": "Current page number"
}
}
},
"contact_inbox": {
"type": "object",
"properties": {
"source_id": {
"type": "string",
"description": "Source identifier for the contact inbox"
},
"inbox": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "ID of the inbox"
},
"avatar_url": {
"type": "string",
"description": "URL for the inbox avatar"
},
"channel_id": {
"type": "integer",
"description": "ID of the channel"
},
"name": {
"type": "string",
"description": "Name of the inbox"
},
"channel_type": {
"type": "string",
"description": "Type of channel"
},
"provider": {
"type": "string",
"description": "Provider of the inbox",
"nullable": true
}
}
}
}
},
"contact_list_item": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The object containing additional attributes related to the contact",
"properties": {
"city": {
"type": "string",
"description": "City of the contact"
},
"country": {
"type": "string",
"description": "Country of the contact"
},
"country_code": {
"type": "string",
"description": "Country code of the contact"
},
"created_at_ip": {
"type": "string",
"description": "IP address when the contact was created"
}
}
},
"availability_status": {
"type": "string",
"description": "Availability status of the contact",
"enum": [
"online",
"offline"
]
},
"email": {
"type": "string",
"description": "The email address of the contact",
"nullable": true
},
"id": {
"type": "integer",
"description": "The ID of the contact"
},
"name": {
"type": "string",
"description": "The name of the contact"
},
"phone_number": {
"type": "string",
"description": "The phone number of the contact",
"nullable": true
},
"blocked": {
"type": "boolean",
"description": "Whether the contact is blocked"
},
"identifier": {
"type": "string",
"description": "The identifier of the contact",
"nullable": true
},
"thumbnail": {
"type": "string",
"description": "The thumbnail of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the contact"
},
"last_activity_at": {
"type": "integer",
"description": "Timestamp of last activity",
"nullable": true
},
"created_at": {
"type": "integer",
"description": "Timestamp when contact was created"
},
"contact_inboxes": {
"type": "array",
"description": "List of inboxes associated with this contact",
"items": {
"$ref": "#/components/schemas/contact_inbox"
}
}
}
},
"contacts_list_response": {
"type": "object",
"properties": {
"meta": {
"$ref": "#/components/schemas/contact_meta"
},
"payload": {
"type": "array",
"items": {
"$ref": "#/components/schemas/contact_list_item"
},
"description": "List of contacts"
}
}
},
"contact_show_response": {
"type": "object",
"properties": {
"payload": {
"$ref": "#/components/schemas/contact_list_item"
}
}
},
"contact_conversation_message": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"description": "ID of the message"
},
"content": {
"type": "string",
"description": "Content of the message"
},
"account_id": {
"type": "integer",
"description": "ID of the account"
},
"inbox_id": {
"type": "integer",
"description": "ID of the inbox"
},
"conversation_id": {
"type": "integer",
"description": "ID of the conversation"
},
"message_type": {
"type": "integer",
"description": "Type of the message"
},
"created_at": {
"type": "integer",
"description": "Timestamp when message was created"
},
"updated_at": {
"type": "string",
"description": "Formatted datetime when message was updated"
},
"private": {
"type": "boolean",
"description": "Whether the message is private"
},
"status": {
"type": "string",
"description": "Status of the message"
},
"source_id": {
"type": "string",
"description": "Source ID of the message",
"nullable": true
},
"content_type": {
"type": "string",
"description": "Type of the content"
},
"content_attributes": {
"type": "object",
"description": "Attributes of the content"
},
"sender_type": {
"type": "string",
"description": "Type of the sender",
"nullable": true
},
"sender_id": {
"type": "integer",
"description": "ID of the sender",
"nullable": true
},
"external_source_ids": {
"type": "object",
"description": "External source IDs"
},
"additional_attributes": {
"type": "object",
"description": "Additional attributes of the message"
},
"processed_message_content": {
"type": "string",
"description": "Processed message content",
"nullable": true
},
"sentiment": {
"type": "object",
"description": "Sentiment analysis of the message"
},
"conversation": {
"type": "object",
"description": "Conversation details",
"properties": {
"assignee_id": {
"type": "integer",
"description": "ID of the assignee",
"nullable": true
},
"unread_count": {
"type": "integer",
"description": "Count of unread messages"
},
"last_activity_at": {
"type": "integer",
"description": "Timestamp of last activity"
},
"contact_inbox": {
"type": "object",
"description": "Contact inbox details",
"properties": {
"source_id": {
"type": "string",
"description": "Source ID of the contact inbox"
}
}
}
}
},
"sender": {
"type": "object",
"description": "Details of the sender",
"properties": {
"id": {
"type": "integer",
"description": "ID of the sender"
},
"name": {
"type": "string",
"description": "Name of the sender"
},
"available_name": {
"type": "string",
"description": "Available name of the sender"
},
"avatar_url": {
"type": "string",
"description": "URL of the sender's avatar"
},
"type": {
"type": "string",
"description": "Type of the sender"
},
"availability_status": {
"type": "string",
"description": "Availability status of the sender"
},
"thumbnail": {
"type": "string",
"description": "Thumbnail URL of the sender"
}
}
}
}
},
"contact_conversations_response": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"items": {
"allOf": [
{
"$ref": "#/components/schemas/conversation"
},
{
"type": "object",
"properties": {
"meta": {
"type": "object",
"properties": {
"sender": {
"type": "object",
"properties": {
"additional_attributes": {
"type": "object",
"description": "The additional attributes of the sender"
},
"availability_status": {
"type": "string",
"description": "The availability status of the sender"
},
"email": {
"type": "string",
"description": "The email of the sender"
},
"id": {
"type": "number",
"description": "ID fo the sender"
},
"name": {
"type": "string",
"description": "The name of the sender"
},
"phone_number": {
"type": "string",
"description": "The phone number of the sender"
},
"blocked": {
"type": "boolean",
"description": "Whether the sender is blocked"
},
"identifier": {
"type": "string",
"description": "The identifier of the sender"
},
"thumbnail": {
"type": "string",
"description": "Avatar URL of the contact"
},
"custom_attributes": {
"type": "object",
"description": "The custom attributes of the sender"
},
"last_activity_at": {
"type": "number",
"description": "The last activity at of the sender"
},
"created_at": {
"type": "number",
"description": "The created at of the sender"
}
}
},
"channel": {
"type": "string",
"description": "Channel Type"
},
"assignee": {
"$ref": "#/components/schemas/user"
},
"hmac_verified": {
"type": "boolean",
"description": "Whether the hmac is verified"
}
}
}
}
}
]
},
"description": "List of conversations for the contact"
}
}
},
"contactable_inboxes_response": {
"type": "object",
"properties": {
"payload": {
"type": "array",
"items": {
"$ref": "#/components/schemas/contact_inbox"
},
"description": "List of contactable inboxes for the contact"
}
}
},
"reporting_event": {
"type": "object",
"properties": {
"id": {
"type": "number",
"description": "ID of the reporting event"
},
"name": {
"type": "string",
"description": "Name of the event (e.g., first_response, resolution, reply_time)"
},
"value": {
"type": "number",
"format": "double",
"description": "Value of the metric in seconds"
},
"value_in_business_hours": {
"type": "number",
"format": "double",
"description": "Value of the metric in seconds, calculated only for business hours"
},
"event_start_time": {
"type": "string",
"format": "date-time",
"description": "The timestamp when the event started"
},
"event_end_time": {
"type": "string",
"format": "date-time",
"description": "The timestamp when the event ended"
},
"account_id": {
"type": "number",
"description": "ID of the account"
},
"conversation_id": {
"type": "number",
"nullable": true,
"description": "ID of the conversation"
},
"inbox_id": {
"type": "number",
"nullable": true,
"description": "ID of the inbox"
},
"user_id": {
"type": "number",
"nullable": true,
"description": "ID of the user/agent"
},
"created_at": {
"type": "string",
"format": "date-time",
"description": "The timestamp when the reporting event was created"
},
"updated_at": {
"type": "string",
"format": "date-time",
"description": "The timestamp when the reporting event was last updated"
}
}
},
"reporting_event_meta": {
"type": "object",
"properties": {
"count": {
"type": "integer",
"description": "Total number of reporting events"
},
"current_page": {
"type": "integer",
"description": "Current page number"
},
"total_pages": {
"type": "integer",
"description": "Total number of pages"
}
}
},
"reporting_events_list_response": {
"type": "object",
"properties": {
"meta": {
"$ref": "#/components/schemas/reporting_event_meta"
},
"payload": {
"type": "array",
"items": {
"$ref": "#/components/schemas/reporting_event"
},
"description": "List of reporting events"
}
}
}
},
"parameters": {
"account_id": {
"in": "path",
"name": "account_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the account"
},
"agent_bot_id": {
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the agentbot to be updated"
},
"team_id": {
"in": "path",
"name": "team_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the team to be updated"
},
"inbox_id": {
"in": "path",
"name": "inbox_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The ID of the Inbox"
},
"hook_id": {
"in": "path",
"name": "hook_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the integration hook"
},
"source_id": {
"in": "path",
"name": "source_id",
"required": true,
"schema": {
"type": "string"
},
"description": "Id of the session for which the conversation is created.\n\n\n\n Source Ids can be obtained through contactable inboxes API or via generated.<br/><br/>Website: Chatwoot generated string which can be obtained from webhook events. <br/> Phone Channels(Twilio): Phone number in e164 format <br/> Email Channels: Contact Email address <br/> API Channel: Any Random String"
},
"contact_sort_param": {
"in": "query",
"name": "sort",
"schema": {
"type": "string",
"enum": [
"name",
"email",
"phone_number",
"last_activity_at",
"-name",
"-email",
"-phone_number",
"-last_activity_at"
]
},
"required": false,
"description": "The attribute by which list should be sorted"
},
"conversation_id": {
"in": "path",
"name": "conversation_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the conversation"
},
"conversation_uuid": {
"in": "path",
"name": "conversation_uuid",
"schema": {
"type": "integer"
},
"required": true,
"description": "The uuid of the conversation"
},
"custom_filter_id": {
"in": "path",
"name": "custom_filter_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the custom filter"
},
"webhook_id": {
"in": "path",
"name": "webhook_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the webhook"
},
"message_id": {
"in": "path",
"name": "message_id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the message"
},
"page": {
"in": "query",
"name": "page",
"schema": {
"type": "integer",
"default": 1
},
"required": false,
"description": "The page parameter"
},
"platform_user_id": {
"in": "path",
"name": "id",
"schema": {
"type": "integer"
},
"required": true,
"description": "The numeric ID of the user on the platform"
},
"report_type": {
"in": "query",
"name": "type",
"schema": {
"type": "string",
"enum": [
"account",
"agent",
"inbox",
"label",
"team"
]
},
"required": true,
"description": "Type of report"
},
"report_metric": {
"in": "query",
"name": "metric",
"schema": {
"type": "string",
"enum": [
"conversations_count",
"incoming_messages_count",
"outgoing_messages_count",
"avg_first_response_time",
"avg_resolution_time",
"resolutions_count"
]
},
"required": true,
"description": "The type of metric"
},
"public_inbox_identifier": {
"in": "path",
"name": "inbox_identifier",
"schema": {
"type": "string"
},
"required": true,
"description": "The identifier obtained from API inbox channel"
},
"public_contact_identifier": {
"in": "path",
"name": "contact_identifier",
"schema": {
"type": "string"
},
"required": true,
"description": "The source id of contact obtained on contact create"
},
"portal_id": {
"in": "path",
"name": "id",
"schema": {
"type": "string"
},
"required": true,
"description": "The slug identifier of the portal"
}
},
"securitySchemes": {
"userApiKey": {
"type": "apiKey",
"in": "header",
"name": "api_access_token",
"description": "This token can be obtained by visiting the profile page or via rails console. Provides access to endpoints based on the user permissions levels. This token can be saved by an external system when user is created via API, to perform activities on behalf of the user."
},
"agentBotApiKey": {
"type": "apiKey",
"in": "header",
"name": "api_access_token",
"description": "This token should be provided by system admin or obtained via rails console. This token can be used to build bot integrations and can only access limited apis."
},
"platformAppApiKey": {
"type": "apiKey",
"in": "header",
"name": "api_access_token",
"description": "This token can be obtained by the system admin after creating a platformApp. This token should be used to provision agent bots, accounts, users and their roles."
}
}
},
"tags": [
{
"name": "Accounts",
"description": "Account management APIs"
},
{
"name": "Account Users",
"description": "Account user management APIs"
},
{
"name": "AgentBots",
"description": "Bot integrations"
},
{
"name": "Users",
"description": "User management APIs"
},
{
"name": "Account AgentBots",
"description": "Account-specific Agent Bots"
},
{
"name": "Agents",
"description": "Agent management APIs"
},
{
"name": "Canned Responses",
"description": "Pre-defined responses for common queries"
},
{
"name": "Contacts",
"description": "Contact management APIs"
},
{
"name": "Contact Labels",
"description": "Manage contact labels"
},
{
"name": "Conversation Assignments",
"description": "Manage conversation assignments"
},
{
"name": "Conversation Labels",
"description": "Manage conversation labels"
},
{
"name": "Conversations",
"description": "Conversation management APIs"
},
{
"name": "Custom Attributes",
"description": "Custom fields for contacts and conversations"
},
{
"name": "Custom Filters",
"description": "Saved filters for conversations"
},
{
"name": "Inboxes",
"description": "Communication channels setup"
},
{
"name": "Integrations",
"description": "Third-party integrations"
},
{
"name": "Messages",
"description": "Message management APIs"
},
{
"name": "Profile",
"description": "User profile APIs"
},
{
"name": "Reports",
"description": "Analytics and reporting APIs"
},
{
"name": "Teams",
"description": "Team management APIs"
},
{
"name": "Webhooks",
"description": "Event notification webhooks"
},
{
"name": "Automation Rule",
"description": "Workflow automation rules"
},
{
"name": "Help Center",
"description": "Knowledge base management"
},
{
"name": "Contacts API",
"description": "Public contact APIs"
},
{
"name": "Conversations API",
"description": "Public conversation APIs"
},
{
"name": "Messages API",
"description": "Public message APIs"
},
{
"name": "CSAT Survey Page",
"description": "Customer satisfaction survey"
}
],
"x-tagGroups": [
{
"name": "Platform",
"tags": [
"Accounts",
"Account Users",
"AgentBots",
"Users"
]
},
{
"name": "Application",
"tags": [
"Account AgentBots",
"Account",
"Agents",
"Audit Logs",
"Canned Responses",
"Contacts",
"Contact Labels",
"Conversation Assignments",
"Conversation Labels",
"Conversations",
"Custom Attributes",
"Custom Filters",
"Inboxes",
"Integrations",
"Messages",
"Profile",
"Reports",
"Teams",
"Webhooks",
"Automation Rule",
"Help Center"
]
},
{
"name": "Client",
"tags": [
"Contacts API",
"Conversations API",
"Messages API"
]
},
{
"name": "Others",
"tags": [
"CSAT Survey Page"
]
}
]
}