From 459f225559950601d8a30918705b15be770f297e Mon Sep 17 00:00:00 2001 From: Tanmay Deep Sharma <32020192+tds-1@users.noreply.github.com> Date: Thu, 22 May 2025 17:57:12 +0700 Subject: [PATCH] feat: Update swagger to openapi 3.0.4, update request payloads with examples (#11533) # Pull Request Template ## Description Updates the public swagger spec to be OpenAPI 3.0.4 compliant. Regarding #7893, I'm investigating the use of [oas_rails](https://github.com/a-chacon/oas_rails) to auto-generate the documentation along with correct expected payloads. Mostly fixes #10531, related to #7893 ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] 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? Copied spec into swagger editor, reviewed outputs: ![openapi](https://github.com/user-attachments/assets/bd43f895-74bb-4373-ba6d-c5b190b699dd) Note that this shows two errors with the `DELETE` endpoints as technically these should not have a `requestBody` - in which case we should be making use of another HTTP verb or another endpoint. ## 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 --------- Co-authored-by: Daniel Jimenez Co-authored-by: Daniel Jimenez --- Gemfile | 5 +- developer-docs/README.md | 28 + developer-docs/docs.json | 84 + developer-docs/favicon.png | Bin 0 -> 2763 bytes developer-docs/logo/dark.png | Bin 0 -> 33810 bytes developer-docs/logo/light.png | Bin 0 -> 171786 bytes lib/tasks/swagger.rake | 154 +- swagger/definitions/index.yml | 40 +- swagger/definitions/resource/agent.yml | 40 +- swagger/definitions/resource/agent_bot.yml | 21 +- .../definitions/resource/automation_rule.yml | 54 +- .../resource/automation_rule_item.yml | 69 + .../definitions/resource/canned_response.yml | 18 +- swagger/definitions/resource/contact.yml | 75 +- .../resource/contact_conversation_message.yml | 109 + .../contact_conversations_response.yml | 13 + .../definitions/resource/contact_detail.yml | 48 + .../definitions/resource/contact_inbox.yml | 27 + .../definitions/resource/contact_inboxes.yml | 3 +- .../resource/contact_list_item.yml | 61 + swagger/definitions/resource/contact_meta.yml | 8 + .../resource/contact_show_response.yml | 5 + .../resource/contactable_inboxes_response.yml | 7 + .../resource/contacts_list_response.yml | 10 + swagger/definitions/resource/conversation.yml | 73 +- .../resource/conversation_messages.yml | 10 + .../resource/conversation_meta.yml | 55 + .../definitions/resource/custom_attribute.yml | 21 +- .../extension/contact/conversation.yml | 37 +- swagger/definitions/resource/inbox.yml | 84 + .../definitions/resource/inbox_contact.yml | 20 + swagger/definitions/resource/message.yml | 65 +- .../definitions/resource/message_detailed.yml | 47 + swagger/definitions/resource/portal.yml | 32 +- .../definitions/resource/portal_config.yml | 18 + swagger/definitions/resource/portal_item.yml | 40 + swagger/definitions/resource/portal_logo.yml | 23 + swagger/definitions/resource/portal_meta.yml | 23 + .../definitions/resource/portal_single.yml | 5 + swagger/definitions/resource/user.yml | 74 +- swagger/index.yml | 59 +- .../application/automation_rule/index.yml | 5 +- .../application/automation_rule/show.yml | 20 + .../application/contactable_inboxes/get.yml | 2 +- .../application/contacts/conversations.yml | 2 +- swagger/paths/application/contacts/crud.yml | 2 +- swagger/paths/application/contacts/filter.yml | 2 +- swagger/paths/application/contacts/labels.yml | 4 +- .../application/contacts/list_create.yml | 2 +- swagger/paths/application/contacts/search.yml | 5 +- .../application/conversation/assignments.yml | 2 +- .../conversation/messages/index.yml | 32 +- .../inboxes/inbox_members/create.yml | 11 +- .../inboxes/inbox_members/show.yml | 11 +- .../inboxes/inbox_members/update.yml | 11 +- swagger/paths/application/inboxes/index.yml | 11 +- .../application/integrations/apps/show.yml | 11 +- swagger/paths/application/portal/index.yml | 43 +- swagger/paths/application/portal/show.yml | 79 + swagger/paths/application/portal/update.yml | 61 +- swagger/paths/index.yml | 29 +- swagger/swagger.json | 2268 +++- swagger/tag_groups/application.yml | 65 + swagger/tag_groups/application_swagger.json | 10184 ++++++++++++++++ swagger/tag_groups/client.yml | 33 + swagger/tag_groups/client_swagger.json | 4963 ++++++++ swagger/tag_groups/other_swagger.json | 4370 +++++++ swagger/tag_groups/others.yml | 29 + swagger/tag_groups/platform.yml | 40 + swagger/tag_groups/platform_swagger.json | 5143 ++++++++ 70 files changed, 28448 insertions(+), 557 deletions(-) create mode 100644 developer-docs/README.md create mode 100644 developer-docs/docs.json create mode 100644 developer-docs/favicon.png create mode 100644 developer-docs/logo/dark.png create mode 100644 developer-docs/logo/light.png create mode 100644 swagger/definitions/resource/automation_rule_item.yml create mode 100644 swagger/definitions/resource/contact_conversation_message.yml create mode 100644 swagger/definitions/resource/contact_conversations_response.yml create mode 100644 swagger/definitions/resource/contact_detail.yml create mode 100644 swagger/definitions/resource/contact_inbox.yml create mode 100644 swagger/definitions/resource/contact_list_item.yml create mode 100644 swagger/definitions/resource/contact_meta.yml create mode 100644 swagger/definitions/resource/contact_show_response.yml create mode 100644 swagger/definitions/resource/contactable_inboxes_response.yml create mode 100644 swagger/definitions/resource/contacts_list_response.yml create mode 100644 swagger/definitions/resource/conversation_messages.yml create mode 100644 swagger/definitions/resource/conversation_meta.yml create mode 100644 swagger/definitions/resource/inbox_contact.yml create mode 100644 swagger/definitions/resource/message_detailed.yml create mode 100644 swagger/definitions/resource/portal_config.yml create mode 100644 swagger/definitions/resource/portal_item.yml create mode 100644 swagger/definitions/resource/portal_logo.yml create mode 100644 swagger/definitions/resource/portal_meta.yml create mode 100644 swagger/definitions/resource/portal_single.yml create mode 100644 swagger/paths/application/portal/show.yml create mode 100644 swagger/tag_groups/application.yml create mode 100644 swagger/tag_groups/application_swagger.json create mode 100644 swagger/tag_groups/client.yml create mode 100644 swagger/tag_groups/client_swagger.json create mode 100644 swagger/tag_groups/other_swagger.json create mode 100644 swagger/tag_groups/others.yml create mode 100644 swagger/tag_groups/platform.yml create mode 100644 swagger/tag_groups/platform_swagger.json diff --git a/Gemfile b/Gemfile index 6f6bd7751..b4752c745 100644 --- a/Gemfile +++ b/Gemfile @@ -33,6 +33,8 @@ gem 'liquid' gem 'commonmarker' # Validate Data against JSON Schema gem 'json_schemer' +# used in swagger build +gem 'json_refs' # Rack middleware for blocking & throttling abusive requests gem 'rack-attack', '>= 6.7.0' # a utility tool for streaming, flexible and safe downloading of remote files @@ -196,9 +198,6 @@ group :development do gem 'scss_lint', require: false gem 'web-console', '>= 4.2.1' - # used in swagger build - gem 'json_refs' - # When we want to squash migrations gem 'squasher' diff --git a/developer-docs/README.md b/developer-docs/README.md new file mode 100644 index 000000000..d9426cd19 --- /dev/null +++ b/developer-docs/README.md @@ -0,0 +1,28 @@ +## Chatwoot Developer Documentation + +Welcome to the official Chatwoot developer documentation. This guide contains everything you need to know about Chatwoot APIs and build custom flows on top of Chatwoot APIs. + +### 👩‍💻 Development + +Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview the documentation changes locally. To install, use the following command + +``` +npm i -g mintlify +``` + +Run the following command at the root of your documentation (where mint.json is) + +``` +mintlify dev +``` + +### 😎 Publishing Changes + +Changes will be deployed to production automatically after pushing to the default branch. + +You can also preview changes using PRs, which generates a preview link of the docs. + +#### Troubleshooting + +- Mintlify dev isn't running - Run `mintlify install` it'll re-install dependencies. +- Page loads as a 404 - Make sure you are running in a folder with `mint.json` diff --git a/developer-docs/docs.json b/developer-docs/docs.json new file mode 100644 index 000000000..7507fbb28 --- /dev/null +++ b/developer-docs/docs.json @@ -0,0 +1,84 @@ +{ + "name": "Chatwoot Developer Docs", + "description": "Official developer documentation for Chatwoot - the open-source customer support platform. Learn about our APIs, integrations, and development guidelines.", + "logo": { + "dark": "/logo/dark.png", + "light": "/logo/light.png" + }, + "favicon": "/favicon.png", + "colors": { + "primary": "#0069ED", + "light": "#4D9CFF", + "dark": "#0050B4" + }, + "theme": "maple", + "navigation": { + "tabs": [ + { + "tab": "API Documentation", + "groups": [ + { + "group": "Platform API", + "description": "APIs for managing platform aspects of Chatwoot", + "includeTags": [ + "Accounts", + "Account Users", + "AgentBots", + "Users" + ], + "openapi": "https://raw.githubusercontent.com/chatwoot/chatwoot/develop/swagger/tag_groups/platform_swagger.json" + }, + { + "group": "Application API", + "description": "APIs for managing application aspects of Chatwoot", + "includeTags": [ + "Account AgentBots", + "Agents", + "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" + ], + "openapi": "https://raw.githubusercontent.com/chatwoot/chatwoot/develop/swagger/tag_groups/application_swagger.json" + }, + { + "group": "Client API", + "description": "APIs for client applications", + "includeTags": [ + "Contacts API", + "Conversations API", + "Messages API" + ], + "openapi": "https://raw.githubusercontent.com/chatwoot/chatwoot/develop/swagger/tag_groups/client_swagger.json" + }, + { + "group": "Other APIs", + "description": "Other Chatwoot APIs", + "includeTags": [ + "CSAT Survey Page" + ], + "openapi": "https://raw.githubusercontent.com/chatwoot/chatwoot/develop/swagger/tag_groups/other_swagger.json" + } + ] + } + ] + }, + "footerSocials": { + "twitter": "https://twitter.com/chatwootapp", + "github": "https://github.com/chatwoot", + "linkedin": "https://www.linkedin.com/company/chatwoot" + } +} \ No newline at end of file diff --git a/developer-docs/favicon.png b/developer-docs/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4b7824e37245b524ab4868a8b5fdac88a2077c21 GIT binary patch literal 2763 zcmV;+3N-bJP)9&$&-R64+!@*%Jz$izLgq&{Bk?GV(Z+GDuC*foRge3{ct`qbHn+(;*V4af6^t z5k#3H!;%hCSQHFOl}EvhQ(1NlS|sf~zUS^fd9`}`{ocFxuI_JUwO>#B^}pxip8N3- z#*Ff(TcO;Qm4GOeAWkA+34lT%2%Cq59sV^YfK5boQP)!47a*S#2J5x@^m-iOCX5jX z4iiRHnienT3B;@tc1|dPNei7l2((Fv>p=7ngs8gS7@QNn{K?iF5uHPVdFX7t#eh)d zh7e3lu08$zk#%qgCxlPL7DS7AS#$=(fK&~F$y+Wo0&9iWZak=6K`F0VEOsg?S6D}s zw`%g(nyul$I^o&6mHS-cm<{fuy#PqDyb;aBU=h{`KW2g-1ZmZ#24GzHu@}4@OB#SN z;Tv7CS2uxh5e^w#Cm?|<8z0XsgCUFvf9jLk6_EAFwWKWvVia`k*~iD$pkN9Wz8r0Z zAn5j?aqInJ!2K5{ytne6#47AvRN_~m0CE?eWBH7Db(;w1!P6UoQ4z5}SK;4{zOB?z z+ym34RoCEBu+-KcLrw_DiSi$|FG$1(;6)!C&Vi5~=$t4gauHtj&6l9QyXxclNQ8*= zg%W=bav*czwdj%}@QjSA`IofiEAI&zlWB}E-*|cZFcxGAA>*VkGvU4H1(2cmnF#Mi zFAhYw_U!u66&R6`W4w;(Ui88sf}2^y{E;l)CvxTpXyWwKX!w~vLkq84o$9iI#|V0a zkMQ)cMV_IA=fVP_{KEIsjT6^s=JYVry9SQ&x|*c=mR@u#2xr9BZ5V>VlRF`oz?WgI zK_z?hr*6Eu3Ij5btLLFrl5*s(geQ9jP4@a0-p6(887SWO@9KSAw;hi6OZ^_)m+*S_ zjF0QqqvHM5ccbk}KgaeIo?X0(>jNhb9y8R%?#+IV>lx!+uEU=wA(Y<|aC{ozO?_#6 z-T&7}T>xHuP5Sn;FA2s9lovOyzp>i&kZw;l`|SS(2RN=oEx(QM!A}A>69)QrzkH*_ z-%#Q|eqM)vKbP=0mf$j6)!U+(ce*8d6J1|H08fRsnlqu$V$W9sE&ed@|D6d@zZUai zleGAM{nw7Z?HW9RV;XheKI(K#$6rb>ZIbi=EQLk7^xov2Sb1@8z3yZK=wI&LhDhiaLvF&m9n6XYv+x-{xoS`=L3^xFWu) z>ZBU+L5oMZ2$pc^>?C}8ZgS{sJx^Hld&&!)ddqI{Rhhk#Ha9=T)uR<|o<(Q3YBTKm z?_987d=zx0{jq(*>!i+tn!F35CpaNK!5lAMZGC9J#aocnar|^e^aK|FFTb@n=BFij z`-E?98fXmu;r{sRBj6(Z*+2Wu6xfOq|6J?+J>m5xf`-T2S#&2dq%7$r3Ip+lZ7jm)zFE z>&X_XzXyi6^xlNiF1{VM`1#oYYy&~;#d$3}2GXdtFI2|I+7m9HwbJUtB+fTneTxey z8n*Uvgd4Ptu|A3O`jZg`vtS6GEigyl( zIUP3-KKSYQT6=9m)FDz`_I>8evz=vP}8{J?YoKn?1+rH;9 z*ipYe$q)=swtOfvD|i6sgk=lQ>SDVhB#M(@fS;Wl|M;F@+jmukoRUC812c!g%_p4r zfnDE~NXK{z!2q_ozdU(!#PI}=F zDPH(PiZS6|Y`VP$-E{&%pp}@x1Af#{fvNvE+{V=YQ(pF@OwIj7JfJA=aLF;Y|=g zpj^E&doToVDdydM@$fF!g6d-E^O|JA-AB9NDGn9dwcdiyX<{%;;hhP|X`IrCp+Q<8x zz?P8SB77t0n}$yq@TY(Hc%K8Y>bh5xJA1h>WgC|4ULixV&c;#Sk zfhBnHGe*Ll*1K&xTiW676IlF(&uc#68=ZY_p4lh7e$s;Mz7>x77w*3HGj>KHMbiUQ zuT-4B50=3ezwr5MXU+^^9TJw?A37lXlzhEvOOn^lXAgJbmw&FQ5a4V3eWQvtJP_CZ z@B!hum}66t*A81hmv?;w=oh?``e@pNmFTNd4X3^W2hbZN&IbAvCbsUN#f_C4ssZAS zrK9hpJ<<8RbIUJRZ8=*-zwqwSXHE*ecOEZIF28NZ3Nd5CBVOFNKC_zoRHy%O>GYzV z;9WONzg-~^SHR;QU96qy>Iya*l_h|{WcY4p|K zX$;v)@A7R2aXGC@mqyg5VPSWt73*>q;bnevgb4Xg3+Q6n#{E`@_@Da0INRJ zF9r^+0m+3?MQ^-TMwFwMk;*ofz>^Csx*&T0Y4k=W3tTgutK`Mchpa_!yk^Ffqpd|i zx(%MJ$Rwt>lli1Hj`=DMod(~}9~r%ENe-ejxlK!L&e?ka{?sQ!!NnQwr;pNQ>-zeT zBaLa=M^;>$t!tbi%dmq`$V7CX^z}{L9B`>Z&J?x+!MpzM1#z<`M$RXgEag6Z2ch|CJ?G1_58Rh7{ZEGhE4a+nSTi5 zO{^zG4lp+^FRWQ!s@*@x#W8IF)(D}+k^iJ5hpuCA{0CRxK3pi8&;w+sA zZUr#8*3XI-Q&=s0LKsnL8fx=uWZ{C1lRUN9DAssOF&nKr4JU+eg&V;PyqY6~dG+CE z39tetP;OjV_7fyrb4Bb{oD;qsP6`oZMIz22;w+M^sK!u&Y>8E6jotP`lDN)Wf1Bug zXNmK|r_l@z71bb0ATT7N5}-JlJl%f0cGbzLR{1=9L@}R~k3g``~O(8s}Leu2UC^`*`iH~?8eSml67RsJ{Z|<5w{}y-dIKq*~J)K6hgMq zjAdktv5%eM|8XyUfB*B!%gb4w=Q;0ZIp;j*e0rs$rN+*3mIVX?u|IzFKo10BMu0#x zn@o&A4Xr*y9Po?T?U9Km2*k>D_(KCqPUQnCX*~7R?tzNC1ZROi=fxfMgikAU7Ac{DddD(``eYv zgXS-`hZvjm?#z#DWbj6*^8V@lfW*r9;l70!F5a@C6GIFx9+3rousj&urvOC%bW?gn zVvUIlwSXhoyy3yqa$;)(>unjt42H&ILdsW`890qGc;bhs*)52&AvxKZ+*0G05DPy! zKk|R&<2k+cQecqm#qy$}l-UP`2PY=OndUc#=y3+LbVtXv91;a8b z1;6mJph^}f?x+Lu9y3BWUU1oIcOqqPM@|&Vf-JfiiKGA1ewqoPTb{;ZNkke6^gHpS zoE&-{)ndbQG#qsE^0KNsAVgn-(wkWL*$RirT!RJY0pW(0+#RDov%U$4aSG@qkb*Q~ z@t2{A{8<@nKxI85k|-S_`OGm7I{sxsMW=R)Z+}PTm<9L&DeC9f3mEQ2^$U_k zXKTVn24fo}&O~j}9QBa87$OOV=e@&6om{m+05gdCPgyS7*M z04x2sq=w>nbG{DLrMG}5QOUelYB|J(j~F9Em=W&RYm$vv{BAGAw$XU~-kGq=-#H%1 zc83&I)-h102N2JnRvjtcoj{R};c~kcBH0B#QE&NAF8tE+4~Xo75aw8+BoHl(%_$E) zLDBinD%2b99eX4Tj)oq~7naGJ`Y}p#KypFoSdIWdj(5YAE4%x~j8b9blY6vB0~XIO zx9EEGkX3`rX;PcLg7@l-uZus7zOWRyFxUN7-d>P5Ksw*`ke%O>Pnr85QCJxMXj@zB!S%NHEjB;? z$QCB~(&^*I8|q5!!3vxy;4XXe{?^sBP3jN&qw!J!0DGHyOBFJ#cxOTvBr~@&G1FqR zqJPv5D!Z}_tscg%0CVF&YA%z%0F4qyjmV!rdP{X`0&Q9RQ5$cXEOCZ?!ody{rlV%c z$0nnY^5^s${p)QVEjI4QGUKi>A$Tquk^M%5;h^~?{Qj1Esqu^B={`yR5EK3tTEEX^ zElG0Iw(XldO&R>?{0(xKCtxyRvSU6T;E2;_4_6bkU%R=)? z6~8#=PlUyOIF>c~A<4OEki4F=?>lg?l?!MOSDn1?n}*Rirpi?QA~k=wX$9^=dj_Q6 zx8BAjer&^}&jwq`nd|=4YqH{kDWJsMT$TOb7^CiEpQz^J!GbSWxXr`#3d`+4oo#?I zR|Cd;;)u4JAuWt6EBum_r-j4HG3NGps0n&N+@<@hYF4AkJ-<#J_3qLN$Gk1Vllz-= z@6d{V8vsHs|FMuHdhEk@W^&lYSXodzrC0^q_h(qdm1UWifQ;3_eq5$P=e`gRt7(8-D+#Q3h+QS*5gHItqPA@8quUQ_hp@+robO?qO zSPx=t`kG4Fk^WSIu*$Xn6a55LN#sr-!X0vT@uIFg{XZrmI3GoF0brjvxj{QLu+~OI z1RmQn$K_=&FnN7v7ig;1P}O668yQi5JaVI)i7~#J z)rba%Ej|;~((#{|Adt}IWtqb{)CQX{f+A}zubojj9^xh$f}sJx?oXcA1i}rjbo5{M zTTwn5i!=*7mHM>a@)os&2*@KhFtP8Of+;*|#fckiDKu&g6*7Y&dRuaP|Ew!G5qfOQ z<#`4-Lkp%qHf|5pod@bp{hvA!EEC6PON?-22`}!7G<8Kb(&fl9kvik#^NQ9OH5weM zE>;tT@i{ixc&;tNd!T=Q81_hx^Yqw_i}MUp%=ciR@VShtj19@y94YE;GUUGwjNs*U zkhLW8@u?kJQJsU%z>x-oaQN(!QLEX%9dINp(;^_Ql>Ds!o-8cmh*PElEzAc{uqIOg z&6Br1$2K!?daE`Z;6I5XQ&JH1N9KTZVnU3RaBVozBE_6-^k)G~{ww)mI6Mcy{HNo+ z-$yQqe9eTgYqA8D4TSxn8h>)@H777#YDWqHbYfwy%IG9n{)h&*2Fdvnbi-c|)M-*1 z({M~$)ObAv11MG@tRAHPW16gR+`V89hxe}!`q6NW4*BjHW&JpAz1D}5u13-n(;`n> zFdr*MCmTWsJ2E)Y5h!-_$bIizN3$Z+&q+PYmRrfFZ+PF??8)8KGf^jvCmr#I-!@>4<&XQ_$RmN(h}H)_k&e^ z5Kc{Um3nL>&+>+VL5X8)lFw;D%Io<6n!CqF->LqM2dj5zwOi(W!hcrqXSrXGP;Ke%(+r_kE7oc(^LQA@afQ31)u*M)BZEr zCqwgeFzPQvUxPUVD0NX4i#g_WIUaBpc(4)+NY0`*qs{_@U%YzM_N4a{FzDr8;XaBP z#HZCKEO`to*rD=}Q~f*);J~)z7n}hg|6h^1Ud9GYcUdzZON;ZX@7feNYDkQ(G2H5H zKZW!R=>H#Z;HTb4GXHqSiqvq}-Hq93Jm%l}i56BE~>f*g!Fq8sfh!Gj%T1Vw8&s~uH6ytVyb zufP7+%c(a6Gpx|jqyW))1=!an*@RR!FS)gss@^#at}W6KVHt=Xx=jeN|@3-uxS)T z%KQHqYXd_5eqfJvrP$&L#Lq^51H`q(Zv%sFy zfu@&^HzGLxH$sPuJ9+?Z-YDP39l6O7#&=njAL`6?C&3PM$1lBL^+-mXe6-29hLb#RJWfN9Ajp=`C}5Vw(YP=PEb4;rgwA2>`Z()hB3rkX&F_^ z%R^+W1(vG}MU@8FwKGe$#v{tX`6|M~ZD8Pdm$JVFIoK0LUQk--E~`{&GdhNXjxVPv zVa~GuJVSM5WAR$8>9sQ!Po5n3_$LILFYNnsyp*B-h&aiY3K`in{4>V*9|jae1Xu%+ zt1fhw4O4g@`+R~78nK^C!rv-oe#wk%+)vM6WpJz7m!GH&-d1MmgY8NxjM5^rCRwO( z?%W0$*x_v53WJob_@}lj%I8}LQFJh|`2ohbtSC(!880eDTK`)Rq|sId(4+CufbOT$ zgQ`w%(IOqiy!vtjZUV!Hi!wNk)%^Bvwz#_7uQt|bOLJrD{0Z^+TG$`eg!QP%eqp{a zzeiP0opDQ%9XSErKJs;v0WT1~Ea^M@AhH)QWCGfE;cDbqao>eK1|Rj!M(DAUnX!Md z>WoD3t2Y)WP*=R1ng@kdm;)9>!W(ub6sj=0+QEB#DH{noUu4HPkFX&*@G>L9=PWzh z&?Q@$Hu=7E{G1e4ktQU9&`=V88(u7 zcL~BBI_puj|FfRQ61wAL6P&bHDYHLS#E8=Sd4<;1fVy*mz9Byra=aH7T=;Ytc}CVG zJCKeh>usE3ZkK<{6z|tJj4}rm(avSIA1~T!iaz0z&?kxSidE7lE8pN7pH7nS@AunY z)Uk?={n=ot$(fM=n+1Q2ish*{YZ=#dtA(9J%HRarkJJzMfO0%&NqFOuV zySDrUCA|;!f7tRV9mbx7tXkfL3iz1sId1I~H5N*K!}H4HE&&Q^;g}^li5%ekLAW*O znD^b5SL!+1=Ezh^s_q_c25M(v1SAE>(O`kyVqvCf&G#H9Sf@qdA3S%@);1+TuB4iw zC)d-^mhC% zK@D906Clq;XII6Uq)El~5 z;a0~X_kMqOy*SwK^gY-UV%0HpK5}Bq@kDuL4mnM{FlJdiKilKSDt<~_!IN18l=DC*UtEX+Re1EbAt2|V*3dt`U& z=`H`WZq*WD^@+JNS@oCtR$l<;sAC@)ayK9q!jM|ll2JW^Xg~(AQ(k>e53l~)#j@CA zRe1}VjccTcaSQ<4X)ckq7W(?*ZP1Xr8?fjm^me_y|Kh@Y%ah3-yie)&Xw#68Gx?|w zuGkiWU=DEqi*uacT5|ewFianXk+3qqH+TdP;#VRLUq!RK3!KdzV%z2?dyLR)>&jN< z1kob_mSb&cVQ^f~p<>C%q;~5TVY*h-9}EuUM3)C7yB#q1+kj;a9FX! z`Su2Gx*xH*BWO9Up{Ta8;tKdBr|1I?$^Fw(Lhy4(%G@IL;EV*^8h|q?tEe{1b#Iyp z-{XDO$rJQg;DAVMkfzz(1%|(%37>7iFYP9X0O5kPDm1k#b;KlI@guNmT~wN!I?P$> z`_*nHG1$i1}#Cb{AdMa*=gZtmgtr)H2HyRt{^`J9j`|q5jIjV%ABzW)3r8$6O*t8{JKnHe`nbg?f}5K(bKB=o-ct5p({f#^xuMU+vfVR#{^7 z`BqhN+ZEIm=R2q!GQ4a?IB*P>F?K?#`gZsIne(Z4IS!WUY0g(=0n2vRZ`{laAW8Ta zna)ju7AC0fC0T9ew6GNzEKM^r5P{=m_}2Kgt(1Q)H{+m!;`#ny=x!8I@qjox6{uXh z*D<@kwCB8JbMvntUfkk#qGdyLcXtbzgCrOhIYp63b0!9iZwwRDgNeH^F14>SEDmb}0TG@$$utvj|pU31fA{{PH&&yI*=GNO~3Zz?=d$0|#&xOb*oc6$X@ z`>;LNVxQa4A(2y%v6cjWHXjYTV)H4o7tXIn<))(F$vrt?$7SL_Z93m-Mg$##!JOG& z5FhWZj%}}}G0UhA1TXc;4{fv=t*juF)QF_O?#35gK-MBa?m+Yjma}rj{j^-Y<(zVL z;m;Y)_299EUwU}q;0VvtAmqIfU&8~4a)exRb@X&AxyU>HM<02Ezn*IYNvSElzB){? zuW}UHp;Jr|9}D+`=Xd=o9{b8EcfdaMi1W<>GwCjModVDQ`|CE9*sP#maZ|VQ9DQtQ z=IxIQR@?WPS{@LVca}Q6T+mO?pbmnWwPl#?`f$$_kJwK@WQ<{8Xc~<2&m2Rp@;H}@KX!ZFfQsEm~5pOvHC-t%0Ib5i@O3mLQR4+dsDH^}e^Nucz&9fD+ zKEqG6H?)9}7eU?^Lok$~f=>yf#22m~PRc!=A)-}+JcXY^yqn@2e~41e)vKLhgbp(V-PO1B*ob)E*$ma~#`hAkGozCCz~;SA3a2c3 zF)P=(M;OX3FEfBT-^v#%dcD1+-7+n25iX1_;{s8^b1c5M|Cv@-zOXDKxygVH;~Cm1 zR-p-Ew|eepkAu<7yl0%&rj>YVe<$^x{F$nys<~KL)4k16daM?{A(F_vz|B~^vNsRp z%;lEkLenZGiK>@2anz!w+bddBpR0ixLT%E4KZQF)yE{btoPM_??eChj+*CclS}=r? z8&o<(uRdMr+S~G*l<&8TgD*QvXWX#&ii7%U<%YsxGvc}4!TsAj5Mua8PJX3$Q-tNi%A=P_tTk=e&%8h4F??^^+NI=W^w_crZEm^(2)}Z^LTy9O6 z$2}sUIRumAQhd|i?b74`W1ew%%~ci~tpJ_EA#>rNbwTM=_4MHCXtJd1?m#L;I_a_A zT$fsPSRt@!iCe-;Rdb)8jlES`V6X*Yi`M?p`fPc_$W*!`R9^0Ja<%#xYX8wpetTzz zS?hFaz(keHi%g-ltb-V~t?%=tNoZY!HCpDF}?m6(#uTuOM z-)NO?rPh$M@vZ4ky$B6~R5ZJ%QRndO2|umA*6E$)vHki$cshITOq62K2r2wQfwkP- zQFi?fda(%yI>vV=S|mN<@zPR*pPhW+!5>3bypi)sDWNEew6d1Vt;WD!uX%WSi8t0g zug)P394da+;$fe#O3SmmvlS%XCx+-&qh^Wy-e$0^==yCQ4y9Px_DUA5XI*pIgrQCg zKSTR7(KC`x{3(8w4XZLW%vLXa7_eAooe|auHy$@-7(=Qk=j$rPjN+!SpI2NuULX8u z*bE+$|EBB>@wW)4tm(jAx^BH6*t50&;b11VCYO6n zo)16aD`e6mXg+&EVL>p~Ek`^>zR=NOVq$op*EhLzIDaFdbsa8MX@~fleDi2F&tdTBF`pciJ zbTwh5p{$Z^^B$jtD*T)<@rg{LYiCFhW^+sZ*+b~EESW`+d8cjAjI8F#fWwQ zvuHKEZ*{jVie}O~QZr7|tZlqpS9U>An3Pn{*CFN8f-@I>-2+UB$k>30a06EXX2Rn1 z!F#cYmd`+lgzsSt>F^wzHuSUZ&#Y$a_!>HqX(Ft#k%kO>BdM-BYbHh5AK zlwhb~rdG70Wz-Qc#CTt{K7I~T-KPa57cO^NzP59D34`poN!#vRlquc5c2M$`wd;Pk zr0b5?;qEH6xtpdLV8i8DX7h&V!}LzQ0q3)Xp|GpsTU~#v z=0K$1^1h|5PJB&Ja2oKbeV)yMy(-df{WpMM+JyLOD%Ahkt$lGkG{2|gRP<~V{-3rt z<{co$OUo^qgs#Tzk0GBRFt#G*zqCyoQOy+dn&ct2nD}wcrvCJtu46j!FC8(Yog4VB;C+ zJK@I?u>xGIsgz#h7+gr3vvgDTGn$838OJK|y$@x+cgf47HJ5vXV)bFQOZELopI5v{ z#uHgBgXD%12ZIW5c^FayjViJg5G<@@pxU{;?k#LAddcZcC`&3s>vN^BLuJKRlMsQA z&Oux(i}n4zhbu#5HW@{#O~wnEopMJ6Q!^;ho(`dqg?VHxi(;lzoHE5oY}x9Ui?TPk zJcuP%LQ|PKzL)#~!BNi=_0VN86a$?Mr4;5D*@}xZcaIbEqn6qo)j64*X81A;%CRh- zh81S5x!-d%qYx#1Sa<&ZMTpDv%lE@YUDHI3Hj4 zJq`{O#hbrVl`G}dESS&2^~5`HxHxyoRp=yFR~V)60^`PRhF8g?d0G<7;cWZ^%yU*ntB2dfyg}(N@PnaV3OI z7DYPSEV{+dY~sJc_9F8G^q%qe9zORB7nAtKJwbp0D^5(E1@Gt`yDh7#F7qs>AG~RcuE2whS`rt6lvUR z`!`3jZ>He9s2@AJ-8*L66Z$IMwmd6Y`-eArzk(+6@g{dlvNh)cJ$4@XDY=B#+%o=4 zy__&7cIt-I^dsV#SoO(R(G$S!vN1{;zfI^&s@}Ygbk35Li#khC$eod;Ozt}8xOR|E z9!A0VZ{22)AD*wl9x@r3qJCO>11efS!p@W|XO6JI&Rm#7rCl-~1*{!x$P!01=I8T# zef9mboLUa`_14@1%8(<2ZOlu3=DE&7K2cH?5guGgz`%W(}Cdy4b=?#l=V`0%HEjRVo!XuvCA#nk6{|NcwZuIKzi}=Oe2XH_yWBsT;{wmEPWulX0Ze z$tQPSW}#j=6!~t(f#>`F33PyU+R2nM2l|b^>^sE9tG?Q7w4|T@@lLw2S&bUQSOS#$ znq)qVAv))cCTkTqF;1yC_+0CHv`9GCGT>RBw=gZtHE!UvbjS+zjMT|ZieI}mhJ144 z*XQJt-|Y7Tvh0SNS1Iafho6k*mI`V>#Nu)!KYGqTziLqfn_bc_g>pg{tuH2*xV!7E zB5Vl%RIu^kZ^+_Lcn%vln;k~R%MP>?Ty;+$2|3w6%e$-`eL>v6f!Ruw_`!X#&F3rE znxkGdGher!sxsdLcKEpl=EYz2+x?r3f$IBMZeo}2ln^+VIScc6h#yZ}ZZ-J0l&y|5 za0X2Bf`!OkE&Ffoxh6D7!sDEI7=X#z;mV}}0BcUXc`y{k?0io&P907MljvOct1`Y; z3(CE-^)8Fatvd|J$WWAmMMA8Vsz{p!N*6K+a* zqGs*`9O3ne)!;DfLu)SHn?1m-CXe2Dp(QO?>RiJKwj5?KM%eA6A*T^dpT|J(EpZ*3 z8~x+YN~bcw;q}5#G`S$FjRj5)z5GE;)i(qZ|5m#*Y0kkPYOQ3Y^{Utmlj|x^LEISAt5Lpq6{>8GKt(bDA-J5RMVt zsAWma1K{ogSNZX5*cA8rY--*ar^n8HtmS5%kske7JSF zOjQ(_x3M@o<~)dEDZhS@=2&+n2h)P{!K`c z&1L0_*xd|!RQv`FET-yX(e+pyzq*l&k6#>FySfm*(4Bkj!gF3Z^<}ZXnnahAi0o%2@a!+*%(@ zT3lj0)oH@wSe=WLN*@r+oag}jXM!hhj;@yM< znm$8n4T~BCTVy*G)doE=8lw}i+X2ued&ktArQXOy+&dSkfsX`dx@hLxs9EcgIxZVp z08hDUQ#05a0|OD>>NkwUNb43Vet|qV`Hul>Hy{a^>!?WD#9L4-NsgfKp@^MBH^5A7 zK~O|A5>`w**Au4GHo8M@E|X%+7Mhh`fZn+P7+;Pa-4px)t=0@yIlE5(^Ry~xx{w@; znW@v~e|FC+`i=Bkm$K&l$^m3wK&3zF_q{371>nx?1o~sq#4X({^PiuXIj)>H&NZp@ z?6k&I(Revh%*8jq;v+L?=MEPRv$iaz1Ku+c&V3A0Pz&7bFka0j@AA#c*P3>c0(7K3 zq0P;xN|iA~-O?BJvtyAA!>&t58((GW0t#C1T>}G`_!?DAYmO2@_u<&M1?l z3SQa@Ozr4Y6g16D+qp$^uQkN9f3zPF-Q0HVS`e&oQp9YotRw~PQUZk*1T_=8Z|4>6 z*RBOD*e;)73Qaevq7W8VW>WU%cHDw6yX59C`qLIxEC3V~ACUe4L+T=|(U>hJvdUt4 z(T2j-*OK?%e(AZH%Qx2HTO!@PE6|`oL6`derc!_6<5`J=Iz`LhtIlNdyGDmF!0OSzju@v9AX&G-)Q z=hI^GLcnt-W<1QkfaM0hYXT_`A)8OZ9S@72H|=fc^aiAuHYhVEmU3@>mNMt%l$NsS z(oQTe7ph~{Dz%6kwE(Hi)g~SU`0V>o?)dp+eR;F7DW>)TOITA|eGr zNY{qDfKi$XBbdRt^BJ>ap+3}r6d#-w0(R?!DDzZ;~Ryv~)b~xOp!KQsnm_a)S`r ziJ7&X#nkSV?QO*F!FKFkYIk1aa$yTuU zNo`n74rE2?&#!jTeu--)L4n@}W713cd)9gH!qH=@99+|TVSc^sD^jzjo1Vc+kKd!H zZ@qgywF+IHX=whevfp=L>vVlXBhHa0g=YR~lVxhlqTfbFISBC$_c;0d96_)P3T&>V8ZP`^eMfm zE!Qpn8UA3^#zSD^x>h zPp)o%iC#sQERd&aAR<$9-um#s3iv6#WN6%Mf>^~|u@%Q}v{Sei#)I`*x zC3-5Y)N_RTf$@fR<=2ps;~vzw>v#>cs!*UkvrM2y8kx!q!kMlD<|P}h7>uM7DH z*LWL$LVL15zILxNyct?BorEFzeg9eEIj{2i#iB$gk(+C>+R;Aep}*zxmtPF(x78&` zmMEBTanl|-P-2wej%EqWy()Vt2W4w#{?Tf+7Bqb^JUFa=5qPA_S%5NQelJ>+dLU?K z=2e>XHQ8k->OJaJKAhP4P5a@LcP!Dfz#IJ2_3Oky|A(h@V^dI<;v%Rx_aw!KKV|Tw zMgN4m-2%~y3039gvYKr&i)D|{X}Jj--)uLj02YAnc5W%;p=;CKHhYNty}BUab?W8l znk7o@;9yLRnJU-tnsu2=r$f+!j^f0&v`8M1HUqAUJ^(p(5J#NIjf6&cCEX+@uix;Q zs3MoWCm&zljTY^4ii9C=O84frph&iN7fNDo{n1~Op4-Xmwom#X5H|mjxTU4py|jT} zGp`7sjSm@`>cNcS74VT0ei!O~2e+}Jr;;#}R>Y<2k`DX#Plo&3SYGDdB~Ob8l~V3$@b5fwgW36!pG-xU9$lG z*XjN#b>NmgJ%Duifa=T{SkY+jk?EkW*jq(IK!;j>S*@3X+7_ZbkgpML)xErl8knE~ z#{1|CO8AF0&$v8{>St~`x}p>3D3OGu2K9w+U##$D>S(XU(~MLDUg6NpmJ{`^?fA$S z@cg2eo66`S+OJ9|U@O|6&1yAQi|mtbG@0t%(k!{k{<=YfwLyj<8a$l5*k-UUCi=ts zv;PNZz3Y1nzf2^yT)p=G=v!rPVNuM*8$E#>PzvsLy6{#LnSn4w~T&Q|)dU3eW8uvM5J=E{>HW^-xk zq&LL3ka0_wi^q`WDb`?%79@zgzVikMEAf z_q{N079JKXIej8{W-xz;X}0vemi78=So)*onQKwvo4ET!1&oQU>!S&8?5D|ztRa#h zD_QODR+*TS7MDd1+LxUv|-;I!vZ~OJ057@?&L)g}D|l z7|HpeIUf}XB*IBLC?gh!oI8FiUzj5XAJ(WBTgd`X+2$+{9@$P~pzF27uDy6CWr3FG z^D-IK*cZ2r2FOC&gaU^7hb#dFt1ZAYa~jaRHXyfz!MmL&qwMi7nG+=5W`Jkum)a}R zN*1%-6uG)9!d=21Exv8wohA6cS_-e^5c&GP`AXF*$A#ta(D>28m0eN&f&)w2tE)+p zC*BZ5`&j0hQFqJqqiMas{LA@16LoMR3D3h2I?gFKAL{ZbNQOe4DKWIA^%3# z{NNW^@A~UKUhQdUCZm|6fPXgdt5s0S_Vl-H;T#DF;`Vu?D#e-2Y*uJJLQx|? z3Bd8o`1eJ3fzm>uHSA?F^7AGVQWuniCXY>RTbtt zC%6kJiE7Jo@C!bQ2MrS$KZK5>7U>6H@^BdWo3-^8vv!bD)!Ec4baPG0Jq#ZHR$CcNQGQyuOb@6RO9z~y25jl4`sh;xMd=Sg9+(2&k+kJgv-WvWE3uvt zucaLupTt*u2I6YmT(-@&zkZ)YQ(Gfe&n!e=1YY4KSEeLZ_Zqk#{OG?FzBB##{hppWd-U)}ryiQsNjOX3 zxwFWHduEYQ-?*9zMPsGt1&h}zW8iUF>=IcYD`QZurirSGZTVIH-LXxUGoDSxh4fdT z+vt^@WoysG68!e0^YbEShOv|?TQu;6$%G9(XtyJD&y;t)c8KjA^!?ec((y2i<}<@_ zqbzJUk04)-CfB@pWF?2=?$7WvtnHR~dmp3Q-z)@$ApNhY0OmtVV~12pj+ z!wRW4+iiM2}vD}E?DIeoJ78Am7XR0E5wjRF$y>%8o`{&${0ti z*Wl)gppavzhFBJljlfj${eh{og+C5l-uF*U&P~WfC=d|Zsbyy|oRDdl4)#pK=x3^I zH}|0RYlAIxEbA%IeAcg#ci%YAv~*uudSJ1zqSp6dnu});z0xc1Q}r5+U`Cv?j(ye2 zz2R~D+~c4zjl$J|#L4iSxY0rPMVfTk>W`;o6XI*{x=JhvYA~@2Ws_qIN!bt%uWPos zs|as6KGNB`NB5(XQ3cdMg955ZgLNWtMuEv7(8iC4X_nJ&3^VWBe~rn6qy|yj_HXK3 ztQEqWdM~2>sdT#~(^$Hg?7+Q|96=V<=EB_t%yOddEGs4rYDro%0p3mi}^OD`cpu`HHSgr{iS87@E08#E0qfN zzu&_a{!(ZNFjdTj1-~mq>c*ZmyDT`N(4O(27rgjLk?YM!mn3U|rrORm^<6=O$7 z^D7^d{8&W?SR|Ym;dh9l_(?jL?wAcF7Ge{d*Q=ve`%uz0osb`O{ot?FikeECh0`v9 z@yR0=M9s-T)ql0@_Ia;o^npcf$)!0PSI32Fc5uHT%NK7``9(2pQv9g;y_9OMNl(Ww zCojy)TnIN@KehF8!htMzmr98&!OKkx62vMl4o?#0r>z_X)^$z=(5{+8;VA>pe9{U_ zb~5BEn7`tG%ZH&NCx0eAKDC9`<^tjFJ6-$k{5QgnI2fa{xkSZ}9?ZR+ z-eBz@FIUZXEHIqmHy%Y|lEi*_BcIUs(knU#K3bbNaJzIQ@C<6bczdSs%`2`rI$ssF+vzQca$QdA9%l8F zrR-t|QU*Hw^cUa}0Ag|T4M4WhdB)*ywgi!z zvJg%BrSH<|m)`ITtW&BPR;@`!dU)xcNtq@2Ua9g*)kNkU1mw1igZYT5XIP1%eUoht zJl~DHN(;`ngh2;u;T-YnPRwaT)k>VRXDvI<#;eynd5JShb9(Gg*Z(z;DlN0nZal?& zmh^f4q0-2bZZSC190kpW)5@tc08bDTPe7S-$BBut@>C1Xth9+2dp4o{F8w#Eu1B8t zDZo#s1TldnRc7#dQ@~v<_%5kXixvi&@_?y)zopBW#Z|2|P#>YYN?ZEsqWYk!Nh-!I z`4AJk@rn-&zY3h6^$(W5xlv@ZLlA|bM?HBu?;V&FWv4@6@Fxc2MczI|t3EM)`KWfI zWUjw!tX|N8%S3xx&PP_qckCt2Ov>HUctf-krXX}Y`Av}-8a^MT1!Dv!32ev zytrj8vF@-1wrMh;G)OK6*rz#9O#R#upOYGZD9ad-%iaAVR);Ov;{^ngSX(!Ot+VS4 zXD?*3g48FlL3O4C6TZvMa^-n^hP+djRTW-O4g5BDHUfr#&#NuRX7JM=4(1xX_lFlV z0)r=lPgq@rI{Wh2Sqdwcdv!)xynn}wA|y7fjpnW_6pG$w;o9ToGH}yqtZ`{S_1mf) z_!d?*?%-1fXYBF8j2^EkI@KiVl8*IL(UV&ssl)FUfhOT!*pgNqj9odauaLjvE8*j=qDvSrCriJf)KVIwZ`G^olSXmunS$72MQ zp64ie7C@j*L$2g{^)-r-E>DJR?!aK_nwMpYNQcg9+5TV-GvmF2ue{sq-I=nn9`aV8 z_LT;bu?&5dzG9mXO|&%+ThS!hgo|6O;_t;+yI}M6HuC;fj>677+lP7|hY?@yf7uXPwt$*@*Y@ z!hJ(G+Jz+v)#k{(I>YAmEOx$EEHEz(PWnPnCbxy#r?a#$#&1$W)*a*g%{NSHPPa}V z5Ijw0AWpHG0S$q^8$< zDCQMcp=5RFm(kW|jkf&2cXphQZR7RY%JfYIwE(mFz5*A^ddt1&cebzhq2F|GSLv(I zDDRkQG|SsibfKsjSKp6^Kc_v?o~bxqa+!5D(hr!xyg@RSf!&2Tl85M{p9*Y!zGI#TPhkeNpT`BJg4^v+ zv$xuQVz`+=XDR7{b2h6d`?;JMcgd#ZYc;3kYfDr|=EWH*WCR+q6kelz50iD&E+P!+ z7+&W@olr2?glMy8%o+?DXuyaT3@8)TpL*xZnfXFkU~vi#bosixf;nr<<^Nnh8?8nn zBWjU1ze4NuqFQfJOWA!bRJWmLK&?P}e!D_9V&GhZrJh+^!L`YRp>zi=coV%sVm!h% z9y_YE5@yc_hxt*nVHRY@QCCWb-qe=Hk8c`YOKmibUBX!RKrJY&7)F4m@YVBp1 zS@pr)>DB5K_?K7tU3CUYBrAZ~#BTvtPgXQ|dI?+79hGO^ZHl|P@Ocr`(x*_do2?2M3DO{e^-jx#+Xge(d#YR~00!|1-KamiH#rQ%$ z)Q2}>lfc(laFCQ20Ex@P)L?iH8)wih7H6`YDYSC`i>b}fRg)G(oY3#zFW(hqyV!P% zB-DlcRPt_wFoosH=bvR^le$g|a}lRQ%HQNu(BiTSND!$DanH|2SQbAYMrT+B3=0>$ z##h?qFyBIM_YAuGR+M`V@7!*edUojLZ6ZC5sqxCZH#W9SRvD-D7RQI-07SGBF1MDa zE)=?=*!F0g?0)RZ!5;n$)3h=#{_b{H5iW4>J9g&6Zw4tvf&#}?BOYhleGX=_xtctI zPfcJd$!s0iUS8?Z#R5CIS8ok;Za*^2LZC24{XM!7ueL>&QDIK&$)|kSXxuK=FT@(| zocH6wCDLO_wB9c*39__tS^dC$rJ8X*fJH#C$f`mcq}^>rlTe`N6vr=X+EOR2E8&?q zb(MNk$dk@}*7}`_Vf3XW?1n9djsee`b`2%=L5tlzC{RM7!)WhC2{c6YrPaJ2w2F&Nq!cr<|DN zi98HBWZ>~#@Ila-luSGYl=&2}i8|xR@cs0p{RVZuO`$yt(NDnDoco2E&jtchCM|Vw zO0ae1NPn>m`EL}5Z1ZAvp0At8cPixI6XuCH-dpk2p(iq5F!r>S+MWhI%Z4Elsl;3R z-0G8b{h33RF;wcOHyxsO>6>^tEwPa&1XfpL=NzRnr?myOnU(`IA6hY z_+MMpvVfcnoXpzFs(yC}_@^W`Wink=;Q$g?dB< z%WT!LKG9}~mcF{f^88qm;OT2{O{*B-T%Gq)`~Nld)^Slb?fdZ34Jsl?-Wa5GNT-N& zE+DyrfOJVOEux^H(jeWebl0+oz%4Dcguo)gN;fS1j=x9m@4Nr#=eoGg>6vq8&f_>_ zuhUD$eL%Yg*{^>4?aWiO@NFO1D}335z^Dn4jWKGX5IasjyThLJi=HecX{OLpIrP=j*nfeHVK?{1wm^P6D!?1l=h0Lo>e8Xel z!1*2{sUU(H0JsXh^rVBhH|R$&MMU|MmySL6loDXaU&`;v8LTGsF$`%`hTE%;}ohT6r!hVMZfNsD)YYPp5czxgrq_RlG58ZWG!&T-) zDA-6EH*Pg>bq+(nPjkh9abf3m3xWzoHe!$N-KueF0+cHd7|-`2ywJyAU6?fF87)%bLHrdN={35=J^p+DKR(eJ!c7nmMM;RWILlN-6vL%>T?iQZx>z<8vkD= zD8_n|0`4!kTv)s4d=sMC!6N}(p_$Wypa_3fq5)pqLEQyJ?|dw7M;AhL$tVi2)CY;z z7@14UY{;MsK8YiPdf5@zaG!=c55mAdPZUh0Jd2G9l5Ub<{5D4+sGmzlipF>lPM*fH z#Vg}!U>S<5k9~YO?{<>hqnD(QAB4}6ki9?DO!0F0M3*K@jPlnY%D98znRYz?XH#kX zH)|QymFo)t!+mur@(UUd(#c&_w)k}+V|dU*AhOQec~R6QK^2|0B4P}s35(ssN%t;E z8^m$+juV+r($kz>YylLL9O@1sq{l0S^&!3OsV@Z8`2Sc37_`9%i7Vet#5#bPMkDgL z*84lK+T6^Q+*BGMs#h6ae&1jO+y@#%BK*0w>&P2toyu779@dcirC7v6-W0M4$i)Z) zz_?&;c#A%qwudSA?$60Nt85St$_>p+1bEOd ze11(#jExw8P@znWI<7QxrN5?wJbX{j2KW{R^S;1(7HL0A-!*h>HX%h+*2nfqD3y~N zPk&TY+hA_t0vAU=z|lVaBDdsr0X|HYl|(S*vSsW3Xl%*FLI|DDl4r}<^iBiCCKCT2 z>qK8sujY~Yp4yqC_gfT@+mF&C2;=%jXK~mgkI6m56YZ2qqL=T&St@c{1GP%W4o2B8 zBZK>s%Mn`r^KKrGxkYjJmbWH*-HYlYKBj$`mgKlQv?v1#^!7tfgiUY=$jw)F#p>^} znvntw!eEEwwxO5*ns8+whRex7l}80(Y3HR0G#;vJ8@cZ9OX zm#j_$u}9X}qf0VRswTg*cBTpf%me>>$P!1+E)56hW%PVDgKhotlEGcKeTF?|zT=Z&La}GL&R`jwlmjFC*=)~j+9X^)m=Xd` zs;?aw4695n+Gif| z-6oD+yNk$}8P4rQ)>ieKXYQ;ebv8Wd=F{4Yp(XwmZ#OZHlVW5L`uDsNzZco6)U0Fa z_QE{cWqckZYqK7gwV83b5DC8Mhd1dA`DX_`5DE3MQARJF^6nMXd3|5a{f=E7=~O7j zcxe~JT{>IxXDM(|uE#`OC}hec)MMG@m(++MgV-b3GmC@`z>(3XH|xXzXrOuuKOCaZ zcea9Em*vlQEJ9?q;?^$wIM<2BK4B!+ib&3;#KD!JM}j`xDu{I>xHxM7WAlEF(+t2s zu>NA$IQx`+lBn?PSly~ZP^Ys?mI2q>J#E_wfNM+X1SH82=ECA@2edowTxLuVcf8WT zjHlyl@<%=KIEKxW9QojD>-devuNC8zO+}N22X`8(Hocm{1GtYS+rq>BH<53v6Qqm} z?GyTzzw9Pn+>B$9*vd7>xBBhu89jI%Gjo62HY_zLKc<#t7J{uIe`$0=;CK5C6)KW} zVzVMfhrm+DbE!PhogSq)^3mG?J)nBdP#*M)hVJ_Jn}M@AV9h`-v@7%cJD^yy!5p8< z3tzcmAVY^7MEpEncMG>(atfhc3UJeo5?ZIj_0kMjpgJ>;=-07$sA2WYFN_9MG#H$pQFMXl#xrp(1D~wUUOlYLL)9-I(yuNnY5E&b(LQOMm$Wb z`ZI2CYVKF>lt8KIDtPgNLpu^DCp@xr2OES!+O__{eOx9~C$-u#+i}T~7va3?TgV-R z>^;$In&z6hJ~+VNJ3(CFnCE;qN+`8b8Q*GJ%JbEI{YglKC!1Uxe{a!safp3+(Ly?TtIBLzRO<@Gm)-XLW0@s*ZSzjs*irbr)jqVv)n3{bzjr*p zw@*de{lEb;XX}NY*qbSP;Bh?LLK$afk2!`00V*t?A^j1^_lg=_KUROwhL~zuA9-TT zn`xL69UH>m!U;|49t>)&wZ_(ldNV<=+pJ5}T=izAoZz8A0o5;~Z!8YGb!9*8)x4lf zpb#P5xLUZa&#qm^2tt}1E)=cI1Hb#bM1You5K?4HgdJ0v8X-*6KZbk+OKTP}U<)1F@H4LiA6 z5u^MQCMR}~?%GUy_fy|lK5=1jV>zWaf#&V|#F`Zh89U4vWdf63qNFc`?{``4@%oED z38$t4J!K}cFJO*_#|kVVlvf)&~^kKZB$URH`;*nQeY76@)*o!4+1neF2Dn!#qoG-_b=rSgFO+<3g61!NRP-M z{uzX_kPTfhi_;pjp#y#{J+txwG3FCF3tFtnx|f7#Hqcl|3$6E3M=9+5sIc~i`tN=3 z$i(}m;wN(+bhLVE{}`I}cqYsZ3W4w*Q4$g)h`NVVyg)(@chij&=?#?EGy%+-L7(;j zR}jJx_@in44!#xYF1UuPdV8F14V+hf(3hA`lj~u@EZ$(?@kF*clHy-4``{C+Mn75| zU0o-+KKSM!YeBfT;_w`qw3??mDny6;kc?O4U(j|N6;U3cQL+^F9rPw;hdgTT^*T!J zaYEEFh!4<{?h)Z}&I=6e8S*mLlI~$aaAienipcBFL@hi~SNo){D=dBUenmv!uv2M_7qAG;D7WXB(f=AzKx=nT4RCp?iy zZtw1}P&qU~X9j(VmF z7Qa+@=ENVEG+n%SQc2D*#SL0Di{NEEhrrzOn1I57Q3r#gV_r!$2c(FrEn~3{_Gq3E zWt(Uu)bfI=+Q9N&dr1P1M}cgGg=zs04>G$KeKscCF0rIL?mgCFet6a>hl>2jh%+Uk z|WT5e)H46OMF#uO6xP-fPH#j=KG5p(}yhMZ6DI2Nd@&diIBU4;Q-tOm>X};Ux7G^ z6j@Z6QoA(t)wh=i;puFE=fINpJ2R^2t7^%=PDA$)l>b1&IU9&af z-{uWVX#GB0b~+Nk%)2KS)4jY4*I?uyd)UTDCWQP;A*lVI$DN4c9-d_zx&y&vS;cev z-P(}H4`pSt`gLd{8SiW-_Nhz@b=}Rs5f{>wN zy$mLXjQZGkca}Z70UL7!rZBB^}0%(Se%bTw~K~D)P#`1H7ha-&K4w)}tTd+#7q4LrejOnrJ6E zJUd;i_{d6}!Yhr>!J(sGk;~uvB<@ZFmmgEQqN)^_^HW3?y$U~(If8cfGZOLw_kQZq zJuTx#{@PAGI|av|IaaHqQ%klpZTSPAN;9Q6{WyM#j1Ed-sQzrMZzD!oxKP?&m5)I$ zLQ>c^n2SofC#Xu84-uFV*Q7RW`OAeS;?O3&Sp=6wLJ3)EZrNh7`V@0{*`fq+Q5@Im zNB4WuVb_}`0XQ*rZ+Sf{kH0MZpFH(7QmwHr(>V|ivT>V}(HL*>nRSiCi7Av4_Rt7K zyi9nHHPOl>_Fc*~zLMeIIZK*XCwM0hzX4Eko+vUNmxIq|5<_eGyj@F)hUXY5hKRjG z>O`NJtE&u(mzf|W-L&p*jchxQMN#|6$-(Zf*s;TyJzf8JvR-ixn2$faedBU7ok*Vm zoOWr#v zl_z38GflmCcliHtTQ07mP#{BRG4dK9^+MwRrHw##rBbTbiVd3M7`d|ag58c>)ZFg^r{e18LDk-)I$PAfn4)*BH?xXE`b@2N z>nEstMRdzXYrW#m*>27GOz~b*$%|YLwBEc_P+DKG6aVSiZs3{Js-eNRJpSI%2RVa! z3%n(DjKrg(U+k{@gCo*>Uz$Rj?Cbm~S6j=OxOaMv@?LvUl=erk)EVfn{`8<_cE%zf zDw5ANok4YZ$Lj=&zN~7ZJMKza9T_aP=2Au5CuMDn5_fT|8hlw^k8Uv%t!k1>>644k z5PbG_Ye(I?V#-OqP3|M__JKk1Zda`+J4iDo39_f>C0GG)WnL0KKkh{$9cLAZG&M>V z&sA^4#pWj7_R?R!BS14UvEyl^$Kb*u0J@_r)O-m+mIxo@9(X)%s#2COi7`d5jQaY{ z$C5K=@AihMxi~#2u#}H(ZO;G%yB+~4D^5z=6e%yQHb_&VqB)1_N0cjv(F&e0#M?!_ z)62K=a8}g6>X{O*5p4%YdG_ahd)bDdhf{s56{7`+TnEdWn3Ab#2(BKUWOv)gx94f93?66jZ6}U)vJR#;7s`+Pa3T*b zfS8mOIEM8#8_had8Xli0{91eD|HHYs5^Y2)M+1`q$Juopk!0mV%rCZ@@zFe&XAXth4;!Uw9*8!sNi)6c( z5l+3FVATRz1$De*|`rA{%OI~(p7SPH<7jSOnC*#B@cf+GJ?jfy10C%wBJvWRQ5f&VnkvZ$1^*}9q05YK9xb@2NWa*Rg zhC?2!uRfb&5|^wF@G-WMv?CoweXo>e(4GYYL?30hmlWfbM0fmgYb9S5F$xZ;|GBqb`Qrw+0qjqT zL~`n)vc<>aBb(bt7-pl65@-GICf#-{MO1R{m$!CB+NdI!EL>lkib9cc9*JnbbPTOD z^zw~>xZ~E?sLGUG5Su1;ZPOfe7i>;hMY+{z(-oD~C5!6g9JXOXkjbdiCpY1-S&k=* z0*ZM$#N9U34CU|}sHP>g3PvB&cA=|hYB4{=i?vpAQl_BC)5L8jY?rHX2;J00lj&}% z3UHNThVGD*5YTxV|AQ0Y@Q{XuL!L49qW0s&W?}<7h0$6T??kJnQ1@^QSnoxH*5&k(; zH8HnwG`0Dzw0vNckfhuAc#FUtZ2AS>V&^7g%KMHEo`;NfS7}c-Xn&Datl*G%Ss&Yp zC|pehw-&(pch^7VMmNOOC$1#xm1J}+T*p;e9(=11Gd!B^1yQfAI=%){^p@k68&0>< zlZ$@YE{(UU^0?d+YMEi@5GB%9vwNiP=NuQMRZCM!*#e+ew_aT}{b zzpcsCddtL2i>o-SNqm9|zG_t{^PVXJ%-R;C=1@-?FKedn`!Ah}MEv?jn-mIMYrEk%-$#ion=Tx2Po*Q;K zk4gjSx(TNvlJsye$@!Kd}-6FhT6Es7-v%_CKnC(Cw4l|s`@aZf5XVPQwrqX!k%(!`*DjjNu&jt`o=;037-yRr1Z*N#^ z9SXZqv;WxQn!j^DbmQj!$*HV6UM#EDxxj#w_z^01f9qJK$E@zFi=>@F@F_&T zKd0_NCgC~n>Im56onsB2LOABJ`p}A6!8_)=m1`F*x^T0Ei@^6c-e#$=jI^&6)1Ik* zjDo^xhS=NDD{{*LzRmL|TMMJbnwBpdA`C!S$0ZrDEuX6ZT2FVor{-*~w0$}M)^(xy z`sLdz)&{7;{59q2FG=MzeHgiJBWdzX-!`r3*4@PvEF2jpU{mvO*Dvl;okw){&iQtT zhoVDO%Vl5rX9d#3Z-lzxPERU?3nH^GnmDK+n%T0>sj+Xm0Q^LfP}_o z-+i{=ob3^q81aaTCkjn#+@iZjb6CqdIWH_uu@v$%>6MnIA%9qVe@p!()1F(w=$GZT zd3#?{6f!tQs^HKqWN9|GCMn$V*z$-&6X(?e9V=LgLmxAT1jk~>&pu8qCkf5i57c@! zQ}GX&xH8lcBf*u!$0+Qc&9mA1xOza!9C*1V*`NNi-g!mxmN)C8p=*6t4ySt#m`fe9 z%*yQ$(cglTs-_+U)>m~5`*h!Qc$34pa^dKD5P&!f9@}UBw%>#BlA~GgCz2WR!Ylc) zUv;!&ciPFt_wXbnO!WOTu&*yLz^}(Q4g2U!mySX?uJ>B`4`*iTwZ9!0jMkSQwY{{| zan!faP>szgSj3TEP*PV#4}8J!*eSIncNp${%A%)myeNNOC5gU#qt#X8n$;D0=G-(} zl^%QnYKUKpvZ&W6Kv^h>>5F{X1IL6LFO*;>*QX^jADimF(V{b^29VD^Xr6!{R$X@f z%ktw~D(dlrsNN%K9;aEkd{I^tz{~}wyFF8KC1JT{v@x5E8hWs|9#kuM>Av*{d$#3q zX08x$&T}dA^woM6_E#0Y74RBIe@DnNJeXi_Pz<2`$fK2A_G6J?zr{%$QawODc-K=L(L|3Ym0q{}G^x^s&&|Io9cGtSRQ+wq0D_nCsb)&SdLa!hdjs zQ~T-F#iup?u7F*0SyH_0gGB7x5A+zR`>&vI^X-knwkJXrIfW_gFa3FHW6O7 zIhys_+P9F2_QN6Z5^H^rutbU({)d+}*^})RD;<(l38QOS$8|ArG-I=}mw{Sv_`lln zAvd#(9v4qRFXy@wl&nx^`MRzle2*iE^7CIaE3D7QTP@m%h4MfAfPgsrp48*@XvEOt zTV=KUe9DiF@AhzU{{$U#p~JT-0v7+_y6oG!}B&O>+5Jmx)#b_E|j| zYko)SduF>bS?Qn6QSz6Uc^eYO!c3vz-Z>ARd#^`Z7jo#WXhaIc=6ptrKBL{s<`<7| zYbnDJ&+fDs)Cp@rwvt}opZByBgW}ZZi{!(()#*IisblS8Pww#aN7l!3f;@*C78Y5T zi_z$oeTXg*J%J>i7rC??3aUp|oYDJbA>d7~A-ZW+FWOdZjIWC%@&t(yH=xMMl`(5_ zT5>)Jr*zAZSav}_f8+D_N-S{%tJ`^6Q-Px=iPOJ^Yue{KO&mVx6V;0foT|Lx65vwP z!PmWZRM)$Nn&*L8%GElmk0bFh?wKLQ-`aEe5uu*vjOo!a>u$F1oo~CGMYr%i_iW*B zcQe{b$v=<& zXCrzQe;G_=4WPT_+M`&FLqTG{|uWW@Y7Z2{2%!ey~3fKEdw8@6wo3#8Zi-hFs zVnBKm*X)qgK67D6`-nsd1&7l<%6OR=Ux6%>@P&n5zbVjiNWMV>44x@<5Ly?9o=!e7 z>fleLp4oU%%o{s-CX`Zm?W^`FG8~Dj-=z$Y8FHl+e~mKMraH}q2->52QPsR# zaGVe<__sfnNsPMCZ=oCyDgK&Q9M>eRUKl-l0S;u@E8K7w>#EW{WdG(+A9<_qX9SLY zeO{jZzyg5Qt?4xN;xBA?z$s!vu_zZlEVlX5Z7XCPZ58|e)&H3 zMTW=s+ggG@yWFtEUJ3M7m%o|^%Q<1Z1t&u@p-U##7>$4I!fO{{2eJa*^0fhf2X^iXs(#jX$4g3911q^hBmtM0$|rUu97$$nJ7A zJJ;7SQ>abP;U=nVb=%EBFFrA^V7DT&%{-zBANUYQ?sxRi=RIlfMjj@&n~IOu04Gwq zY;lLvnr|LXBqg64id#j%9$66xa+W2l)x*$tyq-hxV<2W#?NZC{090Fvjy!V^+Sxn}ZD88e5P%EWsRHBL94%DRl*6Qn4oy|drd-zE}LC%<$) z*DULGms08$U3-y}XIO=>$G$iOc2eG_P471b!!M&ssTY5X#;cU3{j7U`&u8@3witg5 z0}bt@e@fO+XDxmjS0X&6gd?K`+hLiw$-(0B3{*@IsRX-WJLhG6=BH`fK}v zl2yM#dbh(=6+vZuHSEq6rGw^jv!}y_wO^hQ{N5;{9k4i35X194uVAD$QC&_vM2P-4 z!vOo1fV<eAM`=I=D;3cU0uoo<0| z7@kxR@G>#WY_ZNa9LJRy;{a=aD7S;Ggs^yyKx{vSkUMFquK~gvmV?CsIg?KOZfto( z(G~ZTk0^|0;xHPqeQ(HPiE0wtkq_$bD*bYO9EaQXK3otlo(4|G5rvl$J{l^^l~W-T zW=Ag>1=LKKA2bbR5b3g%nU$o}$2Qb@!9g3y=VdJRCvJsg);JPSZYb z_$UZrjyH;B)|{&2_%$dubxz2v(sW2FZa`bM|HDAAd+=iMn17N!EQ2a6V;0xsLP}|5 zt(!5|G=QvQ?-$}NxR$NU6}7!%ZV=?753E*C5hBSsDIrlwThgYIp1OBoDP~swn@=>^ zD(pG>Lv46E>|!4DC2`t0Ns=I`(6DG|4=T=6E%2FH zn#a#blW_E8}JNPK-;P4f{8yT@0UU`tOAb_PimBtX8F8`7R|e zgw@n6`BfpcyHK{r=7sowH668YIU^G5P$|;eDLnMV_l_X9Z8(2auz7M)K|9;hd{KJ}+g7yrw!d#Xt7)p~WgxHCIYg=t&H1@!Ar zqgqyTkO^Xv`zizZ!pLKHxrrY@Nxd(x$H|(`wGaGApR4 z9h1T;cCQ>uL0}=}gm+S|Npntx>7xO-HHfc!=KI9r;Cb;|sn%c3+P~If^`T>}EKn0a zvmOq=B+rX`b-js|XeCNL68{bVo6eBEK=@Tv@*n5Ky-u(bV);yO3+WvsWp;9!qFvedR=-E?e85wky5m(&o4gEsWPl zjnthh0yi_=Qj-k@b9vv>dpubB@-r4cCj^EBm%HJ!PIPnpDu`TEO1Kf{uiZlBXF|JN zXFot(8Ik6TK{Qg{CxLX2&oyun8T`1LO7c_dYDI4h9qJxsDL!e`*lmIDt^7mxtVSQQ zSP~!cw1><)IaYqDkDZo`wSVoxQs-q}T&*V*h2&TArrAuU@PGELULoQ}WptB!))Q!j zcuL(aGuOWNKQ+{FDj)nncS0EDc@PnYPMyH!FDrm^j3rzyeWA=B-sEIcV{>`(K4c3x zGEz9690AA5VGv^|7!7XfuOFH=>Zjf%k^V@rKdn3Nw9{)>(K!I8mj|Cn{FDOI))cGe%27ueeKC7ax877QzAO`kOfJ>dZ)k1 zS0G&3#57PD#BF=C^yOyUK7ZI%GkNc@zC(Y>-Pp1dIv%6r{In3H;CXjHkpL5pJQcY_ z85?oDXnTRb&5Ztht$#fGDN?Q0c1NGmu*7_HH)tU60=};AP@Uu`$=Q+D+hSz7FZN9u z1Wk3CfL$(A%x<2UDd-j1Trq9OQcvwU;l2dZ}IYs)Chrdl1K zTW@+1yj}b}7XArBzr2-_10wmx!d;#&ojF+FytuxODc^OTZ}6a9FScSzKO$hd?mvc^ zm3O0dh?o}3X2+@yDCT!hK$?xbED za&_y7M`hR0-|LaXUU7snMC(N!@<&0MnJ zadw@wwnKf&dwNYpODgQN?W5lwI1F7I+VdS##H^7SZqHEsu3ROvo^<`UaXWkke8qcF zs$@QfoK`ct_(=7A8M95;!ijF8c)x>)?(%zhyQ(1+!^>OtW*?sf#$;@%R032h)~PrL z$_Zc{z23UE*^8^b8(EwBfT^G^VNaec(^=EK{PZjnq1UdX9P4gqxl{jzq)LQ z_X3eKLk9L3gu5qXTg-*g9*^Srkdi->=4)VhE3}L8UIL<6kjjOT9-tPs@2mt&{UqzU zayA{s;mYZJG!;WqG@To@B?WT5WMMXK^oXmCS6b^ ztIK9do32*FynixFD2Z|kxv!0nm&g9m*$ZB4O zEpViaS~v^io2_|VMMhmvp^%j&Hb^L$k|s>z&YJE^oSsU9cs=vB&+V{P@eNUv2tCYZ zG9y83#Myb^`HuY!iec~Bt(ENx2yCTXU7guaA;2f#YB~>Hd%nlDH)ZqZcQDX= zuT3d&tQmA<%lGP*ST^u6ae-!W{R#psan^jb##j?**m`nMNz&x3wp9-UZZxO5$<_xCW_tu--u0fj4Ia0?v0ddQ#14EwAIZ82*x}vEp!DC} zz5_8SJu0{^u}v63RDW0AFm7S=Rz~s<0Wx?MpaQA49XV3ek`Z)xPMXLEH(Q^pi44k` z0a2cNBKhyoUkoMCA7^$Pv;zMbWMk;TG%4Vme9x6U%a@n@BOJjYV|(hfN^_>x-oB^6B&L}RSGFs_l_$nT{hPGhNJqxef@fv{Rj zY%l4?IvSH^nEueI{G2-;>3>i1Y`lAU?zwEDSJ|1RBQ6Mc!8(jNHSc@j#*}_#d49n> zt(81WS?*bnmxOIcX(1JKkS$glx2D!_T*XC)yuWV1WIOu$9lZf`^Z5MxoYZnfyTB!< z_Ah zYo055J#$5kRyXxpro`)+tv#v2vWmj@oX^uItc)W$&_Y#?W6~A@tl}_<*kG!%-Rxv#D~;K&6qR?5yZu+$=?>ktVHrI% zRUZ%IT%0Xm?RhV^MM{PGGZLom;nVa}2LW`>)^K z5u)3Io_6T)(EQaApy}ewI(*5*(GMv#zVY&9*!z;X9z*hQzQlhf-GACoxGnBkpw{>< z3^p=sg5_GdZ(q8V>C!_qN3+XT)fnehWYc9&9NF=iEAu*J6z0EK5AIE!w|p%+#_zgn zQrcmTis{&C@m!C<{LjRqya&^!`4}ubz^&cDpsY`w;F(hCj zzJI~pBV!8av#gHH*(N-g7*fL*4sx;tp7qnAgzt%OCxQ!TLybuaJG(2yOq-Pqo7Jxx zEi|oqMr(cLj$)Rr){)z{C{g9TZO$xKbA7j55u`x_A$>c`gU=RG(gb*r(6@n^JEuc7 zgT_=@=QVPbLLV!3I0&i(?x=;E?>KdK0f+I3>zI;{wqu9-}bC4?b&z0XAd ze2{I;1E;enoY~5|GW*2CWBJ}9m;-vCIANg-|rq!Wn=*%Y&9c5 z_Vdp(id);>G&ukw^Gtd2uR>GgRoqE*`I==n$Ns@BNJ?6|s3lq8A8D6L(Rson(=sEr zkp)rl9DGROZL4JH;U6I-*n2}*a47zlLKl#;{4h+9 z()-V@0x4Yf_3tM@ck+K(Q`pg}th*-em-vtg0$8R0E5$ZI-Aeyzc4bLdw^{?yiqn%X zfQIg$pWHRvG*GQXS=O*>;SHSq z+h~;{d@MAd)|&6HY@0#uDO3Adlo=uB|7O}xJgnmOujWlqocG;Qkk#=*k9yOx|5{v- zoR1|g`vsf!=#_9Fd71C=e>JoS1S>v_JB}Cb@C3Dzhc>rrp&OVF9se3;NKA^Q1@)Bv z94Gdc9#7EfzJoc)<=Wrk9x7p+Zh@1VqE0J^PXr*oVY1fU`R~V*OnfYyxi9W`#sDn1 zpulnSf%@Mb2RYQiI4S*ZNJi|+qKdO=9-ijo`OiBtR_%YaAt$B5*Xl8Cw^;<3ZE$$`fBiJ}p+-+C7a!};NKee9;S`?43wT@8BXpL*e+?udM~Ad4 zHatDyt@R^3M36z-{v-?22Li-7`WtJf`#@5$yQuWni3)aFURE^o!EJQ-mM|5SGq2JeAU5vnu*VjOzS9 zOR0Jb2>pU-v@K&hAu4&U(4)z;tTz0Q#n798n#COLEik$eCpv+5WrtlH+6EX@{`a#} z)#&L3{fEW@o+W4bLOibWY0zo6@qa^F(257n_X<2VL06FlI?Vr7#1i4$u2Z;+J1_?7 z)OAiHjr!mIOi_?kaCL3 z*)GnA2BVRG+jSL)sjC(YEdJI`K%M=}Mi*rNt;R7eOw15zaL0P9&f={GN2)(%$PSn% zr2IMj=y(4)a%iQ1m8OYmj~*Rp{@2Blfan72nD?xj)LB}$8pL2Y-=og7?7vF5p^Awq z19rcO0SEby(HPF{u6XdQUI*>KbUu#ZY+2(j_g+Cd^LHM`jL!}9keo5tP6D#gO z_(CvgO>~Yd;O{(f1Y)eOM_|x84y~jZZr2gN^zJP%QE>c834&C@#ONhr&}xkBg;mrT z_VB+=j*2IRSKYTjXY>?~FRDS5wHS>7Lio>TI(N6b=BTD+FRoRZH-)2HMCT~}OR?n| z?gy+k@M(@*{*L{#nZJ$p2B^vBfw|!h%b@bOz-mH-g%+b5bnmalZcy`jRHeb^yl<27 z_9ng*rlIQ`|I3RUDO~90-81jh?zo(#+k5XLEZjz)8UFY2A!r*l##;CpH<%noKPX#n zjrwu^{9BvMA5ir1Xz$sfm2C}1c@kzFYX6`|i#%*~&VOgMSVc_C)URfKi=c%3n^SLvV2YZhxplnFvek8 z^a9*@R{U4X9O{^uRj|E^)#_6%V>?bmLT%V~|C`-l#DvJ=x$F}(O%+*am8KSBNOGRh z+dox}x(A$YE(`RMqZOy^vrCf(^9}@!pBVn%q!p+LktVg*AbmL%@r_iW4tSFCK{4Hz z`8#rk+kY#U=k7L_O$L#!N9htdM^8^0Zua6;n76I{w`AN4MbXPx>k@rpQ-Vds zBc9iJn6>e;LAU-IxuJof@G;~GD_ayNoCvYI@8VqQbKY>-`hU&^1VbAp!0?zX`~cc9 zQAHMU5MtFVE)H!z(M9*PQ~3O?NM}_H1$FUSv$wMn46HwF?Yun~Sp(k&U_TYm@>OJB z2O;fOSO2E!Cl@A=l2X3ri9^tYs(dH@aHalcV?UZ2zuIH5Kg#m% literal 0 HcmV?d00001 diff --git a/developer-docs/logo/light.png b/developer-docs/logo/light.png new file mode 100644 index 0000000000000000000000000000000000000000..86d75cf5fe8bd892643cb2556ee5ca10ca371066 GIT binary patch literal 171786 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 z

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..." + 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" + '401': + description: Unauthorized + content: + application/json: + schema: + $ref: '#/components/schemas/bad_request_error' + '404': + description: The given portal ID does not exist in the account + content: + application/json: + schema: + $ref: '#/components/schemas/bad_request_error' \ No newline at end of file diff --git a/swagger/paths/application/portal/update.yml b/swagger/paths/application/portal/update.yml index 5faa170cc..0679a37d0 100644 --- a/swagger/paths/application/portal/update.yml +++ b/swagger/paths/application/portal/update.yml @@ -5,6 +5,9 @@ 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: @@ -17,10 +20,66 @@ responses: content: application/json: schema: - $ref: '#/components/schemas/portal' + $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: "" + 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' diff --git a/swagger/paths/index.yml b/swagger/paths/index.yml index 59d7c06b8..379b2eef0 100644 --- a/swagger/paths/index.yml +++ b/swagger/paths/index.yml @@ -63,11 +63,6 @@ - $ref: '#/components/parameters/platform_user_id' get: $ref: './platform/users/login.yml' -/platform/api/v1/users/{id}/token: - parameters: - - $ref: '#/parameters/platform_user_id' - post: - $ref: './platform/users/token.yml' # ---------------- end of platform path -----------# @@ -605,3 +600,27 @@ description: The numeric ID of the user get: $ref: './application/reports/conversation/agent.yml' + +# Conversations Messages +/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' diff --git a/swagger/swagger.json b/swagger/swagger.json index 8ce34b4ab..943b7a3e8 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -801,78 +801,6 @@ } } }, - "/platform/api/v1/users/{id}/token": { - "parameters": [ - { - "$ref": "#/parameters/platform_user_id" - } - ], - "post": { - "tags": [ - "Users" - ], - "operationId": "post-user-token", - "summary": "Get User Access Token", - "description": "Get the access token of a user", - "security": [ - { - "platformAppApiKey": [] - } - ], - "responses": { - "200": { - "description": "Success", - "schema": { - "type": "object", - "properties": { - "access_token": { - "type": "string", - "description": "Access token of the user" - }, - "expiry": { - "type": [ - "integer", - "null" - ], - "description": "Expiry timestamp" - }, - "user": { - "type": "object", - "properties": { - "id": { - "type": "integer", - "description": "User ID" - }, - "name": { - "type": "string", - "description": "User's full name" - }, - "display_name": { - "type": "string", - "description": "User's display name" - }, - "email": { - "type": "string", - "description": "User's email address" - }, - "pubsub_token": { - "type": "string", - "description": "User's pubsub token" - } - } - } - } - } - }, - "401": { - "description": "Unauthorized" - }, - "404": { - "description": "The given user does not exist" - } - } - } - }, "/public/api/v1/inboxes/{inbox_identifier}": { "parameters": [ { @@ -2532,7 +2460,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/contact_list" + "$ref": "#/components/schemas/contacts_list_response" } } } @@ -2633,7 +2561,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/extended_contact" + "$ref": "#/components/schemas/contact_show_response" } } } @@ -2798,7 +2726,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/contact_conversations" + "$ref": "#/components/schemas/contact_conversations_response" } } } @@ -2843,7 +2771,7 @@ ], "get": { "tags": [ - "Contacts" + "Contact Labels" ], "operationId": "list-all-labels-of-a-contact", "summary": "List Labels", @@ -2888,7 +2816,7 @@ }, "post": { "tags": [ - "Contacts" + "Contact Labels" ], "operationId": "contact-add-labels", "summary": "Add Labels", @@ -2996,12 +2924,7 @@ "content": { "application/json": { "schema": { - "type": "object", - "properties": { - "payload": { - "$ref": "#/components/schemas/contact_list" - } - } + "$ref": "#/components/schemas/contacts_list_response" } } } @@ -3117,7 +3040,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/contact_list" + "$ref": "#/components/schemas/contacts_list_response" } } } @@ -3253,7 +3176,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/contactable_inboxes" + "$ref": "#/components/schemas/contactable_inboxes_response" } } } @@ -3313,11 +3236,7 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of all automation rules", - "items": { - "$ref": "#/components/schemas/automation_rule" - } + "$ref": "#/components/schemas/automation_rule" } } } @@ -3425,6 +3344,43 @@ "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 + } } } } @@ -3641,11 +3597,56 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of all portals", - "items": { - "$ref": "#/components/schemas/portal" - } + "$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" + } + } + ] } } } @@ -3684,6 +3685,14 @@ "userApiKey": [] } ], + "parameters": [ + { + "$ref": "#/components/parameters/account_id" + }, + { + "$ref": "#/components/parameters/portal_id" + } + ], "requestBody": { "required": true, "content": { @@ -3700,7 +3709,66 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/portal" + "$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": "", + "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" + } + } } } } @@ -3714,6 +3782,16 @@ } } } + }, + "404": { + "description": "Portal not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/bad_request_error" + } + } + } } } } @@ -4616,7 +4694,7 @@ ], "post": { "tags": [ - "Conversations" + "Conversation Assignments" ], "operationId": "assign-a-conversation", "summary": "Assign Conversation", @@ -4835,10 +4913,15 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of inboxes", - "items": { - "$ref": "#/components/schemas/inbox" + "type": "object", + "properties": { + "payload": { + "type": "array", + "description": "Array of inboxes", + "items": { + "$ref": "#/components/schemas/inbox" + } + } } } } @@ -5228,10 +5311,15 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of all active agents", - "items": { - "$ref": "#/components/schemas/agent" + "type": "object", + "properties": { + "payload": { + "type": "array", + "description": "Array of all active agents", + "items": { + "$ref": "#/components/schemas/agent" + } + } } } } @@ -5315,10 +5403,15 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of all active agents", - "items": { - "$ref": "#/components/schemas/agent" + "type": "object", + "properties": { + "payload": { + "type": "array", + "description": "Array of all active agents", + "items": { + "$ref": "#/components/schemas/agent" + } + } } } } @@ -5405,10 +5498,15 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of all active agents", - "items": { - "$ref": "#/components/schemas/agent" + "type": "object", + "properties": { + "payload": { + "type": "array", + "description": "Array of all active agents", + "items": { + "$ref": "#/components/schemas/agent" + } + } } } } @@ -5549,17 +5647,43 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of messages", - "items": { - "allOf": [ - { - "$ref": "#/components/schemas/generic_id" - }, - { + "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" } - ] + } } } } @@ -5728,10 +5852,15 @@ "content": { "application/json": { "schema": { - "type": "array", - "description": "Array of Integration apps", - "items": { - "$ref": "#/components/schemas/integrations_app" + "type": "object", + "properties": { + "payload": { + "type": "array", + "description": "Array of Integration apps", + "items": { + "$ref": "#/components/schemas/integrations_app" + } + } } } } @@ -7255,6 +7384,42 @@ } } } + }, + "/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": { @@ -7303,17 +7468,25 @@ "type": "integer", "description": "ID of the canned response" }, - "content": { - "type": "string", - "description": "Message content for canned response" + "account_id": { + "type": "integer", + "description": "Account Id" }, "short_code": { "type": "string", "description": "Short Code for quick access of the canned response" }, - "account_id": { - "type": "integer", - "description": "Account Id" + "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" } } }, @@ -7340,36 +7513,72 @@ "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" }, - "default_value": { - "type": "string", - "description": "Attribute default value" - }, "attribute_model": { "type": "string", "description": "Attribute type(conversation_attribute/contact_attribute)" }, - "account_id": { - "type": "integer", - "description": "Account Id" + "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": { - "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" + "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", @@ -7381,15 +7590,64 @@ "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" }, - "active": { - "type": "boolean", - "description": "Enable/disable automation rule" + "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": [ @@ -7399,76 +7657,181 @@ } } }, - "conditions": { - "type": "array", - "description": "Array of conditions on which conversation/message filter would work", - "items": { - "type": "object", - "example": { - "attribute_key": "content", - "filter_operator": "contains", - "values": [ - "help" - ], - "query_operator": "nil" - } - } - }, - "account_id": { + "created_on": { "type": "integer", - "description": "Account Id" + "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" + "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" + "type": "boolean", + "description": "Whether the portal is archived" }, "color": { - "type": "string" + "type": "string", + "description": "The color code for the portal" }, "config": { - "type": "object", - "description": "Save information about locales, allowed_locales and default portal/help-center locale" + "$ref": "#/components/schemas/portal_config" }, "custom_domain": { - "type": "string" + "type": "string", + "description": "Custom domain for the portal" }, "header_text": { "type": "string", - "description": "The text content." + "description": "The header text for the portal" }, "homepage_link": { - "type": "string" + "type": "string", + "description": "Homepage link for the portal" }, "name": { - "type": "string" + "type": "string", + "description": "Name of the portal" }, "slug": { - "type": "string" + "type": "string", + "description": "URL slug for the portal" }, "page_title": { - "type": "string" + "type": "string", + "description": "Page title for the portal" }, "account_id": { - "type": "integer" + "type": "integer", + "description": "ID of the account the portal belongs to" }, - "categories": { - "type": "array", - "items": { - "$ref": "#/components/schemas/category" - } + "inbox": { + "$ref": "#/components/schemas/inbox" }, - "articles": { - "type": "array", - "items": { - "$ref": "#/components/schemas/article" - } + "logo": { + "$ref": "#/components/schemas/portal_logo" + }, + "meta": { + "$ref": "#/components/schemas/portal_meta" } } }, @@ -7568,44 +7931,66 @@ "type": "object", "properties": { "payload": { - "type": "object", - "properties": { - "contact": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email address of the contact" - }, - "name": { - "type": "string", - "description": "The name of the contact" - }, - "phone_number": { - "type": "string", - "description": "Phone number of the contact" - }, - "thumbnail": { - "type": "string", - "description": "Avatar URL of the contact" - }, - "additional_attributes": { - "type": "object", - "description": "The object containing additional attributes related to the contact" - }, - "custom_attributes": { - "type": "object", - "description": "The object to save custom attributes for contact, accepts custom attributes key and value", - "example": { - "attribute_key": "attribute_value", - "signed_up_at": "dd/mm/yyyy" - } - }, - "contact_inboxes": { - "type": "array", - "items": { - "$ref": "#/components/schemas/contact_inboxes" - } + "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" } } } @@ -7630,10 +8015,53 @@ "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": [ @@ -7643,30 +8071,54 @@ ], "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" }, - "contact_last_seen_at": { - "type": "string" - }, - "agent_last_seen_at": { - "type": "string" + "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" }, - "additional_attributes": { - "type": "object", - "description": "The object containing additional attributes related to the conversation" + "last_non_activity_message": { + "$ref": "#/components/schemas/message" }, - "custom_attributes": { + "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 object to save custom attributes for conversation, accepts custom attributes key and value", - "example": { - "attribute_key": "attribute_value", - "priority_conversation_number": 3 + "description": "The applied SLA" + }, + "sla_events": { + "type": "array", + "items": { + "type": "object", + "description": "SLA event objects" } } } @@ -7674,10 +8126,61 @@ "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": [ @@ -7692,23 +8195,38 @@ "type": "object", "description": "The content attributes for each content_type" }, - "message_type": { + "sender_type": { "type": "string", "enum": [ - "incoming", - "outgoing", - "activity", - "template" + "contact", + "agent", + "agent_bot" ], - "description": "The type of the message" + "description": "The type of the sender" }, - "created_at": { - "type": "integer", - "description": "The time at which message was created" + "sender_id": { + "type": "number", + "description": "The ID of the sender" }, - "private": { - "type": "boolean", - "description": "The flags which shows whether the message is private or not" + "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", @@ -7717,10 +8235,6 @@ "sender": { "type": "object", "description": "User/Agent/AgentBot object" - }, - "conversation_id": { - "type": "number", - "description": "ID of the conversation" } } }, @@ -7730,24 +8244,47 @@ "id": { "type": "number" }, - "uid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "available_name": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "email": { + "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": [ @@ -7755,8 +8292,15 @@ "administrator" ] }, - "confirmed": { - "type": "boolean" + "ui_settings": { + "type": "object" + }, + "uid": { + "type": "string" + }, + "type": { + "type": "string", + "nullable": true }, "custom_attributes": { "type": "object", @@ -7765,7 +8309,52 @@ "accounts": { "type": "array", "items": { - "$ref": "#/components/schemas/account" + "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 + } + } } } } @@ -7776,34 +8365,9 @@ "id": { "type": "integer" }, - "uid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "available_name": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "email": { - "type": "string" - }, "account_id": { "type": "integer" }, - "role": { - "type": "string", - "enum": [ - "agent", - "administrator" - ] - }, - "confirmed": { - "type": "boolean" - }, "availability_status": { "type": "string", "enum": [ @@ -7817,9 +8381,37 @@ "type": "boolean", "description": "Whether the availability status of agent is configured to go offline automatically when away." }, - "custom_attributes": { - "type": "object", - "description": "Available for users who are created through platform APIs and has custom attributes associated." + "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" } } }, @@ -7877,6 +8469,148 @@ "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" } } }, @@ -7895,13 +8629,33 @@ "type": "string", "description": "The description about the agent bot" }, - "account_id": { - "type": "number", - "description": "Account ID if it's an account specific 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" } } }, @@ -7913,7 +8667,7 @@ "description": "Contact Inbox Source Id" }, "inbox": { - "$ref": "#/components/schemas/inbox" + "$ref": "#/components/schemas/inbox_contact" } } }, @@ -9645,9 +10399,6 @@ "description": "array of contacts", "items": { "allOf": [ - { - "$ref": "#/components/schemas/generic_id" - }, { "$ref": "#/components/schemas/contact" } @@ -9671,6 +10422,18 @@ "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" @@ -9679,18 +10442,46 @@ "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" }, - "channel": { - "type": "string", - "description": "Channel Type" + "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" } } } @@ -9762,6 +10553,18 @@ "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" @@ -9770,18 +10573,46 @@ "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" }, - "channel": { - "type": "string", - "description": "Channel Type" + "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" } } } @@ -9809,6 +10640,18 @@ "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" @@ -9817,18 +10660,46 @@ "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" }, - "channel": { - "type": "string", - "description": "Channel Type" + "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" } } } @@ -9950,6 +10821,656 @@ } } } + }, + "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" + } + } } }, "parameters": { @@ -10172,6 +11693,116 @@ } } }, + "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", @@ -10189,6 +11820,9 @@ "Agents", "Canned Responses", "Contacts", + "Contact Labels", + "Conversation Assignments", + "Conversation Labels", "Conversations", "Custom Attributes", "Custom Filters", diff --git a/swagger/tag_groups/application.yml b/swagger/tag_groups/application.yml new file mode 100644 index 000000000..85d96c5b7 --- /dev/null +++ b/swagger/tag_groups/application.yml @@ -0,0 +1,65 @@ +openapi: '3.0.4' +info: + title: Chatwoot - Application API + description: Application API endpoints for Chatwoot + 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/ +tags: + - name: Account AgentBots + description: Manage agent bots within accounts + - name: Agents + description: Manage agents + - name: Canned Responses + description: Manage canned responses + - name: Contacts + description: Manage contacts + - name: Contact Labels + description: Manage contact labels + - name: Conversation Assignments + description: Manage conversation assignments + - name: Conversation Labels + description: Manage conversation labels + - name: Conversations + description: Manage conversations + - name: Custom Attributes + description: Manage custom attributes + - name: Custom Filters + description: Manage custom filters + - name: Inboxes + description: Manage inboxes + - name: Integrations + description: Manage integrations + - name: Messages + description: Manage messages + - name: Profile + description: Manage user profile + - name: Reports + description: Generate reports + - name: Teams + description: Manage teams + - name: Webhooks + description: Manage webhooks + - name: Automation Rule + description: Manage automation rules + - name: Help Center + description: Manage help center +paths: + $ref: ../paths/index.yml +components: + schemas: + $ref: ../definitions/index.yml + parameters: + $ref: ../parameters/index.yml + 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. \ No newline at end of file diff --git a/swagger/tag_groups/application_swagger.json b/swagger/tag_groups/application_swagger.json new file mode 100644 index 000000000..33e75183f --- /dev/null +++ b/swagger/tag_groups/application_swagger.json @@ -0,0 +1,10184 @@ +{ + "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": { + "/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}/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": "", + "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": "Toggles the status of the conversation between open and resolved", + "security": [ + { + "userApiKey": [] + }, + { + "agentBotApiKey": [] + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "status" + ], + "properties": { + "status": { + "type": "string", + "enum": [ + "open", + "resolved", + "pending" + ], + "description": "The status of the conversation", + "example": "open" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "Success", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/conversation_status_toggle" + } + } + } + }, + "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}/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", + "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/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" + } + } + } + } + } + } + } + }, + "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" + }, + "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_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" + } + } + }, + "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_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
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": "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" + } + } + } + } + } + }, + "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" + }, + "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", + "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" + } + } + } + }, + "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.

Website: Chatwoot generated string which can be obtained from webhook events.
Phone Channels(Twilio): Phone number in e164 format
Email Channels: Contact Email address
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": "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" + } + ], + "x-tagGroups": [ + { + "name": "Platform", + "tags": [ + "Accounts", + "Account Users", + "AgentBots", + "Users" + ] + }, + { + "name": "Application", + "tags": [ + "Account AgentBots", + "Agents", + "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" + ] + } + ] +} \ No newline at end of file diff --git a/swagger/tag_groups/client.yml b/swagger/tag_groups/client.yml new file mode 100644 index 000000000..fdd177b97 --- /dev/null +++ b/swagger/tag_groups/client.yml @@ -0,0 +1,33 @@ +openapi: '3.0.4' +info: + title: Chatwoot - Client API + description: Client API endpoints for Chatwoot + 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/ +tags: + - name: Contacts API + description: APIs for managing contacts from client applications + - name: Conversations API + description: APIs for managing conversations from client applications + - name: Messages API + description: APIs for managing messages from client applications +paths: + $ref: ../paths/index.yml +components: + schemas: + $ref: ../definitions/index.yml + parameters: + $ref: ../parameters/index.yml + 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. \ No newline at end of file diff --git a/swagger/tag_groups/client_swagger.json b/swagger/tag_groups/client_swagger.json new file mode 100644 index 000000000..6d471da43 --- /dev/null +++ b/swagger/tag_groups/client_swagger.json @@ -0,0 +1,4963 @@ +{ + "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": { + "/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" + } + } + } + } + } + } + } + }, + "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" + }, + "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_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" + } + } + }, + "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_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
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": "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" + } + } + } + } + } + }, + "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" + }, + "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", + "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" + } + } + } + }, + "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.

Website: Chatwoot generated string which can be obtained from webhook events.
Phone Channels(Twilio): Phone number in e164 format
Email Channels: Contact Email address
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": "Contacts API", + "description": "Public contact APIs" + }, + { + "name": "Conversations API", + "description": "Public conversation APIs" + }, + { + "name": "Messages API", + "description": "Public message APIs" + } + ], + "x-tagGroups": [ + { + "name": "Platform", + "tags": [ + "Accounts", + "Account Users", + "AgentBots", + "Users" + ] + }, + { + "name": "Application", + "tags": [ + "Account AgentBots", + "Agents", + "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" + ] + } + ] +} \ No newline at end of file diff --git a/swagger/tag_groups/other_swagger.json b/swagger/tag_groups/other_swagger.json new file mode 100644 index 000000000..fc61e8721 --- /dev/null +++ b/swagger/tag_groups/other_swagger.json @@ -0,0 +1,4370 @@ +{ + "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": { + "/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" + } + } + } + } + }, + "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" + }, + "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_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" + } + } + }, + "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_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
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": "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" + } + } + } + } + } + }, + "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" + }, + "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", + "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" + } + } + } + }, + "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.

Website: Chatwoot generated string which can be obtained from webhook events.
Phone Channels(Twilio): Phone number in e164 format
Email Channels: Contact Email address
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": "CSAT Survey Page", + "description": "Customer satisfaction survey" + } + ], + "x-tagGroups": [ + { + "name": "Platform", + "tags": [ + "Accounts", + "Account Users", + "AgentBots", + "Users" + ] + }, + { + "name": "Application", + "tags": [ + "Account AgentBots", + "Agents", + "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" + ] + } + ] +} \ No newline at end of file diff --git a/swagger/tag_groups/others.yml b/swagger/tag_groups/others.yml new file mode 100644 index 000000000..08219959c --- /dev/null +++ b/swagger/tag_groups/others.yml @@ -0,0 +1,29 @@ +openapi: '3.0.4' +info: + title: Chatwoot - Other APIs + description: Other API endpoints for Chatwoot + 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/ +tags: + - name: CSAT Survey Page + description: APIs for CSAT survey functionality +paths: + $ref: ../paths/index.yml +components: + schemas: + $ref: ../definitions/index.yml + parameters: + $ref: ../parameters/index.yml + 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. \ No newline at end of file diff --git a/swagger/tag_groups/platform.yml b/swagger/tag_groups/platform.yml new file mode 100644 index 000000000..139dd741e --- /dev/null +++ b/swagger/tag_groups/platform.yml @@ -0,0 +1,40 @@ +openapi: '3.0.4' +info: + title: Chatwoot - Platform API + description: Platform API endpoints for Chatwoot + 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/ +tags: + - name: Accounts + description: Platform account management + - name: Account Users + description: Manage users within platform accounts + - name: AgentBots + description: Manage agent bots on the platform + - name: Users + description: Platform user management +paths: + $ref: ../paths/index.yml +components: + schemas: + $ref: ../definitions/index.yml + parameters: + $ref: ../parameters/index.yml + 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. + 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. \ No newline at end of file diff --git a/swagger/tag_groups/platform_swagger.json b/swagger/tag_groups/platform_swagger.json new file mode 100644 index 000000000..18ec796a0 --- /dev/null +++ b/swagger/tag_groups/platform_swagger.json @@ -0,0 +1,5143 @@ +{ + "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" + } + } + } + } + } + } + } + }, + "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" + }, + "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_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" + } + } + }, + "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_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
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": "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" + } + } + } + } + } + }, + "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" + }, + "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", + "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" + } + } + } + }, + "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.

Website: Chatwoot generated string which can be obtained from webhook events.
Phone Channels(Twilio): Phone number in e164 format
Email Channels: Contact Email address
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" + } + ], + "x-tagGroups": [ + { + "name": "Platform", + "tags": [ + "Accounts", + "Account Users", + "AgentBots", + "Users" + ] + }, + { + "name": "Application", + "tags": [ + "Account AgentBots", + "Agents", + "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" + ] + } + ] +} \ No newline at end of file