Push deals, notes, and custom fields from forms, marketing tools, or your own services. Every request is a POST with a workspace Bearer token.
Tokens are issued per workspace (by a super admin in the admin panel). The token is bound to that workspace — you must call routes under the same workspace slug.
curl skeleton
curl -X POST "https://www.tigrasales.com/api/workspaces/{workspace_slug}/deals" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ ... }'
{workspace_slug} in the URL.401.401 (not 404) for safety.There are no GET list endpoints yet. Create or upsert resources with POST only.
Send application/json. You may wrap fields in a top-level data object if you prefer.
Successful responses return the resource under data (Laravel API Resource).
Every path includes /workspaces/{slug}/. IDs (pipeline, stage, deal) must belong to that workspace.
data wrapper{
"title": "New website",
"owner_email": "rep@company.com"
}
{
"data": {
"title": "New website",
"owner_email": "rep@company.com"
}
}
| Method | Path | Purpose |
|---|---|---|
| POST | /workspaces/{slug}/deals | Create a deal (+ optional person, org, note) |
| POST | /workspaces/{slug}/deals/{deal}/notes | Add a note to an existing deal |
| POST | /workspaces/{slug}/custom-fields/upsert | Create or update a custom field by key |
https://www.tigrasales.com/api/workspaces/{workspace_slug}/deals
Creates a deal in the workspace. Optionally creates a linked person and organization in the same request, and attaches an initial note.
| Field | Type | Required | Notes |
|---|---|---|---|
| title | string | yes | Max 255 chars |
| owner_email | no | Active workspace member email. If omitted or no match, the deal is assigned to the workspace’s first active user. A failed explicit email also attaches a failure note. | |
| pipeline_id | integer | no | Defaults to the workspace’s first pipeline (by order). |
| stage_id | integer | no | Must belong to the pipeline. Defaults to the pipeline’s first stage. |
| value | number | no | ≥ 0. Default 0. |
| currency | string | no | ISO 4217, 3 uppercase letters. Default USD. |
| expected_close_date | date | no | Any parseable date string. |
| origin | string | no | Source system name (e.g. website). |
| origin_id | string | no | External ID in the source system. |
| gcl | string | no | Google click / campaign id if you track it. |
| acv / arr / mrr | number | no | Optional revenue metrics, ≥ 0. |
| custom_fields | object | no* | Keys must be existing non-archived workspace custom field keys. Required fields must be present. Types: text, number, date, boolean, select (option value). |
| note | string | no | Creates a note on the new deal when provided. |
| person | object | no | Creates a new person. See nested fields below. |
| organization | object | no | Creates a new organization. Linked to the person when both are sent. |
| Field | Type | Required | Notes |
|---|---|---|---|
| person.name | string | yes* | Required when person is present |
| person.job_title | string | no | |
| person.birthday | date | no | |
| person.notes | string | no | |
| person.phones[] | array | no | label: work | mobile | home | other; value; optional primary bool |
| person.emails[] | array | no | label: work | home | other; value email; optional primary |
| Field | Type | Required | Notes |
|---|---|---|---|
| organization.name | string | yes* | Required when organization is present |
| organization.website | string | no | Invalid URLs are dropped and a failure note is added on the deal |
| organization.address | string | no | |
| organization.linkedin | string | no | |
| organization.industry | string | no | |
| organization.employee_count | integer | no | ≥ 0 |
curl -X POST "https://www.tigrasales.com/api/workspaces/acme/deals" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"title": "Website redesign",
"owner_email": "rep@acme.com",
"value": 12000,
"currency": "EUR",
"expected_close_date": "2026-09-30",
"origin": "website_form",
"origin_id": "lead-4821",
"custom_fields": {
"type_of_job": "website",
"budget": 15000
},
"note": "Inbound from pricing page",
"person": {
"name": "Maria Kallas",
"job_title": "Marketing Lead",
"emails": [
{ "label": "work", "value": "maria@example.com", "primary": true }
],
"phones": [
{ "label": "mobile", "value": "+30 690 000 0000", "primary": true }
]
},
"organization": {
"name": "Example Ltd",
"website": "https://example.com",
"industry": "Retail"
}
}'
{
"data": {
"id": 42,
"workspace_id": 1,
"title": "Website redesign",
"value": "12000.00",
"currency": "EUR",
"expected_close_date": "2026-09-30",
"origin": "website_form",
"origin_id": "lead-4821",
"custom_fields": { "type_of_job": "website", "budget": 15000 },
"owner": { "id": 3, "name": "…", "email": "rep@acme.com" },
"person": { "id": 10, "name": "Maria Kallas", "…" },
"organization": { "id": 7, "name": "Example Ltd", "…" },
"pipeline": { "id": 1, "name": "Sales" },
"stage": { "id": 1, "name": "Lead in", "pipeline_id": 1 },
"created_at": "2026-07-21T10:00:00.000000Z",
"updated_at": "2026-07-21T10:00:00.000000Z"
}
}
https://www.tigrasales.com/api/workspaces/{workspace_slug}/deals/{deal_id}/notes
Attaches a free-text note to an existing deal. The deal must belong to the same workspace as the token.
| Field | Type | Required | Notes |
|---|---|---|---|
| content | string | yes | Non-empty note body |
curl -X POST "https://www.tigrasales.com/api/workspaces/acme/deals/42/notes" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ "content": "Followed up by phone — decision next week." }'
{
"data": {
"id": 91,
"workspace_id": 1,
"deal_id": 42,
"content": "Followed up by phone — decision next week.",
"created_at": "2026-07-21T11:00:00.000000Z",
"updated_at": "2026-07-21T11:00:00.000000Z"
}
}
https://www.tigrasales.com/api/workspaces/{workspace_slug}/custom-fields/upsert
Creates a custom field when key is new,
or updates the existing field when the key already exists in the workspace.
Type cannot change on update. Options already used on deals cannot be removed.
| Field | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | Display label |
| key | string | yes | Stable machine key: ^[a-z][a-z0-9_]*$, unique per workspace |
| type | enum | yes | text | number | date | select | boolean. Immutable on update. |
| width | enum | no | full (default) or half |
| required | boolean | no | Default false. When true, deal create must include the field. |
| allow_new_options | boolean | no | Select fields only |
| options | array | select* | Required when creating a select field. Items: { "label", "value" }. Values must be unique. |
curl -X POST "https://www.tigrasales.com/api/workspaces/acme/custom-fields/upsert" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"name": "Type of job",
"key": "type_of_job",
"type": "select",
"required": true,
"width": "full",
"options": [
{ "label": "Website", "value": "website" },
{ "label": "SEO", "value": "seo" }
]
}'
201 on create, 200 on update.
Response data includes id, key, type, options, required, width, timestamps.
| Status | When |
|---|---|
| 200 / 201 | Success (update / create) |
| 401 | Missing/invalid token, wrong workspace, or unknown workspace slug |
| 422 | Validation failed — check errors object |
401 body
{
"message": "Unauthenticated."
}
422 body
{
"message": "The title field is required.",
"errors": {
"title": ["The title field is required."]
}
}
Workspace API tokens are managed by super admins in the admin panel. Sign in to the app, then ask your admin to issue a named token for your integration.