@inboxapp/n8n-nodes-inboxapp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +19 -0
- package/README.md +147 -0
- package/dist/credentials/InboxAppApi.credentials.d.ts +10 -0
- package/dist/credentials/InboxAppApi.credentials.js +38 -0
- package/dist/credentials/InboxAppApi.credentials.js.map +1 -0
- package/dist/credentials/icons/inboxapp.png +0 -0
- package/dist/credentials/icons/inboxapp.svg +1 -0
- package/dist/nodes/InboxApp/InboxApp.node.d.ts +4 -0
- package/dist/nodes/InboxApp/InboxApp.node.js +42 -0
- package/dist/nodes/InboxApp/InboxApp.node.js.map +1 -0
- package/dist/nodes/InboxApp/InboxApp.node.json +23 -0
- package/dist/nodes/InboxApp/inboxapp.png +0 -0
- package/dist/nodes/InboxApp/inboxapp.svg +1 -0
- package/dist/nodes/InboxApp/openapi.json +1 -0
- package/dist/nodes/InboxApp/properties.json +3119 -0
- package/dist/package.json +51 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +51 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright 2022 n8n
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
4
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
5
|
+
the Software without restriction, including without limitation the rights to
|
|
6
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
7
|
+
of the Software, and to permit persons to whom the Software is furnished to do
|
|
8
|
+
so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# n8n-nodes-inboxapp
|
|
2
|
+
|
|
3
|
+
[n8n](https://n8n.io/) community node for [InboxApp](https://inboxapp.com) — the Social Selling CRM for X (Twitter).
|
|
4
|
+
|
|
5
|
+
Automate your DM outreach, manage conversations, and build sales pipelines directly from n8n workflows.
|
|
6
|
+
|
|
7
|
+
 
|
|
8
|
+
|
|
9
|
+
## Platform Support
|
|
10
|
+
|
|
11
|
+
| Platform | Status |
|
|
12
|
+
|----------|--------|
|
|
13
|
+
| **X (Twitter)** | ✅ Fully supported |
|
|
14
|
+
| **Instagram** | 🔜 Coming soon |
|
|
15
|
+
| **LinkedIn** | 🔜 Coming soon |
|
|
16
|
+
|
|
17
|
+
## What You Can Do
|
|
18
|
+
|
|
19
|
+
### 💬 Send & Manage DMs
|
|
20
|
+
- **Send direct messages** to any X user through your connected accounts
|
|
21
|
+
- **Reply to conversations** — continue existing DM threads
|
|
22
|
+
- **List conversations** — pull all your DM threads with filtering and pagination
|
|
23
|
+
- **Look up threads** by user ID or username
|
|
24
|
+
- **Delete messages** you've sent
|
|
25
|
+
- **Add reactions** to messages
|
|
26
|
+
|
|
27
|
+
### 👥 Manage Prospects (Leads)
|
|
28
|
+
- **Look up prospects** by platform ID
|
|
29
|
+
- **Update prospect context** — add notes and custom data to profiles
|
|
30
|
+
- **Access full profile data** — bio, location, follower counts, verification status
|
|
31
|
+
|
|
32
|
+
### 🏷️ Organize with Tags & Statuses
|
|
33
|
+
- **Create, update, and delete tags** to label your prospects
|
|
34
|
+
- **Manage deal statuses** — build your own sales pipeline stages
|
|
35
|
+
- **Assign colors** to tags and statuses for visual organization
|
|
36
|
+
|
|
37
|
+
### 👤 Team & Accounts
|
|
38
|
+
- **View team info** and members
|
|
39
|
+
- **List connected X accounts** linked to your workspace
|
|
40
|
+
- **Track events** across your workspace
|
|
41
|
+
|
|
42
|
+
## Getting Started
|
|
43
|
+
|
|
44
|
+
### 1. Get Your API Key
|
|
45
|
+
|
|
46
|
+
1. Log in to [InboxApp](https://inboxapp.com)
|
|
47
|
+
2. Go to **Settings → API**
|
|
48
|
+
3. Generate an API key for your team
|
|
49
|
+
|
|
50
|
+
### 2. Install the Node
|
|
51
|
+
|
|
52
|
+
In your n8n instance, go to **Settings → Community Nodes** and install:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
n8n-nodes-inboxapp
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Or install manually:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
cd ~/.n8n
|
|
62
|
+
npm install n8n-nodes-inboxapp
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 3. Add Your Credentials
|
|
66
|
+
|
|
67
|
+
1. In n8n, go to **Credentials → Add Credential**
|
|
68
|
+
2. Search for **InboxApp API**
|
|
69
|
+
3. Paste your API key
|
|
70
|
+
4. Save
|
|
71
|
+
|
|
72
|
+
### 4. Build Your First Workflow
|
|
73
|
+
|
|
74
|
+
Here are some common workflows to get you started:
|
|
75
|
+
|
|
76
|
+
#### Send a DM to a New Lead
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
Trigger → InboxApp (Lookup Thread by Username) → InboxApp (Send Message)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
1. Add an **InboxApp** node → select **Threads → Lookup by Username**
|
|
83
|
+
2. Enter the X username of the person you want to DM
|
|
84
|
+
3. Add another **InboxApp** node → select **Messages → Send Message**
|
|
85
|
+
4. Use the thread ID from the previous step
|
|
86
|
+
5. Write your message and run
|
|
87
|
+
|
|
88
|
+
#### Auto-Reply to New Conversations
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Schedule Trigger → InboxApp (List Threads) → Filter (unread) → InboxApp (Send Message)
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
#### Sync Prospects to Your CRM
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
Schedule Trigger → InboxApp (List Threads) → InboxApp (Get Prospect) → HTTP Request (CRM API)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
#### Tag Prospects Based on Keywords
|
|
101
|
+
|
|
102
|
+
```
|
|
103
|
+
Schedule Trigger → InboxApp (List Threads) → IF (keyword match) → InboxApp (Update Prospect Context)
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Available Operations
|
|
107
|
+
|
|
108
|
+
| Resource | Operations |
|
|
109
|
+
|----------|-----------|
|
|
110
|
+
| **Threads** | List, Create, Get, Update, Delete, Lookup by ID, Lookup by Username |
|
|
111
|
+
| **Messages** | List, Send, Update, Delete, View Edit History, Add/Remove Reactions |
|
|
112
|
+
| **Prospects** | Get, Lookup, Update Context |
|
|
113
|
+
| **Tags** | List, Create, Get, Update, Delete |
|
|
114
|
+
| **Statuses** | List, Create, Get, Update, Delete |
|
|
115
|
+
| **Account Links** | List |
|
|
116
|
+
| **Members** | List, Get |
|
|
117
|
+
| **Team** | Get Info |
|
|
118
|
+
| **Events** | List |
|
|
119
|
+
| **Colors** | List (for tags & statuses) |
|
|
120
|
+
|
|
121
|
+
## Example: DM Outreach Workflow
|
|
122
|
+
|
|
123
|
+
A complete outreach workflow might look like:
|
|
124
|
+
|
|
125
|
+
1. **Trigger** — New row in Google Sheets (your lead list)
|
|
126
|
+
2. **InboxApp: Lookup by Username** — Find or create the DM thread
|
|
127
|
+
3. **InboxApp: Send Message** — Send your personalized outreach DM
|
|
128
|
+
4. **InboxApp: Create Tag** — Tag the prospect as "Outreach - Week 1"
|
|
129
|
+
5. **Wait** — Pause for follow-up timing
|
|
130
|
+
6. **InboxApp: Send Message** — Send follow-up if no reply
|
|
131
|
+
|
|
132
|
+
This replaces hours of manual DMing with a fully automated pipeline.
|
|
133
|
+
|
|
134
|
+
## API Docs
|
|
135
|
+
|
|
136
|
+
Full API documentation: [inboxapp.com/docs/api](https://inboxapp.com/docs/api)
|
|
137
|
+
|
|
138
|
+
## Links
|
|
139
|
+
|
|
140
|
+
- 🌐 [InboxApp](https://inboxapp.com)
|
|
141
|
+
- 📖 [API Documentation](https://inboxapp.com/docs/api)
|
|
142
|
+
- 🐛 [Report Issues](https://github.com/inboxhq/n8n-nodes-inboxapp/issues)
|
|
143
|
+
- 💬 [n8n Community](https://community.n8n.io/)
|
|
144
|
+
|
|
145
|
+
## License
|
|
146
|
+
|
|
147
|
+
[MIT](LICENSE.md)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IAuthenticateGeneric, Icon, ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class InboxAppApi implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
icon: Icon;
|
|
6
|
+
documentationUrl: string;
|
|
7
|
+
properties: INodeProperties[];
|
|
8
|
+
authenticate: IAuthenticateGeneric;
|
|
9
|
+
test: ICredentialTestRequest;
|
|
10
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InboxAppApi = void 0;
|
|
4
|
+
class InboxAppApi {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'inboxAppApi';
|
|
7
|
+
this.displayName = 'InboxApp API';
|
|
8
|
+
this.icon = 'file:icons/inboxapp.svg';
|
|
9
|
+
this.documentationUrl = 'https://docs.inboxapp.com/api-reference/introduction';
|
|
10
|
+
this.properties = [
|
|
11
|
+
{
|
|
12
|
+
displayName: 'API Key',
|
|
13
|
+
name: 'apiKey',
|
|
14
|
+
type: 'string',
|
|
15
|
+
typeOptions: { password: true },
|
|
16
|
+
default: '',
|
|
17
|
+
required: true,
|
|
18
|
+
},
|
|
19
|
+
];
|
|
20
|
+
this.authenticate = {
|
|
21
|
+
type: 'generic',
|
|
22
|
+
properties: {
|
|
23
|
+
headers: {
|
|
24
|
+
Authorization: '=Bearer {{$credentials.apiKey}}',
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
this.test = {
|
|
29
|
+
request: {
|
|
30
|
+
baseURL: 'https://inboxapp.com/api/v1',
|
|
31
|
+
url: '/team',
|
|
32
|
+
method: 'GET',
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.InboxAppApi = InboxAppApi;
|
|
38
|
+
//# sourceMappingURL=InboxAppApi.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InboxAppApi.credentials.js","sourceRoot":"","sources":["../../credentials/InboxAppApi.credentials.ts"],"names":[],"mappings":";;;AAQA,MAAa,WAAW;IAAxB;QACC,SAAI,GAAG,aAAa,CAAC;QAErB,gBAAW,GAAG,cAAc,CAAC;QAE7B,SAAI,GAAS,yBAAyB,CAAC;QAEvC,qBAAgB,GAAG,sDAAsD,CAAC;QAE1E,eAAU,GAAsB;YAC/B;gBACC,WAAW,EAAE,SAAS;gBACtB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE;gBACX,QAAQ,EAAE,IAAI;aACd;SACD,CAAC;QAEF,iBAAY,GAAyB;YACpC,IAAI,EAAE,SAAS;YACf,UAAU,EAAE;gBACX,OAAO,EAAE;oBACR,aAAa,EAAE,iCAAiC;iBAChD;aACD;SACD,CAAC;QAEF,SAAI,GAA2B;YAC9B,OAAO,EAAE;gBACR,OAAO,EAAE,6BAA6B;gBACtC,GAAG,EAAE,OAAO;gBACZ,MAAM,EAAE,KAAK;aACb;SACD,CAAC;IACH,CAAC;CAAA;AApCD,kCAoCC"}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 200 231" role="img" xmlns="http://www.w3.org/2000/svg"><title>InboxApp</title><g fill="#ffffff"><path d="M100.001-.001-.0002 57.733l100.0007 57.736 100.0006-57.735zm0 16.539 71.3527 41.196-23.8735 13.783-47.4797-27.412-47.4798 27.412-23.873-13.783zm-52.787 153.45 52.7865 30.476 52.7862-30.476v30.476l-52.7859 30.475-52.7868-30.475zM23.6076 98.622l76.3932 44.106 76.3928-44.106v30.477l-76.3931 44.106-76.3929-44.106z"></path></g></svg>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InboxApp = void 0;
|
|
7
|
+
const properties_json_1 = __importDefault(require("./properties.json"));
|
|
8
|
+
class InboxApp {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.description = {
|
|
11
|
+
displayName: 'InboxApp',
|
|
12
|
+
name: 'inboxApp',
|
|
13
|
+
icon: 'file:inboxapp.svg',
|
|
14
|
+
group: ['output'],
|
|
15
|
+
version: 1,
|
|
16
|
+
subtitle: '={{$parameter["operation"] + ": " + $parameter["resource"]}}',
|
|
17
|
+
description: 'Manage X/Twitter DM conversations, prospects, threads, and messages with InboxApp',
|
|
18
|
+
defaults: {
|
|
19
|
+
name: 'InboxApp',
|
|
20
|
+
},
|
|
21
|
+
usableAsTool: true,
|
|
22
|
+
inputs: [{ type: 'main' }],
|
|
23
|
+
outputs: [{ type: 'main' }],
|
|
24
|
+
credentials: [
|
|
25
|
+
{
|
|
26
|
+
name: 'inboxAppApi',
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
requestDefaults: {
|
|
31
|
+
headers: {
|
|
32
|
+
Accept: 'application/json',
|
|
33
|
+
'Content-Type': 'application/json',
|
|
34
|
+
},
|
|
35
|
+
baseURL: 'https://inboxapp.com/api/v1',
|
|
36
|
+
},
|
|
37
|
+
properties: properties_json_1.default,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.InboxApp = InboxApp;
|
|
42
|
+
//# sourceMappingURL=InboxApp.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InboxApp.node.js","sourceRoot":"","sources":["../../../nodes/InboxApp/InboxApp.node.ts"],"names":[],"mappings":";;;;;;AACA,wEAA2C;AAE3C,MAAa,QAAQ;IAArB;QACC,gBAAW,GAAyB;YACnC,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,mBAAmB;YACzB,KAAK,EAAE,CAAC,QAAQ,CAAC;YACjB,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,8DAA8D;YACxE,WAAW,EAAE,mFAAmF;YAChG,QAAQ,EAAE;gBACT,IAAI,EAAE,UAAU;aAChB;YACD,YAAY,EAAE,IAAI;YAClB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC1B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;YAC3B,WAAW,EAAE;gBACZ;oBACC,IAAI,EAAE,aAAa;oBACnB,QAAQ,EAAE,IAAI;iBACd;aACD;YACD,eAAe,EAAE;gBAChB,OAAO,EAAE;oBACR,MAAM,EAAE,kBAAkB;oBAC1B,cAAc,EAAE,kBAAkB;iBAClC;gBACD,OAAO,EAAE,6BAA6B;aACtC;YACD,UAAU,EAAE,yBAA0C;SACtD,CAAC;IACH,CAAC;CAAA;AA9BD,4BA8BC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "n8n-nodes-inboxapp.inboxApp",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": ["Sales", "Communication"],
|
|
6
|
+
"subcategories": {
|
|
7
|
+
"Sales": ["CRM"],
|
|
8
|
+
"Communication": ["Social Media"]
|
|
9
|
+
},
|
|
10
|
+
"alias": ["inbox", "twitter", "x", "dm", "prospect", "thread", "message"],
|
|
11
|
+
"resources": {
|
|
12
|
+
"credentialDocumentation": [
|
|
13
|
+
{
|
|
14
|
+
"url": "https://docs.inboxapp.com/api-reference/introduction"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"primaryDocumentation": [
|
|
18
|
+
{
|
|
19
|
+
"url": "https://docs.inboxapp.com/api-reference/introduction"
|
|
20
|
+
}
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg viewBox="0 0 200 231" role="img" xmlns="http://www.w3.org/2000/svg"><title>InboxApp</title><g fill="#ffffff"><path d="M100.001-.001-.0002 57.733l100.0007 57.736 100.0006-57.735zm0 16.539 71.3527 41.196-23.8735 13.783-47.4797-27.412-47.4798 27.412-23.873-13.783zm-52.787 153.45 52.7865 30.476 52.7862-30.476v30.476l-52.7859 30.475-52.7868-30.475zM23.6076 98.622l76.3932 44.106 76.3928-44.106v30.477l-76.3931 44.106-76.3929-44.106z"></path></g></svg>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{ "info": { "title": "Inbox API", "version": "1.0.0", "description": "\nThe Inbox API gives you full access to manage the following entities in your team:\n- **Threads**: DM conversations on X\n- **Account links**: X accounts connected to your team\n- **Members**: users who can access the team\n- **Prospects**: external profiles on X\n- **Tags**: labels for prospects\n- **Statuses**: pipeline statuses for prospects\n\nAs of now, access to the following is not available:\n- **Lists**: Saved collections of leads\n- **Campaigns**: Automated DM sequences\n\n## A quick note on IDs\nInbox stores two types of IDs for objects that relate to X:\n- `id` — The Inbox ID, which is the ID of the Inbox object\n- `platformId` — The original X 'platform' ID, which is the ID of the X user, conversation, etc.\n\nThroughout the API, you'll see instances where multiple IDs are present. `platformId` is always the original X ID.\n\n## Helpful X URLs\n\nYou can use platform IDs to construct direct links to X:\n\n- **User profile**: `https://x.com/i/user/{platformId}` — This is the most reliable way to link to a user since it uses their immutable ID rather than their username, which can change.\n- **User by username**: `https://x.com/{username}` — Note that usernames can change, so this link may break if the user updates their handle.\n- **Tweet/Post**: `https://x.com/anyusername/status/{tweetId}` — The username in the URL is ignored by X; only the tweet ID matters. You can use any string in place of the username and the link will still work.\n- **DM conversation**: `https://x.com/i/chat/{conversationPlatformId}` — The conversation ID is formatted as `{smallerUserId}:{largerUserId}`, where the two participant user IDs are sorted numerically (smaller ID first).\n\n## Encoding objects and arrays in query params\n\nInbox's API uses bracket notation to denote objects and arrays.\n\n### Objects\nFor an endpoint that accepts a `cursor` parameter for instance, with the cursor object being\n```json\n{\n id: \"l44e15irdq4db30i77cgphhx\",\n timestamp: \"2025-11-10T18:03:16.000Z\"\n}\n```\n\nThe URL search params would be encoded as:\n```txt\n?cursor[id]=l44e15irdq4db30i77cgphhx&cursor[timestamp]=2025-11-10T18:03:16.000Z\n```\n\n### Arrays\nFor an endpoint that accepts an `ids` parameter for instance, with the value being\n```json\n[\"1\", \"2\", \"3\"]\n```\n\nthere are three options:\n1. Repeat the parameter for each value:\n```txt\n?ids=1&ids=2&ids=3\n```\n2. Append `[]` to explicitly denote an array (useful if there's only one value):\n```txt\n?ids[]=1&ids[]=2&ids[]=3\n```\n3. Append `[number]` to denote the array index. This option is the most flexible and allows for reordering and skipping values:\n```txt\n?ids[0]=1&ids[1]=2&ids[2]=3\n```\n\n", "summary": "The Inbox API gives you full access to manage the following entities in your team." }, "servers": [{ "url": "https://inboxapp.com/api/v1" }], "tags": [{ "name": "Teams", "description": "Teams are shared workspace for members to view and manage account links, tags, statuses, campaigns, conversations, and more." }, { "name": "Threads", "description": "\nThreads represent conversations between an account linked to your team and a prospect on Twitter.\n " }, { "name": "Messages", "description": "\nMessages are the individual messages sent in a thread.\n " }, { "name": "Account Links", "description": "\nAccount links represent X accounts connected to your team.\n " }, { "name": "Members", "description": "\nMembers are Inbox users who can access the team.\n " }, { "name": "Prospects", "description": "\nProspects represent external profiles on X.\n " }, { "name": "Tags", "description": "\nTags are labels for prospects.\n " }, { "name": "Statuses", "description": "\nStatuses are used to track the deal stage or any fixed state for a prospect.\n " }, { "name": "Colors", "description": "\nGet predefined color options that can be used when creating or updating tags and statuses.\n " }], "components": { "securitySchemes": { "bearerAuth": { "type": "http", "scheme": "bearer" } }, "schemas": { "Prospect": { "type": "object", "properties": { "platform": { "enum": ["twitter"], "description": "The social platform where this prospect's profile exists.", "examples": ["twitter"] }, "platformId": { "type": "string", "description": "The platform's native user ID. For Twitter, this is the numeric user ID. This is the primary identifier for cross-platform operations.", "examples": ["1566123362161725440"] }, "externalId": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Unique identifier for this prospect in the Inbox system. Null if the prospect hasn't been imported yet.", "examples": ["l44e15irdq4db30i77cgphhx"] }, "documentId": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "Search index identifier for fast lookups. Null if the prospect isn't indexed yet.", "examples": [858224163] }, "displayName": { "type": "string", "description": "The user's display name as shown on their profile. For businesses, typically the company name.", "examples": ["Inbox"] }, "username": { "type": "string", "description": "The unique handle/username on the platform, without the @ symbol. Always lowercase for Twitter.", "examples": ["InboxApp_"] }, "handle": { "type": "string", "description": "The username with @ symbol prefix, ready for display in UI. Computed from username.", "examples": ["@InboxApp_"] }, "image": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Profile picture URL as provided by platform. May contain size suffixes or be lower quality. Prefer imageNormalized for display.", "examples": ["https://pbs.twimg.com/profile_images/1954360649393295360/rwp-vVt6.jpg"] }, "imageNormalized": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Profile picture URL normalized to highest quality available. Size suffixes removed. Prefer this over image for display.", "examples": ["https://pbs.twimg.com/profile_images/1954360649393295360/rwp-vVt6.jpg"] }, "bio": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "The user's profile bio/description text.", "examples": ["Social Selling CRM Close deals faster, stay organized, and never miss an opportunity. Starting with X"] }, "location": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Freeform location string as entered by user. Not normalized or geocoded.", "examples": ["San Francisco, CA"] }, "profileUrl": { "type": "string", "description": "Direct link to view this profile on the platform.", "examples": ["https://x.com/InboxApp_"] }, "websiteUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "External website URL the user provided in their profile, if any.", "examples": ["https://inboxapp.com"] }, "websiteDomain": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Domain extracted from websiteUrl for quick filtering and grouping.", "examples": ["inboxapp.com"] }, "verified": { "enum": ["none", "verified", "business", "government"], "description": "Verification badge status: none (no badge), verified (blue checkmark), business (gold badge), or government (gray badge).", "examples": ["business"] }, "profileType": { "enum": ["personal", "business", "government"], "description": "Account type classification: personal (individual), business (organization), or government (official agency).", "examples": ["business"] }, "isProtected": { "type": "boolean", "description": "Whether the account is private/protected. For Twitter: protected tweets enabled. Private accounts require approval to follow.", "examples": [false] }, "followerCount": { "type": "number", "description": "Number of users following this account.", "examples": [3068] }, "followingCount": { "type": "number", "description": "Number of users this account follows.", "examples": [288] }, "postCount": { "type": "number", "description": "Total content posted by this account. For Twitter: tweet count. For Instagram: post count.", "examples": [836] }, "engagementCount": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "Platform-specific engagement metric. For Twitter: likes/favorites given by user. May be null if platform doesn't provide this.", "examples": [2613] }, "listedCount": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "How many Twitter lists this profile appears on. Useful metric for influence. Null for non-Twitter platforms.", "examples": [18] }, "platformCreatedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "When the account was created on the platform. Null if platform doesn't provide this data.", "examples": ["2022-09-03T17:58:06.000Z"] }, "firstSeenAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "When this prospect was first added to Inbox. Useful for tracking relationship timeline.", "examples": ["2024-07-09T14:08:49.000Z"] }, "lastUpdatedAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "Most recent update timestamp for any data about this prospect.", "examples": ["2025-11-10T18:03:16.000Z"] }, "lastEnrichedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "When fresh data was last fetched from the platform API. Use this to determine if data needs refresh.", "examples": ["2025-11-10T18:03:16.000Z"] }, "lastActiveAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "Last time the profile was active on the platform (posted, liked, or engaged). Platform-dependent availability.", "examples": ["2025-11-10T12:00:00.000Z"] }, "source": { "enum": ["cached", "indexed", "live", "merged"], "description": "Data source: cached (stored), indexed (searchable), live (real-time from platform), or merged (combined sources).", "examples": ["cached"] }, "isFresh": { "type": "boolean", "description": "Indicates if data was updated within the last 7 days. Fresh data is current and reliable.", "examples": [true] }, "isStale": { "type": "boolean", "description": "Indicates if data hasn't been updated in over 30 days. Stale data may need refreshing for accuracy.", "examples": [false] }, "confidence": { "type": "number", "minimum": 0, "maximum": 1, "description": "Confidence score for data accuracy (0-1). Higher values indicate more recent and reliable data. 1.0 = real-time, 0.8+ = recent, below 0.5 = potentially outdated.", "examples": [0.85] }, "platformData": { "type": "object", "properties": { "isVerifiedBlue": { "type": "boolean", "description": "Standard Twitter blue checkmark verification badge.", "examples": [false] }, "isVerifiedGold": { "type": "boolean", "description": "Gold verification badge indicating a business/brand account on Twitter.", "examples": [true] }, "isVerifiedGray": { "type": "boolean", "description": "Gray verification badge indicating a government/official account on Twitter.", "examples": [false] }, "professionalCategory": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Professional category ID if the account has set one. Maps to categories like Technology, Media, Education, etc.", "examples": ["986"] }, "urlEntities": { "type": "array", "items": { "type": "object", "properties": { "url": { "type": "string", "description": "Shortened t.co URL as it appears in the tweet text.", "examples": ["https://t.co/abc123"] }, "expandedUrl": { "type": "string", "description": "Full expanded URL that the t.co link redirects to.", "examples": ["https://inboxapp.com"] }, "displayUrl": { "type": "string", "description": "Human-readable display text for the URL (typically domain + path).", "examples": ["inboxapp.com"] }, "indices": { "type": "array", "prefixItems": [{ "type": "number" }, { "type": "number" }], "description": "Start and end character indices where this URL appears in the bio text.", "examples": [[0, 23]] } }, "required": ["url", "expandedUrl", "displayUrl", "indices"] }, "description": "Parsed URL entities from the bio text with expanded and display URLs.", "examples": [[]] }, "bannerUrl": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Profile banner/header image URL (typically 1500x500px). Null if no banner is set.", "examples": ["https://pbs.twimg.com/profile_banners/1566123362161725440/1753273968"] }, "tweetsCount": { "type": "number", "description": "Total number of tweets posted by this account (all-time count).", "examples": [836] }, "favoritesCount": { "type": "number", "description": "Total number of likes/favorites this user has given to other tweets.", "examples": [2613] }, "rawData": { "anyOf": [{ "type": "object", "propertyNames": { "type": "string" }, "additionalProperties": {} }, { "type": "null" }], "description": "Full Twitter API user object for backward compatibility and advanced use cases. Null if not available from the data source." } }, "required": ["isVerifiedBlue", "isVerifiedGold", "isVerifiedGray", "professionalCategory", "urlEntities", "bannerUrl", "tweetsCount", "favoritesCount", "rawData"] } }, "required": ["platform", "platformId", "externalId", "documentId", "displayName", "username", "handle", "image", "imageNormalized", "bio", "location", "profileUrl", "websiteUrl", "websiteDomain", "verified", "profileType", "isProtected", "followerCount", "followingCount", "postCount", "engagementCount", "listedCount", "platformCreatedAt", "firstSeenAt", "lastUpdatedAt", "lastEnrichedAt", "lastActiveAt", "source", "isFresh", "isStale", "confidence", "platformData"] }, "Thread": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread.", "examples": ["df6jbw4h36..."] }, "platform": { "enum": ["twitter"], "description": "The platform this thread belongs to.", "examples": ["twitter"] }, "platformId": { "type": "string", "description": "The platform ID of the conversation.", "examples": ["1234567890"] }, "done": { "type": "boolean", "description": "Whether the thread has been archived or not.", "examples": [true] }, "assigneeId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The ID of the member assigned to the thread.", "examples": ["df6jbw4h36..."] }, "lastMessageTimestamp": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "The timestamp of the last message in the thread.", "examples": ["2025-08-22T12:00:00.000Z"] }, "computedSortTimestamp": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "The timestamp of the last message in the thread or the creation date if no messages have been sent.", "examples": ["2025-08-22T12:00:00.000Z"] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp of when the thread was created in Inbox.", "examples": ["2025-08-22T12:00:00.000Z"] }, "status": { "enum": ["active", "idle"], "description": "Idle threads are hidden from the main inbox, i.e. when previewing a profile using 'Quick peek'", "examples": ["active"] }, "variant": { "enum": ["unencrypted", "xChat"], "description": "Will be set to \"unencrypted\" by default for new conversations until both parties have exchanged messages. Once each party has sent at least one message, the conversation transitions to \"xChat\" (encrypted).", "examples": ["unencrypted"] }, "accountLinkId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the account link associated with this thread.", "examples": ["df6jbw4h36..."] }, "isSyncing": { "type": "boolean", "description": "Whether the thread is currently syncing data from Twitter to load all messages.", "examples": [false] }, "isRequest": { "type": "boolean", "description": "Whether this conversation is a message request.", "examples": [false] }, "typingIndicatorsEnabled": { "anyOf": [{ "type": "boolean" }, { "type": "null" }], "description": "Whether typing indicators are enabled for this thread. If set to null, will use the team default setting.", "examples": [true] }, "lastMessage": { "anyOf": [{ "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the last message in the thread. This is the message that will be displayed in the thread preview.", "examples": ["df6jbw4h36..."] }, "content": { "type": "string", "description": "The content of the last message in the thread.", "examples": ["Hey, I'm reaching out from Acme Agency..."] }, "authorId": { "type": "string", "description": "Points to either the accountLinkId or the externalId of the thread. May be a cuid2 or a legacy external ID.", "examples": ["df6jbw4h36..."] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp of when the last message was created in Inbox.", "examples": ["2025-08-22T12:00:00.000Z"] }, "userId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The ID of the Inbox user who sent the last message in the thread. Note that this is not a member ID.", "examples": ["df6jbw4h36..."] }, "campaignId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The ID of the campaign that sent the last message in the thread. This is only set if the last message was sent by a campaign.", "examples": ["df6jbw4h36..."] } }, "required": ["id", "content", "authorId", "createdAt", "userId", "campaignId"] }, { "type": "null" }] }, "prospect": { "allOf": [{ "$ref": "#/components/schemas/Prospect" }, { "type": "object", "properties": { "context": { "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" }, "description": "The tag IDs attached to this prospect.", "examples": [["df6jbw4h36..."]] }, "statusId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The status ID of the prospect.", "examples": ["df6jbw4h36..."] }, "valuation": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "The valuation of the prospect.", "examples": [599] }, "notes": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Notes attached to the prospect.", "examples": ["This prospect is a potential customer."] } }, "required": ["tags", "statusId", "valuation", "notes"] } }, "required": ["context"] }] } }, "required": ["id", "platform", "platformId", "done", "assigneeId", "lastMessageTimestamp", "computedSortTimestamp", "createdAt", "status", "variant", "accountLinkId", "isSyncing", "isRequest", "typingIndicatorsEnabled", "lastMessage", "prospect"] }, "Message": { "type": "object", "properties": { "platform": { "enum": ["twitter"], "description": "The platform the message was sent from.", "examples": ["twitter"] }, "teamId": { "type": "string", "pattern": "^[0-9a-z]+$", "examples": ["df6jbw4h36..."] }, "threadId": { "type": "string", "pattern": "^[0-9a-z]+$", "examples": ["df6jbw4h36..."] }, "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The Inbox ID of the message.", "examples": ["df6jbw4h36..."] }, "userId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The Inbox user who sent this message if applicable.", "examples": ["df6jbw4h36..."] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date" }, "updatedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }] }, "platformId": { "anyOf": [{ "type": "string" }, { "type": "null" }], "examples": ["1234567890"] }, "content": { "type": "string", "examples": ["Hey, I'm reaching out from Acme Agency..."] }, "campaignId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The Inbox campaign ID that sent this message if applicable.", "examples": ["df6jbw4h36..."] }, "authorId": { "type": "string", "description": "Will either be the `accountLinkId` or the `externalId` of the thread. May be a cuid2 or a legacy external ID.", "examples": ["df6jbw4h36..."] }, "origin": { "anyOf": [{ "enum": ["internal", "external", "api"] }, { "type": "null" }], "description": "The origin of the message. 'internal' means send from a user on Inbox, 'external' means synced from Twitter, 'api' means sent via the API.", "examples": ["internal"] }, "replyData": { "anyOf": [{ "not": {} }, { "type": "null" }], "description": "The reply data of the message if applicable." }, "forwardData": { "anyOf": [{ "not": {} }, { "type": "null" }], "description": "The forward data of the message if applicable." }, "entities": { "not": {}, "description": "Normalized URL entities, mentions, hashtags, tweet shares." }, "attachment": { "not": {}, "description": "Normalized media and card attachments." }, "reactions": { "type": "array", "items": { "not": {} }, "description": "Normalized reactions." }, "isEncrypted": { "anyOf": [{ "type": "boolean" }, { "type": "null" }], "description": "Whether the message is end-to-end encrypted." }, "isEdited": { "type": "boolean", "description": "Whether the message has been edited." }, "deletedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "When the message was soft-deleted in Inbox." }, "platformDeletedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "When the message was deleted on the platform." } }, "required": ["platform", "teamId", "threadId", "id", "userId", "createdAt", "updatedAt", "platformId", "content", "campaignId", "authorId", "origin", "replyData", "forwardData", "entities", "attachment", "reactions", "isEncrypted", "isEdited", "deletedAt", "platformDeletedAt"] }, "AccountLink": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The Inbox ID of the account link.", "examples": ["df6jbw4h36..."] }, "platform": { "enum": ["twitter"] }, "platformId": { "type": "string", "description": "The platform ID of the account link.", "examples": ["1234567890"] }, "name": { "type": "string", "examples": ["Acme Agency"] }, "username": { "type": "string", "examples": ["acme_agency"] }, "image": { "type": "string", "examples": ["https://example.com/image.png"] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date" }, "status": { "enum": ["active", "offline", "paused"], "description": "X may periodically sign out your account, in which case it will be marked as `offline`. An account can get paused if the team is scheduled for deletion or in other circumstances, and is a far less common state that has nothing to do with the X API.", "examples": ["active"] }, "syncedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "When this account was completely synced for the first time." } }, "required": ["id", "platform", "platformId", "name", "username", "image", "createdAt", "status", "syncedAt"] }, "Team": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the team.", "examples": ["pwxtytmwrw58mao0mvb4rwmn"] }, "name": { "type": "string", "description": "The name of the team.", "examples": ["Acme Agency"] }, "slug": { "type": "string", "description": "The slug of the team.", "examples": ["acme-agency"] }, "image": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "The URL of the team's avatar image.", "examples": ["https://fiber.inboxapp.com/avatars/teams/abc123"] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The date and time the team was created.", "examples": ["2025-01-01T00:00:00.000Z"] }, "updatedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "The date and time the team was last updated.", "examples": ["2025-01-01T00:00:00.000Z"] }, "currency": { "type": "string", "description": "The currency of the team. Used for valuation of prospects.", "examples": ["USD"] }, "allowSupportAccess": { "type": "boolean", "description": "Whether support access is allowed for the team.", "examples": [true] } }, "required": ["id", "name", "slug", "image", "createdAt", "updatedAt", "currency", "allowSupportAccess"] }, "Member": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the team member.", "examples": ["df6jbw4h36..."] }, "userId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The user ID of the member. Users can be part of multiple teams.", "examples": ["df6jbw4h36..."] }, "name": { "anyOf": [{ "type": "string" }, { "type": "null" }], "examples": ["John Doe"] }, "email": { "type": "string", "format": "email", "examples": ["john.doe@example.com"] }, "image": { "anyOf": [{ "type": "string" }, { "type": "null" }], "examples": ["https://example.com/john-doe.jpg"] }, "role": { "enum": ["owner", "admin", "user"] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The date and time this member was added to the team." }, "updatedAt": { "anyOf": [{ "type": "string", "format": "date-time", "x-native-type": "date" }, { "type": "null" }], "description": "The date and time this member was last updated." } }, "required": ["id", "userId", "name", "email", "image", "role", "createdAt", "updatedAt"] }, "Status": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "Unique identifier for the status.", "examples": ["l44e15irdq4db30i77cgphhx"] }, "name": { "type": "string", "description": "The display name of the status. Typically represents a stage in your sales pipeline.", "examples": ["New Lead", "Warm", "Qualified", "Closed Won"] }, "color": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Hex color code for the status (e.g., #10b981 for green). Null if no color is set.", "examples": ["#ef4444", "#f59e0b", "#10b981", "#3b82f6"] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp when this status was created.", "examples": ["2025-11-10T18:03:16.000Z"] } }, "required": ["id", "name", "color", "createdAt"] }, "Tag": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "Unique identifier for the tag.", "examples": ["l44e15irdq4db30i77cgphhx"] }, "name": { "type": "string", "description": "The display name of the tag.", "examples": ["High Priority", "Follow Up", "VIP"] }, "color": { "type": "string", "description": "Hex color code for the tag or predefined color (available via GET /colors).", "examples": ["#3b82f6", "#10b981", "teal", "amber"] } }, "required": ["id", "name", "color"] } } }, "x-scalar-environments": { "production": { "description": "The production environment", "variables": { "teamId": "" } } }, "x-scalar-active-environment": "production", "openapi": "3.1.1", "paths": { "/team": { "get": { "operationId": "team.get", "summary": "Get team", "description": "Get the team associated with the supplied API token.", "tags": ["Teams"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Team" } } } } } } }, "/threads": { "get": { "operationId": "threads.list", "summary": "List threads", "description": "List threads ordered by recency with advanced filtering", "tags": ["Threads"], "parameters": [{ "name": "accountLinkIds", "in": "query", "schema": { "anyOf": [{ "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" } }, { "type": "null" }], "description": "Filter by specific account links. Omit to include all accounts, or provide an array of account link IDs to filter by specific accounts." }, "style": "deepObject", "explode": true, "allowEmptyValue": true, "allowReserved": true }, { "name": "cursorId", "in": "query", "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread to start pagination from. Must be used together with cursorTimestamp. Cannot be combined with the cursor object parameter." }, "allowEmptyValue": true, "allowReserved": true }, { "name": "cursorTimestamp", "in": "query", "schema": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp of the thread to start pagination from. Must be used together with cursorId. Cannot be combined with the cursor object parameter.", "examples": ["2025-11-10T18:03:16.000Z"] }, "allowEmptyValue": true, "allowReserved": true }, { "name": "cursor", "in": "query", "schema": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread to start pagination from." }, "timestamp": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp of the thread to start pagination from.", "examples": ["2025-11-10T18:03:16.000Z"] } }, "required": ["id", "timestamp"], "description": "Pagination cursor using [bracket notation](https://docs.inboxapp.com/api-reference/introduction#encoding-objects-and-arrays-in-query-params). Omit to start from the beginning. Prefer using `cursorId` and `cursorTimestamp` instead for simpler query string encoding." }, "style": "deepObject", "explode": true, "allowEmptyValue": true, "allowReserved": true }, { "name": "inbox", "in": "query", "schema": { "enum": ["default", "no-reply", "requests", "archived"], "description": "Inbox view to filter threads. 'default' shows active threads, 'no-reply' shows threads awaiting response, 'requests' shows message requests, 'archived' shows archived threads.", "examples": ["default", "no-reply", "requests", "archived"] }, "style": "form", "explode": false, "allowEmptyValue": true, "allowReserved": true }, { "name": "filters", "in": "query", "schema": { "anyOf": [{ "type": "object", "properties": { "tags": { "type": "object", "properties": { "selectedIds": { "type": "array", "items": { "type": "string" }, "description": "Array of tag IDs to filter by." }, "noTags": { "type": "boolean", "description": "When true, only show threads with no tags assigned. When false, this filter is ignored." } }, "description": "Filter threads by tags. Use selectedIds to filter by specific tags, or set noTags to true to show only untagged threads." }, "statuses": { "type": "object", "properties": { "selectedIds": { "type": "array", "items": { "type": "string" }, "description": "Array of status IDs to filter by." }, "noStatus": { "type": "boolean", "description": "When true, only show threads with no status assigned. When false, this filter is ignored." } }, "description": "Filter threads by status. Use selectedIds to filter by specific statuses, or set noStatus to true to show only threads without a status." }, "assignees": { "type": "object", "properties": { "selectedIds": { "type": "array", "items": { "type": "string" }, "description": "Array of member IDs to filter by." }, "noAssignee": { "type": "boolean", "description": "When true, only show unassigned threads. When false, this filter is ignored." } }, "description": "Filter threads by assignee. Use selectedIds to filter by specific team members, or set noAssignee to true to show only unassigned threads." }, "campaigns": { "type": "object", "properties": { "selectedIds": { "type": "array", "items": { "type": "string" }, "description": "Array of campaign IDs to filter by." }, "noCampaign": { "type": "boolean", "description": "When true, only show threads not associated with any campaign. When false, this filter is ignored." } }, "description": "Filter threads by campaign. Use selectedIds to filter by specific campaigns, or set noCampaign to true to show only non-campaign threads." }, "sortOrder": { "enum": ["asc", "desc"], "default": "desc", "description": "Sort order for threads. 'desc' shows most recent first (default), 'asc' shows oldest first.", "examples": ["desc", "asc"] } } }, { "type": "null" }], "description": "Advanced filtering options for threads. Pass null or omit to disable all filters." }, "style": "deepObject", "explode": true, "allowEmptyValue": true, "allowReserved": true }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 20, "description": "Maximum number of threads to return per page. Defaults to 20, maximum 100.", "examples": [20] }, "allowEmptyValue": true, "allowReserved": true }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "threads": { "type": "array", "items": { "$ref": "#/components/schemas/Thread" } }, "nextCursor": { "anyOf": [{ "type": "object", "properties": { "timestamp": { "type": "string", "format": "date-time", "x-native-type": "date" }, "id": { "type": "string", "pattern": "^[0-9a-z]+$" } }, "required": ["timestamp", "id"] }, { "type": "null" }] } }, "required": ["threads", "nextCursor"] } } } } } }, "post": { "operationId": "threads.create", "summary": "Create thread", "description": "Create a new active thread with a prospect", "tags": ["Threads"], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "externalPlatformId": { "type": "string", "description": "The platform ID of the prospect. Must be provided if externalId is not provided.", "examples": ["1234567890"] }, "externalId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The Inbox external ID of the prospect. Must be provided if externalPlatformId is not provided." }, "accountLinkId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The account link ID to associate with this thread. This determines which connected account the thread belongs to." } }, "required": ["accountLinkId"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Thread" } } } } } } }, "/threads/lookup": { "get": { "operationId": "threads.lookup", "summary": "Lookup thread", "description": "Find a thread by account link ID and external identifier (platform ID or external ID)", "tags": ["Threads"], "parameters": [{ "name": "accountLinkId", "in": "query", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The account link ID associated with the thread." }, "allowEmptyValue": true, "allowReserved": true }, { "name": "externalPlatformId", "in": "query", "required": false, "schema": { "type": "string", "description": "The platform ID of the prospect. Must be provided if externalId is not provided." }, "allowEmptyValue": true, "allowReserved": true }, { "name": "externalId", "in": "query", "required": false, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The Inbox external ID of the prospect. Must be provided if externalPlatformId is not provided." }, "allowEmptyValue": true, "allowReserved": true }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "anyOf": [{ "$ref": "#/components/schemas/Thread" }, { "type": "null" }] } } } } } } }, "/threads/lookup-by-username": { "get": { "operationId": "threads.lookupByUsername", "summary": "Lookup threads by username", "description": "Find all threads for a prospect by their exact platform username. Returns threads across all account links.", "tags": ["Threads"], "parameters": [{ "name": "username", "in": "query", "required": true, "schema": { "type": "string", "minLength": 1, "description": "The exact platform username of the prospect (without the @ prefix).", "examples": ["jordanrivera"] }, "allowEmptyValue": true, "allowReserved": true }, { "name": "accountLinkIds", "in": "query", "required": false, "schema": { "anyOf": [{ "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" } }, { "type": "null" }], "description": "Filter results to specific account links. Omit to include threads across all accounts." }, "style": "deepObject", "explode": true, "allowEmptyValue": true, "allowReserved": true }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Thread" } } } } } } } }, "/threads/{threadId}": { "get": { "operationId": "threads.thread.get", "summary": "Get thread", "description": "Get details of a specific thread", "tags": ["Threads"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Thread" } } } } } }, "patch": { "operationId": "threads.thread.update", "summary": "Update thread", "description": "Mark a thread done or change assignee", "tags": ["Threads"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": { "done": { "type": "boolean" }, "assigneeId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }] } }, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Thread" } } } } } }, "delete": { "operationId": "threads.thread.delete", "summary": "Delete thread", "description": "Soft delete a thread", "tags": ["Threads"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } } } } } }, "/threads/{threadId}/typing": { "post": { "operationId": "threads.thread.typing", "summary": "Send typing indicator", "description": "Sends a typing indicator to the external party in the thread. Only supported for X Chat (encrypted) threads.", "tags": ["Threads"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "status": { "enum": ["sent", "skipped"], "description": "Whether the typing indicator was sent or skipped. If skipped, the reason will be provided.", "examples": ["sent"] }, "reason": { "enum": ["rateLimited", "typingDisabled", "unsupported", "outboundDisabled"], "description": "The reason the typing indicator was skipped. Only present when status is 'skipped'.", "examples": ["rateLimited"] } }, "required": ["status"] } } } } } } }, "/threads/{threadId}/settings": { "patch": { "operationId": "threads.thread.settings", "summary": "Update thread settings", "description": "Update settings for a specific thread", "tags": ["Threads"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": { "typingIndicatorsEnabled": { "anyOf": [{ "type": "boolean" }, { "type": "null" }], "description": "Whether typing indicators are enabled for this thread. Set to null to use the team default setting.", "examples": [true] } }, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "threadId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread.", "examples": ["df6jbw4h36..."] }, "typingIndicatorsEnabled": { "anyOf": [{ "type": "boolean" }, { "type": "null" }], "description": "Whether typing indicators are enabled for this thread. If null, the team default setting is used.", "examples": [true] } }, "required": ["threadId", "typingIndicatorsEnabled"] } } } } } } }, "/threads/{threadId}/messages": { "get": { "operationId": "threads.thread.messages.list", "summary": "List messages", "description": "List messages in a thread with pagination support", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread to list messages from." } }, { "name": "cursorId", "in": "query", "required": false, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to start pagination from. Must be used together with cursorTimestamp. Cannot be combined with the cursor object parameter." }, "allowEmptyValue": true, "allowReserved": true }, { "name": "cursorTimestamp", "in": "query", "required": false, "schema": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp of the message to start pagination from. Must be used together with cursorId. Cannot be combined with the cursor object parameter.", "examples": ["2025-11-10T18:03:16.000Z"] }, "allowEmptyValue": true, "allowReserved": true }, { "name": "cursor", "in": "query", "required": false, "schema": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to start pagination from." }, "timestamp": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "The timestamp of the message to start pagination from.", "examples": ["2025-11-10T18:03:16.000Z"] } }, "required": ["id", "timestamp"], "description": "Pagination cursor using [bracket notation](https://docs.inboxapp.com/api-reference/introduction#encoding-objects-and-arrays-in-query-params). Omit to start from the beginning. Prefer using `cursorId` and `cursorTimestamp` instead for simpler query string encoding." }, "style": "deepObject", "explode": true, "allowEmptyValue": true, "allowReserved": true }, { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "minimum": 1, "maximum": 100, "default": 50, "description": "Maximum number of messages to return per page. Defaults to 50, maximum 100.", "examples": [50] }, "allowEmptyValue": true, "allowReserved": true }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "teamId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "threadId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "messages": { "type": "array", "items": { "$ref": "#/components/schemas/Message" } }, "nextCursor": { "anyOf": [{ "type": "object", "properties": { "timestamp": { "type": "string", "format": "date-time", "x-native-type": "date" }, "id": { "type": "string", "pattern": "^[0-9a-z]+$" } }, "required": ["timestamp", "id"] }, { "type": "null" }] }, "isSyncing": { "type": "boolean", "description": "Whether the thread is currently syncing older messages from the platform. If true, additional messages may become available shortly. Poll the endpoint to retrieve newly synced messages." } }, "required": ["teamId", "threadId", "messages", "nextCursor", "isSyncing"] } } } } } }, "post": { "operationId": "threads.thread.messages.create", "summary": "Send message", "description": "Send a message in a thread", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "content": { "type": "string", "minLength": 1 }, "replyToMessageId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to reply to." } }, "required": ["content"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Message" } } } } } } }, "/threads/{threadId}/messages/{messageId}": { "patch": { "operationId": "threads.thread.messages.message.edit", "summary": "Edit message", "description": "Edit a message in a thread. Only works for X Chat (encrypted DM) threads.", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread containing the message." } }, { "name": "messageId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to edit." } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "content": { "type": "string", "minLength": 1, "description": "The new content for the message.", "examples": ["Updated message content"] } }, "required": ["content"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "messageId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "content": { "type": "string" }, "editedAt": { "type": "string", "format": "date-time", "x-native-type": "date" } }, "required": ["success", "messageId", "content", "editedAt"] } } } } } }, "delete": { "operationId": "threads.thread.messages.message.delete", "summary": "Delete message", "description": "Delete a message in a thread. Only works for X Chat (encrypted DM) threads.", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread containing the message." } }, { "name": "messageId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to delete." } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": { "deleteForAll": { "type": "boolean", "default": true, "description": "Whether to delete the message for all participants or just for yourself. Defaults to true (delete for all)." } }, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "messageId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "deletedAt": { "type": "string", "format": "date-time", "x-native-type": "date" } }, "required": ["success", "messageId", "deletedAt"] } } } } } } }, "/threads/{threadId}/messages/{messageId}/history": { "get": { "operationId": "threads.thread.messages.message.history", "summary": "Get message history", "description": "Get the edit history and deletion status of a message. Returns all versions of the message content over time.", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread containing the message." } }, { "name": "messageId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to get history for." } }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "versions": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The Inbox ID of the message." }, "platformId": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "The platform ID of the message." }, "platform": { "enum": ["twitter"], "description": "The platform the message was sent from." }, "content": { "type": "string", "description": "The content of this version of the message." }, "authorId": { "type": "string", "description": "The author of the message. May be a cuid2 or a legacy external ID." }, "userId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The Inbox user who sent this message if applicable." }, "teamId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "threadId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "campaignId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }] }, "campaignStepId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }] }, "origin": { "anyOf": [{ "enum": ["internal", "external", "api"] }, { "type": "null" }], "description": "The origin of the message." }, "editOrigin": { "anyOf": [{ "enum": ["internal", "external", "api"] }, { "type": "null" }], "description": "The origin of this edit, or null if this is the original version." }, "replyData": { "anyOf": [{ "not": {} }, { "type": "null" }] }, "forwardData": { "anyOf": [{ "not": {} }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "When this version was created (original message time or edit time)." }, "isEncrypted": { "anyOf": [{ "type": "boolean" }, { "type": "null" }] }, "expandedData": { "anyOf": [{ "not": {} }, { "type": "null" }] }, "entities": { "not": {} }, "attachment": { "not": {} }, "reactions": { "type": "array", "items": { "not": {} } } }, "required": ["id", "platformId", "platform", "content", "authorId", "userId", "teamId", "threadId", "campaignId", "campaignStepId", "origin", "editOrigin", "replyData", "forwardData", "createdAt", "isEncrypted", "expandedData", "entities", "attachment", "reactions"] }, "description": "All versions of the message, ordered chronologically. The first entry is the original content (if available), followed by each edit." }, "deletion": { "anyOf": [{ "type": "object", "properties": { "deletedAt": { "type": "string", "format": "date-time", "x-native-type": "date", "description": "When the message was deleted." }, "deletionType": { "enum": ["self", "all"], "description": "Whether the message was deleted for self only or for all participants." }, "deletionAuthorPlatformId": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "The platform ID of the user who deleted the message." }, "origin": { "anyOf": [{ "enum": ["internal", "external", "api"] }, { "type": "null" }], "description": "The origin of the deletion." } }, "required": ["deletedAt", "deletionType", "deletionAuthorPlatformId", "origin"] }, { "type": "null" }], "description": "Deletion information if the message was deleted, otherwise null." } }, "required": ["versions", "deletion"] } } } } } } }, "/threads/{threadId}/messages/{messageId}/reactions/reactions": { "post": { "operationId": "threads.thread.messages.message.reactions.add", "summary": "Add reaction", "description": "Add a reaction to a message. Only works for non-sandbox threads.", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread containing the message." } }, { "name": "messageId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to react to." } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "emoji": { "type": "string", "description": "The emoji to react with.", "examples": ["❤️", "😂", "👍"] } }, "required": ["emoji"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "messageId": { "type": "string", "pattern": "^[0-9a-z]+$" } }, "required": ["success", "messageId"] } } } } } }, "delete": { "operationId": "threads.thread.messages.message.reactions.remove", "summary": "Remove reaction", "description": "Remove a reaction from a message. Only works for non-sandbox threads.", "tags": ["Messages"], "parameters": [{ "name": "threadId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the thread containing the message." } }, { "name": "messageId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the message to remove the reaction from." } }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "emoji": { "type": "string", "description": "The emoji reaction to remove.", "examples": ["❤️", "😂", "👍"] } }, "required": ["emoji"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "success": { "type": "boolean" }, "messageId": { "type": "string", "pattern": "^[0-9a-z]+$" } }, "required": ["success", "messageId"] } } } } } } }, "/threads/messages": { "post": { "operationId": "threads.messages.quickSend", "summary": "Quick send message", "description": "Send a message without knowing the thread ID ahead of time. Automatically creates a thread if needed.", "tags": ["Messages"], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "externalPlatformId": { "type": "string", "description": "The platform ID of the prospect. Must be provided if `externalId` is not provided.", "examples": ["1234567890"] }, "externalId": { "type": "string", "description": "The Inbox external ID of the prospect. Must be provided if `externalPlatformId` is not provided.", "examples": ["1234567890"] }, "accountLinkId": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The account link ID to send the message from.", "examples": ["df6jbw4h36..."] }, "content": { "type": "string", "minLength": 1, "examples": ["Hey, I'm reaching out from Acme Agency..."] } }, "required": ["accountLinkId", "content"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "message": { "$ref": "#/components/schemas/Message" }, "thread": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$" }, "platformId": { "anyOf": [{ "type": "string" }, { "type": "null" }] } }, "required": ["id", "platformId"] } }, "required": ["message", "thread"] } } } } } } }, "/account-links": { "get": { "operationId": "accountLinks.list", "summary": "List account links", "description": "List all account links for the team", "tags": ["Account Links"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/AccountLink" } } } } } } } }, "/members": { "get": { "operationId": "members.list", "summary": "List members", "description": "List all members of the team", "tags": ["Members"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Member" } } } } } } } }, "/members/{memberId}": { "get": { "operationId": "members.get", "summary": "Get member", "description": "Get details of a specific member", "tags": ["Members"], "parameters": [{ "name": "memberId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Member" } } } } } } }, "/prospects/{prospectId}": { "get": { "operationId": "prospects.get", "summary": "Get prospect", "description": "Get details of a specific prospect", "tags": ["Prospects"], "parameters": [{ "name": "prospectId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/Prospect" }, { "type": "object", "properties": { "context": { "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" }, "description": "The tag IDs attached to this prospect.", "examples": [["df6jbw4h36..."]] }, "statusId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The status ID of the prospect.", "examples": ["df6jbw4h36..."] }, "valuation": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "The valuation of the prospect.", "examples": [599] }, "notes": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Notes attached to the prospect.", "examples": ["This prospect is a potential customer."] }, "threads": { "anyOf": [{ "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$" }, "accountLinkId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "lastMessageTimestamp": { "anyOf": [{ "type": "string", "format": "date-time" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "accountLinkId", "lastMessageTimestamp", "createdAt"] } }, { "type": "null" }], "description": "Threads across all accounts linked to this prospect." } }, "required": ["tags", "statusId", "valuation", "notes"] } }, "required": ["context"] }] } } } } } } }, "/prospects/{prospectId}/context": { "patch": { "operationId": "prospects.update", "summary": "Update prospect context", "description": "Update context of a specific prospect", "tags": ["Prospects"], "parameters": [{ "name": "prospectId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$" } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": { "notes": { "anyOf": [{ "type": "string" }, { "type": "null" }] }, "valuation": { "anyOf": [{ "type": "number" }, { "type": "null" }] }, "statusId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }] }, "addTags": { "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" } }, "removeTags": { "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" } }, "assigneeId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }] }, "done": { "type": "boolean" } }, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "allOf": [{ "$ref": "#/components/schemas/Prospect" }, { "type": "object", "properties": { "context": { "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" }, "description": "The tag IDs attached to this prospect.", "examples": [["df6jbw4h36..."]] }, "statusId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The status ID of the prospect.", "examples": ["df6jbw4h36..."] }, "valuation": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "The valuation of the prospect.", "examples": [599] }, "notes": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Notes attached to the prospect.", "examples": ["This prospect is a potential customer."] }, "threads": { "anyOf": [{ "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$" }, "accountLinkId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "lastMessageTimestamp": { "anyOf": [{ "type": "string", "format": "date-time" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "accountLinkId", "lastMessageTimestamp", "createdAt"] } }, { "type": "null" }], "description": "Threads across all accounts linked to this prospect." } }, "required": ["tags", "statusId", "valuation", "notes"] } }, "required": ["context"] }] } } } } } } }, "/prospects/lookup": { "get": { "operationId": "prospects.lookup", "summary": "Lookup prospect", "description": "Find an Inbox prospect by platform ID. Note that not all of Twitter is included here. A separate search API will be available for profiles not in our CRM later.", "tags": ["Prospects"], "parameters": [{ "name": "platformId", "in": "query", "required": true, "schema": { "type": "string", "description": "The platform user ID (e.g., Twitter user ID)." }, "allowEmptyValue": true, "allowReserved": true }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "anyOf": [{ "allOf": [{ "$ref": "#/components/schemas/Prospect" }, { "type": "object", "properties": { "context": { "type": "object", "properties": { "tags": { "type": "array", "items": { "type": "string", "pattern": "^[0-9a-z]+$" }, "description": "The tag IDs attached to this prospect.", "examples": [["df6jbw4h36..."]] }, "statusId": { "anyOf": [{ "type": "string", "pattern": "^[0-9a-z]+$" }, { "type": "null" }], "description": "The status ID of the prospect.", "examples": ["df6jbw4h36..."] }, "valuation": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "The valuation of the prospect.", "examples": [599] }, "notes": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Notes attached to the prospect.", "examples": ["This prospect is a potential customer."] }, "threads": { "anyOf": [{ "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string", "pattern": "^[0-9a-z]+$" }, "accountLinkId": { "type": "string", "pattern": "^[0-9a-z]+$" }, "lastMessageTimestamp": { "anyOf": [{ "type": "string", "format": "date-time" }, { "type": "null" }] }, "createdAt": { "type": "string", "format": "date-time" } }, "required": ["id", "accountLinkId", "lastMessageTimestamp", "createdAt"] } }, { "type": "null" }], "description": "Threads across all accounts linked to this prospect." } }, "required": ["tags", "statusId", "valuation", "notes"] } }, "required": ["context"] }] }, { "type": "null" }] } } } } } } }, "/tags": { "get": { "operationId": "tags.list", "summary": "List tags", "description": "List all tags in the team", "tags": ["Tags"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Tag" } } } } } } }, "post": { "operationId": "tags.create", "summary": "Create tag", "description": "Create a new tag for organizing threads and prospects", "tags": ["Tags"], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 255, "description": "The name of the tag. Must be unique within the team. Maximum 255 characters.", "examples": ["High Priority", "Follow Up", "VIP"] }, "color": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Color for the item. Can be a predefined color name (red, blue, green, etc.) or a hex code (#ef4444).", "examples": ["red", "#ef4444"] } }, "required": ["name"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tag" } } } } } } }, "/tags/{tagId}": { "get": { "operationId": "tags.get", "summary": "Get tag", "description": "Get details of a specific tag", "tags": ["Tags"], "parameters": [{ "name": "tagId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the tag to retrieve." } }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tag" } } } } } }, "patch": { "operationId": "tags.update", "summary": "Update tag", "description": "Update a tag's name or color", "tags": ["Tags"], "parameters": [{ "name": "tagId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the tag to update." } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 255, "description": "The new name for the tag. Must be unique within the team. Maximum 255 characters.", "examples": ["High Priority", "Follow Up", "VIP"] }, "color": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Color for the item. Can be a predefined color name (red, blue, green, etc.) or a hex code (#ef4444).", "examples": ["red", "#ef4444"] } }, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Tag" } } } } } }, "delete": { "operationId": "tags.delete", "summary": "Delete tag", "description": "Delete a tag. This will remove the tag from all threads and prospects.", "tags": ["Tags"], "parameters": [{ "name": "tagId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the tag to delete." } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } } } } } }, "/tags/colors": { "get": { "operationId": "tags.colors", "summary": "List available colors", "description": "Get a list of predefined colors that can be used when creating or updating tags", "tags": ["Tags"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the color that can be used in API requests.", "examples": ["red", "blue", "green"] }, "hex": { "type": "string", "description": "The hex code representation of the color.", "examples": ["#ef4444", "#3b82f6", "#22c55e"] } }, "required": ["name", "hex"] } } } } } } } }, "/statuses": { "get": { "operationId": "statuses.list", "summary": "List statuses", "description": "List all statuses in the team", "tags": ["Statuses"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Status" } } } } } } }, "post": { "operationId": "statuses.create", "summary": "Create status", "description": "Create a new status to track leads through your sales pipeline", "tags": ["Statuses"], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 255, "description": "The name of the status. Must be unique within the team. Maximum 255 characters.", "examples": ["New Lead", "Warm", "Qualified", "Closed Won"] }, "color": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Color for the item. Can be a predefined color name (red, blue, green, etc.) or a hex code (#ef4444).", "examples": ["red", "#ef4444"] } }, "required": ["name"] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Status" } } } } } } }, "/statuses/{statusId}": { "get": { "operationId": "statuses.get", "summary": "Get status", "description": "Get details of a specific status", "tags": ["Statuses"], "parameters": [{ "name": "statusId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the status to retrieve." } }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Status" } } } } } }, "patch": { "operationId": "statuses.update", "summary": "Update status", "description": "Update a status's name or color", "tags": ["Statuses"], "parameters": [{ "name": "statusId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the status to update." } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string", "minLength": 1, "maxLength": 255, "description": "The new name for the status. Must be unique within the team. Maximum 255 characters.", "examples": ["New Lead", "Warm", "Qualified", "Closed Won"] }, "color": { "anyOf": [{ "type": "string" }, { "type": "null" }], "description": "Color for the item. Can be a predefined color name (red, blue, green, etc.) or a hex code (#ef4444).", "examples": ["red", "#ef4444"] } }, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Status" } } } } } }, "delete": { "operationId": "statuses.delete", "summary": "Delete status", "description": "Delete a status. This will remove the status from all threads.", "tags": ["Statuses"], "parameters": [{ "name": "statusId", "in": "path", "required": true, "schema": { "type": "string", "pattern": "^[0-9a-z]+$", "description": "The ID of the status to delete." } }], "requestBody": { "required": false, "content": { "application/json": { "schema": { "type": "object", "properties": {}, "required": [] } } } }, "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "anyOf": [{ "not": {} }, { "not": {} }] } } } } } } }, "/statuses/colors": { "get": { "operationId": "statuses.colors", "summary": "List available colors", "description": "Get a list of predefined colors that can be used when creating or updating statuses", "tags": ["Statuses"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the color that can be used in API requests.", "examples": ["red", "blue", "green"] }, "hex": { "type": "string", "description": "The hex code representation of the color.", "examples": ["#ef4444", "#3b82f6", "#22c55e"] } }, "required": ["name", "hex"] } } } } } } } }, "/colors": { "get": { "operationId": "colors.list", "summary": "List available colors", "description": "Get a list of predefined colors that can be used when creating or updating tags or statuses", "tags": ["Colors"], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "object", "properties": { "name": { "type": "string", "description": "The name of the color that can be used in API requests.", "examples": ["red", "blue", "green"] }, "hex": { "type": "string", "description": "The hex code representation of the color.", "examples": ["#ef4444", "#3b82f6", "#22c55e"] } }, "required": ["name", "hex"] } } } } } } } }, "/events": { "get": { "operationId": "events.list", "summary": "List events", "description": "List webhook events for replay. Events are stored for 7 days.", "tags": ["Events"], "parameters": [{ "name": "afterSeq", "in": "query", "schema": { "type": "integer", "minimum": 0, "maximum": 9007199254740991, "description": "Return events after this sequence number. Omit to start from the beginning." }, "allowEmptyValue": true, "allowReserved": true }, { "name": "limit", "in": "query", "schema": { "type": "integer", "minimum": 1, "maximum": 1000, "default": 100, "description": "Maximum number of events to return. Defaults to 100, maximum 1000." }, "allowEmptyValue": true, "allowReserved": true }], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "type": "object", "properties": { "events": { "type": "array", "items": { "type": "object", "properties": { "id": { "type": "string" }, "seq": { "type": "number" }, "teamId": { "type": "string" }, "type": { "enum": ["thread.created", "thread.deleted", "thread.assigned", "thread.unassigned", "thread.archived", "thread.unarchived", "thread.typing", "message.created", "message.edited", "message.deleted", "message.reactionAdded", "message.reactionRemoved", "prospect.created", "prospect.statusChanged", "prospect.tagsChanged", "prospect.notesChanged", "prospect.valuationChanged", "prospect.enriched", "tag.created", "tag.updated", "tag.deleted", "status.created", "status.updated", "status.deleted", "campaign.created", "campaign.started", "campaign.paused", "campaign.resumed", "campaign.completed", "target.contacted", "target.followUpSent", "target.replied"] }, "timestamp": { "type": "string", "format": "date-time" }, "version": { "const": "1.0" }, "data": {} }, "required": ["id", "seq", "teamId", "type", "timestamp", "version"] } }, "hasMore": { "type": "boolean", "description": "Whether there are more events after this page." }, "lastSeq": { "anyOf": [{ "type": "number" }, { "type": "null" }], "description": "The sequence number of the last event in this page. Use as afterSeq for the next request." } }, "required": ["events", "hasMore", "lastSeq"] } } } } } } } } }
|