REST API reference
SuiteDash API
14 endpoints for SuiteDash. Each one is a POST with a JSON body, called with your API key.
- Base URL
- https://cotlet.dev/api/v1/suitedash
- Connects with
- Your own SuiteDash account (admin for invoices, payments and the CRM)
- Integration page
- SuiteDash
| Endpoint | Access | Description |
|---|---|---|
| find_contact | read | Contacts and companies by name or email, with role, company and custom fields. |
| list_projects | read | Projects with client, status, Project Leader, start and estimated completion dates. |
| list_tasks | read | Tasks with assignee, due date, priority, status and project. |
| list_invoices | read | Invoices with number, client, title, total, amount paid, due date and status. |
| get_invoice | read | Full invoice: line items, discounts, taxes, payments, notes and payment link. |
| list_message_threads | read | Secure Messaging threads with subject, participants, last message and unread flag. |
| create_contact | write | New Lead, Prospect or Client in your CRM. No portal invitation is sent. |
| create_project | write | New project for a client, optionally from a Task Template. |
| add_task | write | New task in a project or standalone, assigned to a teammate. |
| complete_task | write | Mark a task as Completed. |
| create_invoice | write | Invoice for a client from your Office items. Saved as Draft unless you open and send it. |
| record_payment | write | Record a payment made outside SuiteDash against an open invoice. |
| send_message | write | New Secure Messaging thread, or a reply in an existing one. |
| share_file | write | Upload a file to the Sharing Folder of a client. |
Find contact
readPOST https://cotlet.dev/api/v1/suitedash/find_contact
Searches your CRM by name, company name or email and returns the matches with their UID, role and company. Use the UID as client_id or contact_id in the other tools. Role is Lead, Prospect or Client as in your CRM.
Parameters
| Name | Type | Description |
|---|---|---|
| query required | string | Name, company name or email. |
| role | enum | lead, prospect or client. Default: any. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/find_contact \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"query":"query"}' result = client.call("suitedash", "find_contact", {"query":"query"}) const result = await cotlet.call('suitedash', 'find_contact', {"query":"query"}); cotlet call suitedash find_contact --data '{"query":"query"}' Example response
{
"contacts": [
{
"contact_id": "c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71",
"name": "Ana Lopez",
"email": "ana@acmestudio.example",
"role": "client",
"company": "Acme Studio"
}
]
} List projects
readPOST https://cotlet.dev/api/v1/suitedash/list_projects
Lists projects, optionally for one client. Archived projects are left out unless you ask. Use project_id in add_task and list_tasks.
Parameters
| Name | Type | Description |
|---|---|---|
| client_id | string | Only projects of this contact or company. |
| include_archived | boolean | Include archived projects. Default: false. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/list_projects \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("suitedash", "list_projects") const result = await cotlet.call('suitedash', 'list_projects'); cotlet call suitedash list_projects Example response
{
"projects": [
{
"project_id": "p_2201",
"name": "Website Redesign",
"client": "Acme Studio",
"status": "In progress",
"leader": "you@yourcompany.example",
"start_date": "2026-10-12",
"completion_date": "2026-12-01"
}
]
} List tasks
readPOST https://cotlet.dev/api/v1/suitedash/list_tasks
Lists tasks across your account, or in one project. Set mine_only to see your My Tasks list. Completed tasks are left out unless you ask.
Parameters
| Name | Type | Description |
|---|---|---|
| project_id | string | Only tasks in this project. |
| mine_only | boolean | Only tasks assigned to you (My Tasks). Default: false. |
| include_completed | boolean | Include completed tasks. Default: false. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/list_tasks \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("suitedash", "list_tasks") const result = await cotlet.call('suitedash', 'list_tasks'); cotlet call suitedash list_tasks Example response
{
"tasks": [
{
"task_id": "t_8841",
"title": "Kickoff call",
"project": "Website Redesign",
"assigned_to": "you@yourcompany.example",
"due_date": "2026-10-14",
"priority": "Normal",
"status": "Open"
}
]
} List invoices
readPOST https://cotlet.dev/api/v1/suitedash/list_invoices
Lists invoices from Office, newest first. Filter by status, client or due date to find what is overdue. Total and amount paid are in the invoice currency, so a partial payment shows what is still owed.
Parameters
| Name | Type | Description |
|---|---|---|
| status | enum | draft, open, partially_paid or paid. Default: open. |
| client_id | string | Only invoices of this client. |
| due_before | date | Only invoices due before this date. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/list_invoices \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("suitedash", "list_invoices") const result = await cotlet.call('suitedash', 'list_invoices'); cotlet call suitedash list_invoices Example response
{
"invoices": [
{
"invoice_id": "58213",
"invoice_number": "1042",
"client": "Acme Studio",
"title": "Website design, October",
"total": "900.00",
"paid": "0.00",
"currency": "USD",
"due_date": "2026-10-10",
"status": "open"
}
]
} Get invoice
readPOST https://cotlet.dev/api/v1/suitedash/get_invoice
Returns one invoice with its line items, payments recorded so far and the payment link your client uses. Read it before record_payment to check what is still owed.
Parameters
| Name | Type | Description |
|---|---|---|
| invoice_id required | string | Invoice ID from list_invoices. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/get_invoice \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"invoice_id":"invoice_8c41d2"}' result = client.call("suitedash", "get_invoice", {"invoice_id":"invoice_8c41d2"}) const result = await cotlet.call('suitedash', 'get_invoice', {"invoice_id":"invoice_8c41d2"}); cotlet call suitedash get_invoice --data '{"invoice_id":"invoice_8c41d2"}' Example response
{
"invoice_id": "58213",
"invoice_number": "1042",
"status": "open",
"title": "Website design, October",
"items": [
{
"item": "Design hour",
"quantity": 10,
"rate": "90.00",
"amount": "900.00"
}
],
"total": "900.00",
"paid": "0.00",
"payments": [],
"currency": "USD",
"due_date": "2026-10-24",
"payment_link": "https://yourname.suitedash.com/pay/invoice/58213"
} List message threads
readPOST https://cotlet.dev/api/v1/suitedash/list_message_threads
Lists Secure Messaging threads in a folder, most recent first, with the last message and an unread flag. The folder is Inbox unless you name another. Use thread_id to reply with send_message.
Parameters
| Name | Type | Description |
|---|---|---|
| folder | string | Folder name. Default: Inbox. |
| unread_only | boolean | Only threads with unread messages. |
| limit | integer | 1 to 50. Default: 20. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/list_message_threads \
-H "Authorization: Bearer $COTLET_API_KEY" result = client.call("suitedash", "list_message_threads") const result = await cotlet.call('suitedash', 'list_message_threads'); cotlet call suitedash list_message_threads Example response
{
"threads": [
{
"thread_id": "th_3a91",
"subject": "Deadline for the logo files",
"participants": [
"Ana Lopez"
],
"last_message": "Can we move the deadline to Friday?",
"unread": true,
"updated_at": "2026-10-09T15:40:00Z"
}
]
} Create contact
writePOST https://cotlet.dev/api/v1/suitedash/create_contact
Adds one contact to your CRM and links it to a company, creating the company if it does not exist. No portal invitation or email goes out, and one edit in SuiteDash undoes it, so this tool runs without asking.
Parameters
| Name | Type | Description |
|---|---|---|
| first_name required | string | First name. |
| last_name required | string | Last name. |
| email required | string | Email address. |
| role required | enum | lead, prospect or client. |
| company_name | string | Company to link, created if it does not exist. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/create_contact \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"first_name":"first name","last_name":"last name","email":"jane@example.com","role":"lead"}' result = client.call("suitedash", "create_contact", {"first_name":"first name","last_name":"last name","email":"jane@example.com","role":"lead"}) const result = await cotlet.call('suitedash', 'create_contact', {"first_name":"first name","last_name":"last name","email":"jane@example.com","role":"lead"}); cotlet call suitedash create_contact --data '{"first_name":"first name","last_name":"last name","email":"jane@example.com","role":"lead"}' Example response
{
"contact_id": "c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71",
"name": "Jane Doe",
"role": "client",
"company": "Doe Studio",
"status": "created"
} Create project
writePOST https://cotlet.dev/api/v1/suitedash/create_project
Creates a project for one client. With task_template, the project gets that template's tasks and phases. Nothing is sent to the client, and the project can be archived afterwards, so this tool runs without asking.
Parameters
| Name | Type | Description |
|---|---|---|
| name required | string | Project Name. |
| client_id required | string | Client UID from find_contact. |
| task_template | string | Task Template name; adds its tasks and phases. |
| start_date | date | Project Start Date. |
| completion_date | date | Estimated Completion Date. |
| estimated_value | string | Estimated value, e.g. "2500 USD". |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/create_project \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Jane Doe","client_id":"client_8c41d2"}' result = client.call("suitedash", "create_project", {"name":"Jane Doe","client_id":"client_8c41d2"}) const result = await cotlet.call('suitedash', 'create_project', {"name":"Jane Doe","client_id":"client_8c41d2"}); cotlet call suitedash create_project --data '{"name":"Jane Doe","client_id":"client_8c41d2"}' Example response
{
"project_id": "p_2201",
"name": "Website Redesign",
"client_id": "c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71",
"status": "created",
"start_date": "2026-10-12",
"completion_date": "2026-12-01"
} Add task
writePOST https://cotlet.dev/api/v1/suitedash/add_task
Adds a task to a project, or a standalone task when project_id is empty. It is assigned to you unless you give a staff email. Priority uses the names in your account. Runs without asking: the task reaches only your team and complete_task closes it.
Parameters
| Name | Type | Description |
|---|---|---|
| title required | string | Task title. |
| project_id | string | Project from list_projects. Empty: standalone task. |
| assigned_to | string | Staff email. Default: you. |
| due_date | date | Due Date. |
| priority | string | Priority as named in your account. Default: Normal. |
| description | string | Task description. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/add_task \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"title"}' result = client.call("suitedash", "add_task", {"title":"title"}) const result = await cotlet.call('suitedash', 'add_task', {"title":"title"}); cotlet call suitedash add_task --data '{"title":"title"}' Example response
{
"task_id": "t_8841",
"title": "Kickoff call",
"project_id": "p_2201",
"assigned_to": "you@yourcompany.example",
"due_date": "2026-10-14",
"status": "created"
} Complete task
writePOST https://cotlet.dev/api/v1/suitedash/complete_task
Marks one task as Completed. It runs without asking, because it reaches no client and one edit in SuiteDash reopens the task.
Parameters
| Name | Type | Description |
|---|---|---|
| task_id required | string | Task ID from list_tasks. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/complete_task \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"task_id":"task_8c41d2"}' result = client.call("suitedash", "complete_task", {"task_id":"task_8c41d2"}) const result = await cotlet.call('suitedash', 'complete_task', {"task_id":"task_8c41d2"}); cotlet call suitedash complete_task --data '{"task_id":"task_8c41d2"}' Example response
{
"task_id": "t_8841",
"status": "completed"
} POST https://cotlet.dev/api/v1/suitedash/create_invoice
Creates an invoice for one client from items set up in Office, with a due date. The total is the sum of quantity times rate. With status draft nothing is sent. With status open the client can pay it, and notify_client sends the New Invoice notification. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| client_id required | string | Client UID from find_contact. |
| title required | string | Title visible to the client. |
| items required | object | List of { item, quantity, rate }. item is an Item from Office settings. |
| due_date required | date | Due Date. |
| status | enum | draft or open. Default: draft. |
| notify_client | boolean | Send the New Invoice notification when open. Default: true. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/create_invoice \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"client_id":"c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71","title":"Website design, October","items":[{"item":"Design hour","quantity":10,"rate":90}],"due_date":"2026-10-24","status":"open","notify_client":true}' result = client.call("suitedash", "create_invoice", {"client_id":"c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71","title":"Website design, October","items":[{"item":"Design hour","quantity":10,"rate":90}],"due_date":"2026-10-24","status":"open","notify_client":True}) const result = await cotlet.call('suitedash', 'create_invoice', {"client_id":"c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71","title":"Website design, October","items":[{"item":"Design hour","quantity":10,"rate":90}],"due_date":"2026-10-24","status":"open","notify_client":true}); cotlet call suitedash create_invoice --data '{"client_id":"c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71","title":"Website design, October","items":[{"item":"Design hour","quantity":10,"rate":90}],"due_date":"2026-10-24","status":"open","notify_client":true}' Example response
{
"invoice_id": "58213",
"invoice_number": "1042",
"status": "open",
"total": "900.00",
"currency": "USD",
"due_date": "2026-10-24",
"payment_link": "https://yourname.suitedash.com/pay/invoice/58213"
} POST https://cotlet.dev/api/v1/suitedash/record_payment
Records a manual payment on one invoice, with a Payment Type from your account and an optional note. A partial amount leaves the invoice partially paid. send_confirmation emails the standard payment confirmation to the client. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| invoice_id required | string | Invoice ID from list_invoices. |
| amount required | string | Amount paid, e.g. "900.00". |
| payment_type required | string | Payment Type as named in your account, e.g. Bank Transfer. |
| note | string | Payment note. |
| send_confirmation | boolean | Email the payment confirmation. Default: false. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/record_payment \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"invoice_id":"58213","amount":"900.00","payment_type":"Bank Transfer","note":"Wire ref INV1042, received 12 Oct","send_confirmation":true}' result = client.call("suitedash", "record_payment", {"invoice_id":"58213","amount":"900.00","payment_type":"Bank Transfer","note":"Wire ref INV1042, received 12 Oct","send_confirmation":True}) const result = await cotlet.call('suitedash', 'record_payment', {"invoice_id":"58213","amount":"900.00","payment_type":"Bank Transfer","note":"Wire ref INV1042, received 12 Oct","send_confirmation":true}); cotlet call suitedash record_payment --data '{"invoice_id":"58213","amount":"900.00","payment_type":"Bank Transfer","note":"Wire ref INV1042, received 12 Oct","send_confirmation":true}' Example response
{
"invoice_id": "58213",
"payment_id": "pay_7710",
"amount": "900.00",
"payment_type": "Bank Transfer",
"invoice_status": "paid",
"confirmation_sent": true
} POST https://cotlet.dev/api/v1/suitedash/send_message
Sends a Secure Messaging message: a reply when thread_id is set, otherwise a new thread to the contacts or staff in to, with a subject. Messages go out under your name. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| to | string[] | Contact UIDs or staff emails. Required for a new thread. |
| thread_id | string | Reply in this thread from list_message_threads. |
| subject | string | Subject of a new thread. |
| body required | string | Message text. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/send_message \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"thread_id":"th_3a91","body":"Hi Ana, the final logo files are scheduled for Friday 16 Oct. You will find them in your portal."}' result = client.call("suitedash", "send_message", {"thread_id":"th_3a91","body":"Hi Ana, the final logo files are scheduled for Friday 16 Oct. You will find them in your portal."}) const result = await cotlet.call('suitedash', 'send_message', {"thread_id":"th_3a91","body":"Hi Ana, the final logo files are scheduled for Friday 16 Oct. You will find them in your portal."}); cotlet call suitedash send_message --data '{"thread_id":"th_3a91","body":"Hi Ana, the final logo files are scheduled for Friday 16 Oct. You will find them in your portal."}' Example response
{
"thread_id": "th_3a91",
"message_id": "msg_5502",
"status": "sent",
"sent_at": "2026-10-11T09:05:00+02:00"
} POST https://cotlet.dev/api/v1/suitedash/share_file
Uploads one file from a URL to the dedicated Sharing Folder of one client. With notify, the client is told about the new file. By default you confirm each call; you can switch that off for this tool.
Parameters
| Name | Type | Description |
|---|---|---|
| contact_id required | string | Contact UID from find_contact. |
| file_url required | string | Public or signed URL of the file to upload. |
| notify | boolean | Notify the contact about the new file. Default: true. |
Request
curl -X POST https://cotlet.dev/api/v1/suitedash/share_file \
-H "Authorization: Bearer $COTLET_API_KEY" \
-H "Content-Type: application/json" \
-d '{"contact_id":"contact_8c41d2","file_url":"https://example.com"}' result = client.call("suitedash", "share_file", {"contact_id":"contact_8c41d2","file_url":"https://example.com"}) const result = await cotlet.call('suitedash', 'share_file', {"contact_id":"contact_8c41d2","file_url":"https://example.com"}); cotlet call suitedash share_file --data '{"contact_id":"contact_8c41d2","file_url":"https://example.com"}' Example response
{
"contact_id": "c7f2a9e1-4b3d-4e8a-9f10-2d6b5a8c3e71",
"file_name": "acme-logo-final.zip",
"status": "shared",
"notified": true
}