Build on tarsiflow with a simple REST API
Read and update clients, leads, projects and tasks, and pull invoices and proposals into your reports. Create a token in your workspace and make your first request in a minute.
- REST and JSON
- Personal tokens
- Read or write access
Getting started
-
1. Create a token
In the app, open your account menu and choose API tokens. Pick read only or read and write access.
-
2. Call the API
Send requests to the base URL below with your token in the Authorization header.
-
3. Keep it safe
A token acts as you inside one workspace. Revoke it any time from the same page.
Base URL
https://tarsiflow.com/api/v1
Authentication
Every request needs a bearer token. Tokens with read access can call every GET endpoint. Tokens with write access can also create and update records.
curl https://tarsiflow.com/api/v1/me \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Accept: application/json"
Conventions
- Requests and responses are JSON. Send Content-Type: application/json when you post data.
- Money is always an integer number of cents with a separate three letter currency code, so 125000 with USD is 1,250.00 dollars.
- Dates use YYYY-MM-DD. Timestamps use ISO 8601 in UTC.
- Lists are paginated. Use page and per_page (up to 100). Each response includes links and meta with the totals.
- Updates use PATCH and only change the fields you send.
Errors and limits
| Status | Meaning |
|---|---|
| 401 | Missing, expired or revoked token. |
| 403 | The token is read only, or you no longer belong to its workspace. |
| 404 | The record does not exist in this workspace. |
| 422 | Validation failed. The errors object lists each field and what to fix. |
| 429 | Too many requests. The limit is 120 requests a minute per token. |
{
"message": "The name field is required.",
"errors": {
"name": [
"The name field is required."
]
}
}
Account
Who the token belongs to, the workspace it works in, its team members and the pipeline stages.
-
GET
/meThe token owner, workspace and token abilities. -
GET
/membersPeople in the workspace, for assignee and owner ids. -
GET
/lead-stagesPipeline stages, for lead_stage_id.
Clients
Every client in the workspace with its primary contact.
-
GET
/clientsList clients. Filters: search, status, tag. -
POST
/clientsCreate a client. -
GET
/clients/{id}Get one client. -
PATCH
/clients/{id}Update a client. Send only the fields you change.
Fields you can send
- name
- string
- Required when creating.
- status
- string
- active, inactive, archived
- email, phone, website, address
- string
- Optional contact details.
- currency
- string
- Three letter code, such as USD. Defaults to the workspace currency.
- tags
- array
- List of short labels.
Example
curl -X POST https://tarsiflow.com/api/v1/clients \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"name":"Brightline Dental","email":"[email protected]","tags":["healthcare"]}'
{
"data": {
"id": 42,
"name": "Brightline Dental",
"status": "active",
"email": "[email protected]",
"currency": "USD",
"tags": [
"healthcare"
],
"primary_contact": null
}
}
Leads
Opportunities on your pipeline. Values are in cents.
-
GET
/leadsList leads. Filters: stage_id, search. -
POST
/leadsCreate a lead. It lands in the first open stage unless you pass lead_stage_id. -
GET
/leads/{id}Get one lead. -
PATCH
/leads/{id}Update a lead, including moving it to another stage.
Fields you can send
- name
- string
- Required when creating. The project or person, such as Website redesign.
- company, email, phone, source, notes
- string
- Optional details.
- value_cents
- integer
- Estimated value in cents. 250000 means 2,500.00.
- expected_close_date
- date
- YYYY-MM-DD
- lead_stage_id, owner_id
- integer
- Ids from /lead-stages and /members.
Projects
Client projects. New projects get a first task list automatically.
-
GET
/projectsList projects. Filters: client_id, status. -
POST
/projectsCreate a project for a client. -
GET
/projects/{id}Get one project with its task lists. -
PATCH
/projects/{id}Update a project.
Fields you can send
- client_id, name
- required
- The client it belongs to and its name.
- status
- string
- planning, active, on_hold, completed, cancelled
- start_date, due_date
- date
- YYYY-MM-DD
- budget_cents
- integer
- Budget in cents.
Tasks
Tasks inside projects, or on their own. Assigning a task notifies the person.
-
GET
/tasksList tasks. Filters: project_id, assignee_id, status, due_before. -
POST
/tasksCreate a task. -
GET
/tasks/{id}Get one task. -
PATCH
/tasks/{id}Update a task. Setting status to done records the completion time.
Fields you can send
- title
- string
- Required when creating.
- project_id, task_list_id
- integer
- Optional. Without a list, the task goes into the project's first list.
- assignee_id
- integer
- An id from /members.
- status
- string
- todo, in_progress, review, done
- priority
- string
- low, medium, high
- due_date
- date
- YYYY-MM-DD
Example
curl -X PATCH https://tarsiflow.com/api/v1/tasks/318 \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"status":"done"}'
{
"data": {
"id": 318,
"title": "Homepage wireframes",
"status": "done",
"priority": "high",
"completed_at": "2026-10-26T14:05:11+00:00"
}
}
Invoices
Read only. Includes line items and payments on the single invoice endpoint.
-
GET
/invoicesList invoices. Filters: status, client_id. -
GET
/invoices/{id}Get one invoice with items, payments and the balance due.
Proposals
Read only. Includes line items on the single proposal endpoint.
-
GET
/proposalsList proposals. Filters: status, client_id. -
GET
/proposals/{id}Get one proposal with its line items.