Introduction

Programmatically manage your CRM via the SalesKey REST API.

The SalesKey API is served on your own account's domain. Replace {your-subdomain} in the examples below with your own subdomain:

https://{your-subdomain}.saleskey.ai/api/v1

You can copy your exact base URL from Company Settings → API Keys.

Authentication

The API uses account-scoped, permission-scoped, time-limited API keys. Generate one under Company Settings → API Keys. The plaintext key is shown once at creation and it can't be retrieved again.

Send it as a Bearer token on every request:

Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx

The API is available on the Professional plan only.

Error responses

All errors use a consistent envelope:

{ "error": { "code": "insufficient_permissions", "message": "..." } }
HTTP code Meaning
401 invalid_api_key Missing, malformed, unknown, or revoked API key.
401 api_key_expired The key is past its expiry date.
403 plan_upgrade_required The account is not on the Professional plan.
403 insufficient_permissions The key lacks the required resource/action grant.
404 not_found The requested resource does not exist.
405 method_not_allowed The HTTP method is not supported for this endpoint.
422 validation_failed The request body failed validation (see error.details).
429 rate_limit_exceeded More than 60 requests per minute for this key.
500 server_error An unexpected error occurred on our side.

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Generate an API key under Company Settings → API Keys. The plaintext key is shown only once at creation.

Leads

Programmatic access to your CRM Leads. All endpoints require a Bearer API key with the appropriate leads permission and a Professional-plan account.

List leads

GET
https://{your-subdomain}.saleskey.ai
/api/v1/leads
requires authentication

Returns a paginated list of leads, filterable by any combination of the params below. Filters accepting an array (param[]=) are OR'd together within the same param and AND'd with every other param. Any param not listed here - including its singular form like status or person - is silently ignored, not applied.

Custom fields (tenant-specific, configured under Settings > Fields) are also filterable by their slug, e.g. region=Asia does a partial match; append _gte/_lte to a numeric or date custom field for range filtering, e.g. budget_gte=1000. This suffix behavior only applies to custom fields, not the native params below.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

Page number.

Example:
1
per_page
integer

Results per page (default 25, max 200 - values above 200 are clamped).

Example:
25
all
boolean

When true, returns leads of every status - including archived and converted - and ignores status_id if also sent.

Example:
true
status_id
integer[]

Filter by status ID(s) (see GET /statuses).

Example:
[1,2]
archived
boolean

Include archived leads instead of excluding them (the default).

Example:
false
converted
boolean

Include converted leads instead of excluding them (the default).

Example:
false
person_id
integer[]

Filter by linked Person ID(s).

Example:
[9]
organization_id
integer[]

Filter by linked Organization ID(s).

Example:
[4]
owner_id
integer[]

Filter by owner user ID(s).

Example:
[1]
assignees
integer[]

Filter by assigned user ID(s).

Example:
[1]
followers
integer[]

Filter by following user ID(s).

Example:
[1]
source_channel_id
integer[]

Filter by Source Channel ID(s) (see GET /source-channels).

Example:
[1]
labels
integer[]

Filter by Label ID(s) (see GET /labels?type=lead).

Example:
[1]
created_by
integer[]

Filter by creator user ID(s).

Example:
[1]
title
string

Partial, case-insensitive match on the lead title.

Example:
Acme
currency
string[]

Filter by ISO 4217 currency code(s).

Example:
["USD"]
value_in_base_currency
integer

numeric[] [min] for a lower bound, or [min,max] for a range, on value converted to the account's base currency.

Example:
0
expected_close_date
string[]

[date] for an exact day, or [start,end] for a range (Y-m-d).

Example:
["2026-09-01"]
created_at
string[]

[date] for an exact day, or [start,end] for a range (Y-m-d).

Example:
["2026-01-01","2026-08-01"]
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/leads?page=1&per_page=25&all=1&status_id[]=1&status_id[]=2&archived=&converted=&person_id[]=9&organization_id[]=4&owner_id[]=1&assignees[]=1&followers[]=1&source_channel_id[]=1&labels[]=1&created_by[]=1&title=Acme&currency[]=USD&value_in_base_currency=0&expected_close_date[]=2026-09-01&created_at[]=2026-01-01&created_at[]=2026-08-01" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 42,
            "title": "Acme Corp renewal",
            "value": "5000.00",
            "currency": "USD",
            "value_in_base_currency": "5000.00",
            "expected_close_date": "2026-09-01",
            "status": {
                "id": 1,
                "name": "New",
                "slug": "lead-new"
            },
            "person": {
                "id": 9,
                "name": "John Doe"
            },
            "organization": {
                "id": 4,
                "name": "Acme Corp"
            },
            "owner": {
                "id": 1,
                "name": "Jane Owner"
            },
            "source_channel": "Referral",
            "source_channel_id": 1,
            "exchange_rate": null,
            "labels": [
                {
                    "id": 1,
                    "name": "Hot"
                }
            ],
            "assignees": [
                {
                    "id": 1,
                    "name": "Jane Owner"
                }
            ],
            "followers": [
                {
                    "id": 1,
                    "name": "Jane Owner"
                }
            ],
            "creator": {
                "id": 1,
                "name": "Jane Owner"
            },
            "custom_fields": {
                "region": "Asia"
            },
            "created_at": "2026-08-06T12:11:37+00:00",
            "updated_at": "2026-08-11T06:18:26+00:00"
        }
    ],
    "links": {
        "first": "https://{your-subdomain}.saleskey.ai/api/v1/leads?per_page=25&page=1",
        "last": "https://{your-subdomain}.saleskey.ai/api/v1/leads?per_page=25&page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 25,
        "to": 1,
        "total": 1,
        "path": "https://{your-subdomain}.saleskey.ai/api/v1/leads",
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://{your-subdomain}.saleskey.ai/api/v1/leads?per_page=25&page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "page": null,
                "active": false
            }
        ]
    }
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'leads'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a lead

GET
https://{your-subdomain}.saleskey.ai
/api/v1/leads/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The lead ID.

Example:
42
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/leads/42" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 42,
        "title": "Acme Corp renewal",
        "value": "5000.00",
        "currency": "USD",
        "value_in_base_currency": "5000.00",
        "expected_close_date": "2026-09-01",
        "status": {
            "id": 1,
            "name": "New",
            "slug": "lead-new"
        },
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": "Referral",
        "source_channel_id": 1,
        "exchange_rate": null,
        "labels": [
            {
                "id": 1,
                "name": "Hot"
            }
        ],
        "assignees": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "followers": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": {
            "region": "Asia"
        },
        "created_at": "2026-08-06T12:11:37+00:00",
        "updated_at": "2026-08-11T06:18:26+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Lead not found."
    }
}

Create a lead

POST
https://{your-subdomain}.saleskey.ai
/api/v1/leads
requires authentication

title is the only required field. Every other field - person, organization, owner, status, source, custom fields - is optional and will be left empty or defaulted (owner defaults to the API key's creator, status defaults to the account's default lead status) if omitted.

person and organization are plain names, not IDs. Each is matched against existing records by an exact, case-insensitive name match - if found, the lead is linked to that existing record; if not found, a new record is created with just that name (matching the CRM's built-in "select or create" behavior). Any other field not listed below is stored as a custom field.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://{your-subdomain}.saleskey.ai/api/v1/leads" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"Acme Corp renewal\",
    \"value\": 5000,
    \"currency\": \"USD\",
    \"exchange_rate\": 1,
    \"expected_close_date\": \"2026-09-01\",
    \"person\": \"John Doe\",
    \"organization\": \"Acme Corp\",
    \"status_id\": 1,
    \"source_channel_id\": 1,
    \"source_channel\": \"Referral\",
    \"owner_id\": 1,
    \"labels\": [
        1,
        2
    ],
    \"assignees\": [
        1
    ],
    \"followers\": [
        1
    ]
}"
Example response:
{
    "data": {
        "id": 43,
        "title": "Acme Corp renewal",
        "value": "5000.00",
        "currency": "USD",
        "value_in_base_currency": "5000.00",
        "expected_close_date": "2026-09-01",
        "status": {
            "id": 1,
            "name": "New",
            "slug": "lead-new"
        },
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": null,
        "source_channel_id": null,
        "exchange_rate": null,
        "labels": [],
        "assignees": [],
        "followers": [],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": null,
        "created_at": "2026-08-06T12:11:37+00:00",
        "updated_at": "2026-08-06T12:11:37+00:00"
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "title": [
                "The title field is required."
            ]
        }
    }
}

Update a lead

PATCH
https://{your-subdomain}.saleskey.ai
/api/v1/leads/{id}
requires authentication

Partial update - send only the fields you want to change.

person and organization follow the same match-or-create rule as create: exact, case-insensitive name match against an existing record, or a new record is created if no match exists.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The lead ID.

Example:
42

Body Parameters

Example request:
curl --request PATCH \
    "https://{your-subdomain}.saleskey.ai/api/v1/leads/42" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"Acme Corp renewal (updated)\",
    \"value\": 7500,
    \"currency\": \"USD\",
    \"exchange_rate\": 1,
    \"expected_close_date\": \"2026-09-01\",
    \"person\": \"John Doe\",
    \"organization\": \"Acme Corp\",
    \"status_id\": 1,
    \"source_channel_id\": 1,
    \"source_channel\": \"Referral\",
    \"owner_id\": 1,
    \"labels\": [
        1,
        2
    ],
    \"assignees\": [
        1
    ],
    \"followers\": [
        1
    ]
}"
Example response:
{
    "data": {
        "id": 42,
        "title": "Acme Corp renewal (updated)",
        "value": "7500.00",
        "currency": "USD",
        "value_in_base_currency": "7500.00",
        "expected_close_date": "2026-09-01",
        "status": {
            "id": 1,
            "name": "New",
            "slug": "lead-new"
        },
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": "Referral",
        "source_channel_id": 1,
        "exchange_rate": null,
        "labels": [
            {
                "id": 1,
                "name": "Hot"
            }
        ],
        "assignees": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "followers": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": {
            "region": "Asia"
        },
        "created_at": "2026-08-06T12:11:37+00:00",
        "updated_at": "2026-08-11T06:18:26+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Lead not found."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "title": [
                "The title field must be a string."
            ]
        }
    }
}

Delete a lead

DELETE
https://{your-subdomain}.saleskey.ai
/api/v1/leads/{id}
requires authentication

Soft-deletes the lead, matching the internal delete behavior.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The lead ID.

Example:
42
Example request:
curl --request DELETE \
    "https://{your-subdomain}.saleskey.ai/api/v1/leads/42" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Deals

Programmatic access to your CRM Deals. All endpoints require a Bearer API key with the appropriate deals permission and a Professional-plan account.

List deals

GET
https://{your-subdomain}.saleskey.ai
/api/v1/deals
requires authentication

Returns a paginated list of deals, filterable by any combination of the params below. Filters accepting an array (param[]=) are OR'd together within the same param and AND'd with every other param. Any param not listed here - including its singular form like status or person - is silently ignored, not applied.

Custom fields (tenant-specific, configured under Settings > Fields) are also filterable by their slug, e.g. country=Qatar does a partial match; append _gte/_lte to a numeric or date custom field for range filtering, e.g. budget_gte=1000. This suffix behavior only applies to custom fields, not the native params below.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

Page number.

Example:
1
per_page
integer

Results per page (default 25, max 200 - values above 200 are clamped).

Example:
25
all
boolean

When true, returns deals of every status - including archived and won - and ignores status_id if also sent.

Example:
true
status_id
integer[]

Filter by status ID(s) (see GET /statuses).

Example:
[15]
archived
boolean

Include archived (and won) deals instead of excluding them (the default).

Example:
false
pipeline
integer

Filter by Pipeline ID (see GET /pipelines).

Example:
1
person_id
integer[]

Filter by linked Person ID(s).

Example:
[9]
organization_id
integer[]

Filter by linked Organization ID(s).

Example:
[4]
owner_id
integer[]

Filter by owner user ID(s).

Example:
[1]
assignees
integer[]

Filter by assigned user ID(s).

Example:
[1]
followers
integer[]

Filter by following user ID(s).

Example:
[1]
source_channel_id
integer[]

Filter by Source Channel ID(s) (see GET /source-channels).

Example:
[1]
labels
integer[]

Filter by Label ID(s) (see GET /labels?type=deal).

Example:
[1]
created_by
integer[]

Filter by creator user ID(s).

Example:
[1]
title
string

Partial, case-insensitive match on the deal title.

Example:
Acme
currency
string[]

Filter by ISO 4217 currency code(s).

Example:
["USD"]
value_in_base_currency
integer

numeric[] [min] for a lower bound, or [min,max] for a range, on value converted to the account's base currency.

Example:
0
expected_close_date
string[]

[date] for an exact day, or [start,end] for a range (Y-m-d).

Example:
["2026-09-01"]
created_at
string[]

[date] for an exact day, or [start,end] for a range (Y-m-d).

Example:
["2026-01-01","2026-08-01"]
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/deals?page=1&per_page=25&all=1&status_id[]=15&archived=&pipeline=1&person_id[]=9&organization_id[]=4&owner_id[]=1&assignees[]=1&followers[]=1&source_channel_id[]=1&labels[]=1&created_by[]=1&title=Acme&currency[]=USD&value_in_base_currency=0&expected_close_date[]=2026-09-01&created_at[]=2026-01-01&created_at[]=2026-08-01" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 7,
            "title": "Acme Corp expansion",
            "value": "12000.00",
            "currency": "USD",
            "value_in_base_currency": "12000.00",
            "expected_close_date": "2026-09-01",
            "status": {
                "id": 15,
                "name": "Open",
                "slug": "deal-open"
            },
            "pipeline": {
                "id": 1,
                "name": "Deal Flow"
            },
            "pipeline_stage": {
                "id": 1,
                "name": "Qualified"
            },
            "closed_reason": null,
            "closed_reason_note": null,
            "person": {
                "id": 9,
                "name": "John Doe"
            },
            "organization": {
                "id": 4,
                "name": "Acme Corp"
            },
            "owner": {
                "id": 1,
                "name": "Jane Owner"
            },
            "source_channel": "Referral",
            "source_channel_id": 1,
            "exchange_rate": null,
            "labels": [
                {
                    "id": 1,
                    "name": "Hot"
                }
            ],
            "assignees": [
                {
                    "id": 1,
                    "name": "Jane Owner"
                }
            ],
            "followers": [
                {
                    "id": 1,
                    "name": "Jane Owner"
                }
            ],
            "creator": {
                "id": 1,
                "name": "Jane Owner"
            },
            "custom_fields": {
                "country": "Qatar"
            },
            "created_at": "2026-08-06T11:42:43+00:00",
            "updated_at": "2026-08-06T11:43:16+00:00"
        }
    ],
    "links": {
        "first": "https://{your-subdomain}.saleskey.ai/api/v1/deals?per_page=25&page=1",
        "last": "https://{your-subdomain}.saleskey.ai/api/v1/deals?per_page=25&page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 25,
        "to": 1,
        "total": 1,
        "path": "https://{your-subdomain}.saleskey.ai/api/v1/deals",
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://{your-subdomain}.saleskey.ai/api/v1/deals?per_page=25&page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "page": null,
                "active": false
            }
        ]
    }
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'deals'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a deal

GET
https://{your-subdomain}.saleskey.ai
/api/v1/deals/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The deal ID.

Example:
7
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/deals/7" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 7,
        "title": "Acme Corp expansion",
        "value": "12000.00",
        "currency": "USD",
        "value_in_base_currency": "12000.00",
        "expected_close_date": "2026-09-01",
        "status": {
            "id": 15,
            "name": "Open",
            "slug": "deal-open"
        },
        "pipeline": {
            "id": 1,
            "name": "Deal Flow"
        },
        "pipeline_stage": {
            "id": 1,
            "name": "Qualified"
        },
        "closed_reason": null,
        "closed_reason_note": null,
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": "Referral",
        "source_channel_id": 1,
        "exchange_rate": null,
        "labels": [
            {
                "id": 1,
                "name": "Hot"
            }
        ],
        "assignees": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "followers": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": {
            "country": "Qatar"
        },
        "created_at": "2026-08-06T11:42:43+00:00",
        "updated_at": "2026-08-06T11:43:16+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Deal not found."
    }
}

Create a deal

POST
https://{your-subdomain}.saleskey.ai
/api/v1/deals
requires authentication

title is the only required field. Every other field is optional. pipeline_id and pipeline_stage_id default independently when omitted: a missing pipeline_id resolves to the tenant's default (first active) pipeline; a missing pipeline_stage_id resolves to the first stage of whichever pipeline was used (the one you passed, or the default) - so passing pipeline_id alone still picks that specific pipeline's first stage, not the tenant default's.

Pass lead_id to convert an existing Lead into this Deal - the source Lead is marked converted, and its linked emails are copied over, exactly as when converting a lead from the app itself.

person and organization are plain names, not IDs. Each is matched against existing records by an exact, case-insensitive name match. If found, the deal is linked to that existing record; if not found, a new record is created with just that name. Any other field not listed below is stored as a custom field.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://{your-subdomain}.saleskey.ai/api/v1/deals" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"Acme Corp expansion\",
    \"value\": 12000,
    \"currency\": \"USD\",
    \"exchange_rate\": 1,
    \"expected_close_date\": \"2026-09-01\",
    \"pipeline_id\": 1,
    \"pipeline_stage_id\": 3,
    \"lead_id\": 42,
    \"person\": \"John Doe\",
    \"organization\": \"Acme Corp\",
    \"status_id\": 1,
    \"source_channel_id\": 1,
    \"source_channel\": \"Referral\",
    \"owner_id\": 1,
    \"labels\": [
        1,
        2
    ],
    \"assignees\": [
        1
    ],
    \"followers\": [
        1
    ]
}"
Example response:
{
    "data": {
        "id": 8,
        "title": "Acme Corp expansion",
        "value": "12000.00",
        "currency": "USD",
        "value_in_base_currency": "12000.00",
        "expected_close_date": null,
        "status": {
            "id": 15,
            "name": "Open",
            "slug": "deal-open"
        },
        "pipeline": {
            "id": 1,
            "name": "Deal Flow"
        },
        "pipeline_stage": {
            "id": 1,
            "name": "Qualified"
        },
        "closed_reason": null,
        "closed_reason_note": null,
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": null,
        "source_channel_id": null,
        "exchange_rate": null,
        "labels": [],
        "assignees": [],
        "followers": [],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": null,
        "created_at": "2026-08-06T11:42:43+00:00",
        "updated_at": "2026-08-06T11:42:43+00:00"
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "title": [
                "The title field is required."
            ]
        }
    }
}

Update a deal

PATCH
https://{your-subdomain}.saleskey.ai
/api/v1/deals/{id}
requires authentication

Partial update - send only the fields you want to change. Pipeline stage cannot be changed here; use the dedicated stage endpoint below.

person and organization follow the same match-or-create rule as create: exact, case-insensitive name match against an existing record, or a new record is created if no match exists.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The deal ID.

Example:
7

Body Parameters

Example request:
curl --request PATCH \
    "https://{your-subdomain}.saleskey.ai/api/v1/deals/7" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"title\": \"Acme Corp expansion (updated)\",
    \"value\": 15000,
    \"currency\": \"USD\",
    \"exchange_rate\": 1,
    \"person\": \"John Doe\",
    \"organization\": \"Acme Corp\",
    \"status_id\": 1,
    \"source_channel_id\": 1,
    \"source_channel\": \"Referral\",
    \"owner_id\": 1,
    \"labels\": [
        1,
        2
    ],
    \"assignees\": [
        1
    ],
    \"followers\": [
        1
    ]
}"
Example response:
{
    "data": {
        "id": 7,
        "title": "Acme Corp expansion (updated)",
        "value": "15000.00",
        "currency": "USD",
        "value_in_base_currency": "15000.00",
        "expected_close_date": "2026-09-01",
        "status": {
            "id": 15,
            "name": "Open",
            "slug": "deal-open"
        },
        "pipeline": {
            "id": 1,
            "name": "Deal Flow"
        },
        "pipeline_stage": {
            "id": 1,
            "name": "Qualified"
        },
        "closed_reason": null,
        "closed_reason_note": null,
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": "Referral",
        "source_channel_id": 1,
        "exchange_rate": null,
        "labels": [
            {
                "id": 1,
                "name": "Hot"
            }
        ],
        "assignees": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "followers": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": {
            "country": "Qatar"
        },
        "created_at": "2026-08-06T11:42:43+00:00",
        "updated_at": "2026-08-11T06:30:44+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Deal not found."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "pipeline_stage_id": [
                "Stage cannot be changed here - use PATCH /deals/{id}/stage instead."
            ]
        }
    }
}

Change a deal's stage

PATCH
https://{your-subdomain}.saleskey.ai
/api/v1/deals/{id}/stage
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The deal ID.

Example:
7

Body Parameters

Example request:
curl --request PATCH \
    "https://{your-subdomain}.saleskey.ai/api/v1/deals/7/stage" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"pipeline_stage_id\": 3,
    \"pipeline_id\": 1
}"
Example response:
{
    "data": {
        "id": 7,
        "title": "Acme Corp expansion",
        "value": "12000.00",
        "currency": "USD",
        "value_in_base_currency": "12000.00",
        "expected_close_date": "2026-09-01",
        "status": {
            "id": 15,
            "name": "Open",
            "slug": "deal-open"
        },
        "pipeline": {
            "id": 1,
            "name": "Deal Flow"
        },
        "pipeline_stage": {
            "id": 2,
            "name": "Contact Made"
        },
        "closed_reason": null,
        "closed_reason_note": null,
        "person": {
            "id": 9,
            "name": "John Doe"
        },
        "organization": {
            "id": 4,
            "name": "Acme Corp"
        },
        "owner": {
            "id": 1,
            "name": "Jane Owner"
        },
        "source_channel": "Referral",
        "source_channel_id": 1,
        "exchange_rate": null,
        "labels": [
            {
                "id": 1,
                "name": "Hot"
            }
        ],
        "assignees": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "followers": [
            {
                "id": 1,
                "name": "Jane Owner"
            }
        ],
        "creator": {
            "id": 1,
            "name": "Jane Owner"
        },
        "custom_fields": {
            "country": "Qatar"
        },
        "created_at": "2026-08-06T11:42:43+00:00",
        "updated_at": "2026-08-11T06:31:00+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Deal not found."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "pipeline_stage_id": [
                "The selected pipeline stage id is invalid."
            ]
        }
    }
}

Delete a deal

DELETE
https://{your-subdomain}.saleskey.ai
/api/v1/deals/{id}
requires authentication

Soft-deletes the deal, matching the internal delete behavior.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The deal ID.

Example:
7
Example request:
curl --request DELETE \
    "https://{your-subdomain}.saleskey.ai/api/v1/deals/7" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

People

Programmatic access to your CRM People (contacts). All endpoints require a Bearer API key with the appropriate people permission and a Professional-plan account.

List people

GET
https://{your-subdomain}.saleskey.ai
/api/v1/people
requires authentication

Returns a paginated list of people. Supports page, per_page, and the same filters as the web app.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

Page number.

Example:
1
per_page
integer

Results per page (default 25, max 200 - values above 200 are clamped).

Example:
25
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/people?page=1&per_page=25" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 9,
            "name": "John Doe",
            "first_name": "John",
            "last_name": "Doe",
            "email": [
                {
                    "label": "Work",
                    "value": "john.doe@example.com"
                }
            ],
            "phone": [
                {
                    "label": "Mobile",
                    "value": "+17703505963"
                }
            ],
            "status": {
                "id": 9,
                "name": "Lead",
                "slug": "contact-lead"
            },
            "organizations": [
                {
                    "id": 4,
                    "name": "Acme Corp"
                }
            ],
            "custom_fields": {
                "region": "Asia"
            },
            "created_at": "2026-08-06T12:11:37+00:00",
            "updated_at": "2026-08-06T12:11:37+00:00"
        }
    ],
    "links": {
        "first": "https://{your-subdomain}.saleskey.ai/api/v1/people?per_page=25&page=1",
        "last": "https://{your-subdomain}.saleskey.ai/api/v1/people?per_page=25&page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 25,
        "to": 1,
        "total": 1,
        "path": "https://{your-subdomain}.saleskey.ai/api/v1/people",
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://{your-subdomain}.saleskey.ai/api/v1/people?per_page=25&page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "page": null,
                "active": false
            }
        ]
    }
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'people'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a person

GET
https://{your-subdomain}.saleskey.ai
/api/v1/people/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The person ID.

Example:
9
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/people/9" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 9,
        "name": "John Doe",
        "first_name": "John",
        "last_name": "Doe",
        "email": [
            {
                "label": "Work",
                "value": "john.doe@example.com"
            }
        ],
        "phone": [
            {
                "label": "Mobile",
                "value": "+17703505963"
            }
        ],
        "status": {
            "id": 9,
            "name": "Lead",
            "slug": "contact-lead"
        },
        "organizations": [
            {
                "id": 4,
                "name": "Acme Corp"
            }
        ],
        "custom_fields": {
            "region": "Asia"
        },
        "created_at": "2026-08-06T12:11:37+00:00",
        "updated_at": "2026-08-06T12:11:37+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Person not found."
    }
}

Create a person

POST
https://{your-subdomain}.saleskey.ai
/api/v1/people
requires authentication

name is the only required field. Every other field - email, phone, status, custom fields - is optional and will be left empty or defaulted (status defaults to the account's default contact status) if omitted.

Pass organization to attach a Person's Organization - a plain name, matched by exact, case-insensitive name against an existing Organization (attached if found), or created if no match exists. A Person's organization is a many-to-many link, not a single field.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://{your-subdomain}.saleskey.ai/api/v1/people" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Jane Doe\",
    \"organization\": \"Acme Corp\"
}"
Example response:
{
    "data": {
        "id": 9,
        "name": "Jane Doe",
        "first_name": "Jane",
        "last_name": "Doe",
        "email": null,
        "phone": null,
        "status": {
            "id": 9,
            "name": "Lead",
            "slug": "contact-lead"
        },
        "organizations": [],
        "custom_fields": null,
        "created_at": "2026-08-06T12:11:37+00:00",
        "updated_at": "2026-08-06T12:11:37+00:00"
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "name": [
                "The name field is required."
            ]
        }
    }
}

Update a person

PATCH
https://{your-subdomain}.saleskey.ai
/api/v1/people/{id}
requires authentication

Partial update - send only the fields you want to change. Unlike the internal app's edit form, organization can be sent alongside other fields in the same request; the organization link is replaced (not added to) when provided. It follows the same match-or-create rule as create: exact, case-insensitive name match against an existing Organization, or a new one is created if no match exists.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The person ID.

Example:
9

Body Parameters

Example request:
curl --request PATCH \
    "https://{your-subdomain}.saleskey.ai/api/v1/people/9" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Jane Doe (updated)\",
    \"organization\": \"Acme Corp\"
}"
Example response:
{
    "data": {
        "id": 9,
        "name": "Jane Doe (updated)",
        "first_name": "Jane",
        "last_name": "Doe (updated)",
        "email": null,
        "phone": null,
        "status": {
            "id": 9,
            "name": "Lead",
            "slug": "contact-lead"
        },
        "organizations": [
            {
                "id": 4,
                "name": "Acme Corp"
            }
        ],
        "custom_fields": null,
        "created_at": "2026-08-06T09:26:59+00:00",
        "updated_at": "2026-08-06T11:46:04+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Person not found."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "name": [
                "The name field must be a string."
            ]
        }
    }
}

Delete a person

DELETE
https://{your-subdomain}.saleskey.ai
/api/v1/people/{id}
requires authentication

Soft-deletes the person, matching the internal delete behavior.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The person ID.

Example:
9
Example request:
curl --request DELETE \
    "https://{your-subdomain}.saleskey.ai/api/v1/people/9" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Organizations

Programmatic access to your CRM Organizations. All endpoints require a Bearer API key with the appropriate organizations permission and a Professional-plan account.

List organizations

GET
https://{your-subdomain}.saleskey.ai
/api/v1/organizations
requires authentication

Returns a paginated list of organizations. Supports page, per_page, and the same filters as the web app.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

Page number.

Example:
1
per_page
integer

Results per page (default 25, max 200 - values above 200 are clamped).

Example:
25
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/organizations?page=1&per_page=25" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 4,
            "name": "Acme Corp",
            "email": "info@acme.test",
            "phone": "+13947741292",
            "website": "https://acme.test",
            "street_address": "3944 Broadway",
            "city": "Phoenix",
            "state": "AZ",
            "postal_code": "27434",
            "country": "United States",
            "status": {
                "id": 11,
                "name": "In Deal",
                "slug": "contact-in-deal"
            },
            "people": [
                {
                    "id": 9,
                    "name": "John Doe"
                }
            ],
            "custom_fields": {
                "industry": "SaaS"
            },
            "created_at": "2026-08-05T07:05:52+00:00",
            "updated_at": "2026-08-06T11:42:43+00:00"
        }
    ],
    "links": {
        "first": "https://{your-subdomain}.saleskey.ai/api/v1/organizations?per_page=25&page=1",
        "last": "https://{your-subdomain}.saleskey.ai/api/v1/organizations?per_page=25&page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 25,
        "to": 1,
        "total": 1,
        "path": "https://{your-subdomain}.saleskey.ai/api/v1/organizations",
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://{your-subdomain}.saleskey.ai/api/v1/organizations?per_page=25&page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "page": null,
                "active": false
            }
        ]
    }
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'organizations'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve an organization

GET
https://{your-subdomain}.saleskey.ai
/api/v1/organizations/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The organization ID.

Example:
4
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/organizations/4" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 4,
        "name": "Acme Corp",
        "email": "info@acme.test",
        "phone": "+13947741292",
        "website": "https://acme.test",
        "street_address": "3944 Broadway",
        "city": "Phoenix",
        "state": "AZ",
        "postal_code": "27434",
        "country": "United States",
        "status": {
            "id": 11,
            "name": "In Deal",
            "slug": "contact-in-deal"
        },
        "people": [
            {
                "id": 9,
                "name": "John Doe"
            }
        ],
        "custom_fields": {
            "industry": "SaaS"
        },
        "created_at": "2026-08-05T07:05:52+00:00",
        "updated_at": "2026-08-06T11:42:43+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Organization not found."
    }
}

Create an organization

POST
https://{your-subdomain}.saleskey.ai
/api/v1/organizations
requires authentication

name is the only required field. Every other field is optional. Note: status_id cannot be set on create - it always defaults to the account's default contact status, matching the internal app's existing behavior. To attach people to the organization, use the dedicated link-person endpoint below after creation.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Body Parameters

Example request:
curl --request POST \
    "https://{your-subdomain}.saleskey.ai/api/v1/organizations" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Acme Corp\",
    \"website\": \"acme.test\"
}"
Example response:
{
    "data": {
        "id": 4,
        "name": "Acme Corp",
        "email": null,
        "phone": null,
        "website": "https://acme.test",
        "street_address": null,
        "city": null,
        "state": null,
        "postal_code": null,
        "country": null,
        "status": {
            "id": 8,
            "name": "Record Only",
            "slug": "contact-record-only"
        },
        "people": [],
        "custom_fields": null,
        "created_at": "2026-08-06T11:46:31+00:00",
        "updated_at": "2026-08-06T11:46:31+00:00"
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "name": [
                "The name field is required."
            ]
        }
    }
}

Update an organization

PATCH
https://{your-subdomain}.saleskey.ai
/api/v1/organizations/{id}
requires authentication

Partial update - send only the fields you want to change.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The organization ID.

Example:
4

Body Parameters

Example request:
curl --request PATCH \
    "https://{your-subdomain}.saleskey.ai/api/v1/organizations/4" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Acme Corp (updated)\"
}"
Example response:
{
    "data": {
        "id": 4,
        "name": "Acme Corp (updated)",
        "email": "info@acme.test",
        "phone": "+13947741292",
        "website": "https://acme.test",
        "street_address": "3944 Broadway",
        "city": "Phoenix",
        "state": "AZ",
        "postal_code": "27434",
        "country": "United States",
        "status": {
            "id": 11,
            "name": "In Deal",
            "slug": "contact-in-deal"
        },
        "people": [
            {
                "id": 9,
                "name": "John Doe"
            }
        ],
        "custom_fields": {
            "industry": "SaaS"
        },
        "created_at": "2026-08-05T07:05:52+00:00",
        "updated_at": "2026-08-06T11:42:43+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Organization not found."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "name": [
                "The name field must be a string."
            ]
        }
    }
}

Link a person to an organization

POST
https://{your-subdomain}.saleskey.ai
/api/v1/organizations/{id}/people
requires authentication

person is a plain name - matched by exact, case-insensitive name against an existing Person (attached if found), or created and attached if no match exists.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The organization ID.

Example:
4

Body Parameters

Example request:
curl --request POST \
    "https://{your-subdomain}.saleskey.ai/api/v1/organizations/4/people" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"person\": \"Jane Doe\"
}"
Example response:
{
    "data": {
        "id": 4,
        "name": "Acme Corp",
        "email": null,
        "phone": null,
        "website": "https://acme.test",
        "street_address": null,
        "city": null,
        "state": null,
        "postal_code": null,
        "country": null,
        "status": {
            "id": 11,
            "name": "In Deal",
            "slug": "contact-in-deal"
        },
        "people": [
            {
                "id": 9,
                "name": "Jane Doe"
            }
        ],
        "custom_fields": null,
        "created_at": "2026-08-05T07:05:52+00:00",
        "updated_at": "2026-08-06T11:42:43+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Organization not found."
    }
}

Unlink a person from an organization

DELETE
https://{your-subdomain}.saleskey.ai
/api/v1/organizations/{id}/people/{personId}
requires authentication

Detaches the person without deleting the Person record itself.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The organization ID.

Example:
4
personId
integer
required

The person ID to unlink.

Example:
9

Body Parameters

Example request:
curl --request DELETE \
    "https://{your-subdomain}.saleskey.ai/api/v1/organizations/4/people/9" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"person_id\": 16
}"
Example response:
{
    "data": {
        "id": 4,
        "name": "Acme Corp",
        "email": null,
        "phone": null,
        "website": "https://acme.test",
        "street_address": null,
        "city": null,
        "state": null,
        "postal_code": null,
        "country": null,
        "status": {
            "id": 11,
            "name": "In Deal",
            "slug": "contact-in-deal"
        },
        "people": [],
        "custom_fields": null,
        "created_at": "2026-08-05T07:05:52+00:00",
        "updated_at": "2026-08-06T11:42:43+00:00"
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Organization not found."
    }
}

Delete an organization

DELETE
https://{your-subdomain}.saleskey.ai
/api/v1/organizations/{id}
requires authentication

Soft-deletes the organization, matching the internal delete behavior.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The organization ID.

Example:
4
Example request:
curl --request DELETE \
    "https://{your-subdomain}.saleskey.ai/api/v1/organizations/4" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
[Empty response]

Statuses

Read-only access to the Status definitions used by Leads, Deals, People, and Organizations - lets you discover valid status_id values before creating or updating those resources. Requires a Bearer API key with the statuses permission and a Professional-plan account. Creating, reordering, and deleting statuses (including reassigning or removing the records on a status) is a Settings-only capability and is not exposed via the API.

List statuses

GET
https://{your-subdomain}.saleskey.ai
/api/v1/statuses
requires authentication

Returns the statuses defined for a single type, ordered the same way they appear in the Settings UI. type=contact covers both People and Organizations - there's no separate person/organization type.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

type
string
required

One of: lead, contact, deal, project. contact covers both People and Organizations.

Example:
lead
page
integer

Page number.

Example:
1
per_page
integer

Results per page (default 25, max 200 - values above 200 are clamped).

Example:
25

Body Parameters

Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/statuses?type=lead&page=1&per_page=25" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type\": \"lead\"
}"
Example response:
{
    "data": [
        {
            "id": 1,
            "name": "New",
            "slug": "lead-new",
            "type": "lead",
            "color": "4299E1",
            "order": 1,
            "is_locked": true
        },
        {
            "id": 2,
            "name": "Attempted",
            "slug": "lead-attempted",
            "type": "lead",
            "color": "ECC94B",
            "order": 2,
            "is_locked": false
        },
        {
            "id": 3,
            "name": "Contacted",
            "slug": "lead-contacted",
            "type": "lead",
            "color": "ED8936",
            "order": 3,
            "is_locked": false
        },
        {
            "id": 4,
            "name": "Qualified",
            "slug": "lead-qualified",
            "type": "lead",
            "color": "48BB78",
            "order": 4,
            "is_locked": true
        },
        {
            "id": 5,
            "name": "Unqualified",
            "slug": "lead-unqualified",
            "type": "lead",
            "color": "F56565",
            "order": 5,
            "is_locked": true
        },
        {
            "id": 6,
            "name": "Converted",
            "slug": "lead-converted",
            "type": "lead",
            "color": "38B2AC",
            "order": 6,
            "is_locked": true
        },
        {
            "id": 7,
            "name": "Archived",
            "slug": "lead-archived",
            "type": "lead",
            "color": "A0AEC0",
            "order": 7,
            "is_locked": true
        }
    ],
    "links": {
        "first": "https://{your-subdomain}.saleskey.ai/api/v1/statuses?type=lead&per_page=25&page=1",
        "last": "https://{your-subdomain}.saleskey.ai/api/v1/statuses?type=lead&per_page=25&page=1",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 1,
        "per_page": 25,
        "to": 7,
        "total": 7,
        "path": "https://{your-subdomain}.saleskey.ai/api/v1/statuses",
        "links": [
            {
                "url": null,
                "label": "« Previous",
                "page": null,
                "active": false
            },
            {
                "url": "https://{your-subdomain}.saleskey.ai/api/v1/statuses?type=lead&per_page=25&page=1",
                "label": "1",
                "page": 1,
                "active": true
            },
            {
                "url": null,
                "label": "Next »",
                "page": null,
                "active": false
            }
        ]
    }
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'statuses'."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "type": [
                "The selected type is invalid."
            ]
        }
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a status

GET
https://{your-subdomain}.saleskey.ai
/api/v1/statuses/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The status ID.

Example:
1
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/statuses/1" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "New",
        "slug": "lead-new",
        "type": "lead",
        "color": "4299E1",
        "order": 1,
        "is_locked": true
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Status not found."
    }
}

Labels

Read-only access to the Label definitions used to tag Leads, Deals, and Projects. Lets you discover valid label ids to populate the labels field on POST/PATCH /leads and /deals (attaching labels to a record is unchanged - still handled there, not by this API). Requires a Bearer API key with the labels permission and a Professional-plan account. Creating, reordering, and deleting label definitions is a Settings-only capability and is not exposed via the API.

List labels

GET
https://{your-subdomain}.saleskey.ai
/api/v1/labels
requires authentication

Returns the labels defined for a single type, ordered the same way they appear in the Settings UI. Not paginated - label counts per type are typically small.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

type
string
required

One of: lead, deal, project.

Example:
lead

Body Parameters

Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/labels?type=lead" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type\": \"lead\"
}"
Example response:
{
    "data": [
        {
            "id": 1,
            "name": "Hot",
            "slug": "lead-hot",
            "type": "lead",
            "color": "F56565",
            "order": 1
        },
        {
            "id": 2,
            "name": "Warm",
            "slug": "lead-warm",
            "type": "lead",
            "color": "ED8936",
            "order": 2
        },
        {
            "id": 3,
            "name": "Cold",
            "slug": "lead-cold",
            "type": "lead",
            "color": "4299E1",
            "order": 3
        }
    ]
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'labels'."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "type": [
                "The selected type is invalid."
            ]
        }
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a label

GET
https://{your-subdomain}.saleskey.ai
/api/v1/labels/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The label ID.

Example:
1
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/labels/1" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "Hot",
        "slug": "lead-hot",
        "type": "lead",
        "color": "F56565",
        "order": 1
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Label not found."
    }
}

Source Channels

Read-only access to the Source Channel definitions used by Leads and Deals (e.g. Website, Referral). Lets you discover valid source_channel_id values before creating or updating those resources. Requires a Bearer API key with the source_channels permission and a Professional-plan account. Creating, reordering, and deleting source channel definitions is a Settings-only capability and is not exposed via the API.

List source channels

GET
https://{your-subdomain}.saleskey.ai
/api/v1/source-channels
requires authentication

Returns every source channel, ordered the same way they appear in the Settings UI. Not paginated - source channel counts are typically small.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/source-channels" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 1,
            "name": "Website",
            "order": 1
        },
        {
            "id": 2,
            "name": "Referral",
            "order": 4
        }
    ]
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'source_channels'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a source channel

GET
https://{your-subdomain}.saleskey.ai
/api/v1/source-channels/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The source channel ID.

Example:
1
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/source-channels/1" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "Website",
        "order": 1
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Source channel not found."
    }
}

Pipelines

Read-only access to Deal Pipelines and their stages. Lets you discover valid pipeline_id/pipeline_stage_id values before creating or updating a Deal (Leads have no pipeline concept). Requires a Bearer API key with the pipelines permission and a Professional-plan account. Creating, updating, and deleting pipelines/stages - including operations that can reassign or delete every Deal on a pipeline - is a Settings-only capability and is not exposed via the API.

List pipelines

GET
https://{your-subdomain}.saleskey.ai
/api/v1/pipelines
requires authentication

Returns every active pipeline with its stages. Not paginated - pipeline counts are typically small.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/pipelines" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 1,
            "name": "Deal Flow",
            "is_active": true,
            "has_probabilities": true,
            "stages": [
                {
                    "id": 1,
                    "name": "Qualified",
                    "color": "EF4444",
                    "order": 1,
                    "probability": "10.00"
                },
                {
                    "id": 2,
                    "name": "Contact Made",
                    "color": "F59E0B",
                    "order": 2,
                    "probability": "30.00"
                },
                {
                    "id": 3,
                    "name": "Demo Scheduled",
                    "color": "EAB308",
                    "order": 3,
                    "probability": "50.00"
                },
                {
                    "id": 4,
                    "name": "Proposal Made",
                    "color": "3B82F6",
                    "order": 4,
                    "probability": "75.00"
                },
                {
                    "id": 5,
                    "name": "Negotiation Started",
                    "color": "10B981",
                    "order": 5,
                    "probability": "100.00"
                }
            ]
        }
    ]
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'pipelines'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a pipeline

GET
https://{your-subdomain}.saleskey.ai
/api/v1/pipelines/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The pipeline ID.

Example:
1
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/pipelines/1" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "Deal Flow",
        "is_active": true,
        "has_probabilities": true,
        "stages": [
            {
                "id": 1,
                "name": "Qualified",
                "color": "EF4444",
                "order": 1,
                "probability": "10.00"
            },
            {
                "id": 2,
                "name": "Contact Made",
                "color": "F59E0B",
                "order": 2,
                "probability": "30.00"
            },
            {
                "id": 3,
                "name": "Demo Scheduled",
                "color": "EAB308",
                "order": 3,
                "probability": "50.00"
            },
            {
                "id": 4,
                "name": "Proposal Made",
                "color": "3B82F6",
                "order": 4,
                "probability": "75.00"
            },
            {
                "id": 5,
                "name": "Negotiation Started",
                "color": "10B981",
                "order": 5,
                "probability": "100.00"
            }
        ]
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Pipeline not found."
    }
}

Users

Read-only access to the tenant's Users - lets you discover valid owner_id, assignees, and followers values before creating or updating Leads/Deals. Requires a Bearer API key with the users permission and a Professional-plan account. Inviting, deactivating, and managing roles for users is a Settings-only capability and is not exposed via the API.

List users

GET
https://{your-subdomain}.saleskey.ai
/api/v1/users
requires authentication

Returns a paginated list of active (non-deleted) users.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

page
integer

Page number.

Example:
1
per_page
integer

Results per page (default 25, max 200 - values above 200 are clamped).

Example:
25
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/users?page=1&per_page=25" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": [
        {
            "id": 1,
            "name": "Jane Owner",
            "email": "jane@acme.test",
            "status": "active",
            "roles": [
                "Account Owner"
            ],
            "created_at": "2026-07-23T10:00:00+00:00",
            "updated_at": "2026-07-23T10:00:00+00:00"
        }
    ],
    "links": {
        "first": "...",
        "last": "...",
        "prev": null,
        "next": null
    },
    "meta": {
        "current_page": 1,
        "per_page": 25,
        "total": 1
    }
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'users'."
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a user

GET
https://{your-subdomain}.saleskey.ai
/api/v1/users/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The user ID.

Example:
1
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/users/1" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 1,
        "name": "Jane Owner",
        "email": "jane@acme.test",
        "status": "active",
        "roles": [
            "Account Owner"
        ]
    }
}
{
    "error": {
        "code": "not_found",
        "message": "User not found."
    }
}

Fields

Read-only access to the fields available on Leads, Deals, People, and Organizations - both built-in and custom - including resolved options for select/multiselect fields. Lets you discover exactly what a create/update payload can contain before sending one. Requires a Bearer API key with the fields permission and a Professional-plan account. Creating, editing, and reordering fields is a Settings-only capability and is not exposed via the API.

options is resolved server-side wherever a real backing source exists (statuses, labels, source channels, users, people, organizations, pipelines) for the built-in select fields, and read directly from the field's own stored choices for custom select/multiselect fields. Three built-in fields can't be resolved to one flat, context-free list: a Deal's pipeline stage (valid stages depend on which pipeline is chosen - see GET /pipelines), and country/currency (static lists with no backing tenant-DB service). For these, options is null and options_source is set to pipeline_stages, countries, or currencies instead.

List fields

GET
https://{your-subdomain}.saleskey.ai
/api/v1/fields
requires authentication

Returns every visible built-in and custom field for a single entity type, in the same order they appear in the Settings UI, including resolved options for select/multiselect fields.

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

Query Parameters

type
string
required

One of: lead, deal, person, organization.

Example:
lead

Body Parameters

Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/fields?type=lead" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"type\": \"person\"
}"
Example response:
{
    "data": [
        {
            "id": 29,
            "slug": "lead_title",
            "name": "Title",
            "type": "input",
            "relation_type": "lead",
            "is_default": true,
            "options": null,
            "order": 1
        },
        {
            "id": 32,
            "slug": "lead_currency",
            "name": "Currency",
            "type": "select_currency",
            "relation_type": "lead",
            "is_default": true,
            "options": null,
            "options_source": "currencies",
            "order": 4
        },
        {
            "id": 33,
            "slug": "lead_value",
            "name": "Value",
            "type": "input_money",
            "relation_type": "lead",
            "is_default": true,
            "options": null,
            "order": 5
        },
        {
            "id": 36,
            "slug": "lead_expected_close_date",
            "name": "Expected Close Date",
            "type": "date",
            "relation_type": "lead",
            "is_default": true,
            "options": null,
            "order": 8
        },
        {
            "id": 37,
            "slug": "lead_person_id",
            "name": "Person",
            "type": "create_or_select_person",
            "relation_type": "lead",
            "is_default": true,
            "options": [],
            "order": 9
        },
        {
            "id": 38,
            "slug": "lead_organization_id",
            "name": "Organization",
            "type": "create_or_select_organization",
            "relation_type": "lead",
            "is_default": true,
            "options": [],
            "order": 10
        },
        {
            "id": 39,
            "slug": "lead_status_id",
            "name": "Status",
            "type": "select_status",
            "relation_type": "lead",
            "is_default": true,
            "options": [
                {
                    "value": 1,
                    "label": "New"
                },
                {
                    "value": 2,
                    "label": "Attempted"
                },
                {
                    "value": 3,
                    "label": "Contacted"
                },
                {
                    "value": 4,
                    "label": "Qualified"
                },
                {
                    "value": 5,
                    "label": "Unqualified"
                },
                {
                    "value": 6,
                    "label": "Converted"
                },
                {
                    "value": 7,
                    "label": "Archived"
                }
            ],
            "order": 11
        },
        {
            "id": 40,
            "slug": "lead_labels",
            "name": "Labels",
            "type": "multiselect_labels",
            "relation_type": "lead",
            "is_default": true,
            "options": [
                {
                    "value": 1,
                    "label": "Hot"
                },
                {
                    "value": 2,
                    "label": "Warm"
                },
                {
                    "value": 3,
                    "label": "Cold"
                }
            ],
            "order": 12
        },
        {
            "id": 41,
            "slug": "lead_source_channel_id",
            "name": "Source Channel",
            "type": "select_source_channel",
            "relation_type": "lead",
            "is_default": true,
            "options": [
                {
                    "value": 1,
                    "label": "Website"
                },
                {
                    "value": 2,
                    "label": "Social Media"
                },
                {
                    "value": 3,
                    "label": "Email Campaign"
                },
                {
                    "value": 4,
                    "label": "Referral"
                },
                {
                    "value": 5,
                    "label": "Event"
                },
                {
                    "value": 6,
                    "label": "Prospector"
                }
            ],
            "order": 13
        },
        {
            "id": 43,
            "slug": "lead_owner_id",
            "name": "Owner",
            "type": "select_user",
            "relation_type": "lead",
            "is_default": true,
            "options": [
                {
                    "value": 1,
                    "label": "Jane Owner"
                }
            ],
            "order": 15
        },
        {
            "id": 44,
            "slug": "lead_assignees",
            "name": "Assignees",
            "type": "multiselect_users",
            "relation_type": "lead",
            "is_default": true,
            "options": [
                {
                    "value": 1,
                    "label": "Jane Owner"
                }
            ],
            "order": 16
        },
        {
            "id": 542,
            "slug": "lead_region",
            "name": "Region",
            "type": "select",
            "relation_type": "lead",
            "is_default": false,
            "options": [
                "Asia",
                "Europe",
                "North America",
                "South America",
                "Africa",
                "Australia"
            ],
            "order": 21
        }
    ]
}
{
    "error": {
        "code": "invalid_api_key",
        "message": "A valid API key is required."
    }
}
{
    "error": {
        "code": "plan_upgrade_required",
        "message": "The REST API is only available on the Professional plan. Please upgrade to continue."
    }
}
{
    "error": {
        "code": "insufficient_permissions",
        "message": "This API key does not have 'read' permission for 'fields'."
    }
}
{
    "error": {
        "code": "validation_failed",
        "message": "The given data was invalid.",
        "details": {
            "type": [
                "The selected type is invalid."
            ]
        }
    }
}
{
    "error": {
        "code": "rate_limit_exceeded",
        "message": "Too many requests. Please retry later.",
        "retry_after": 42
    }
}

Retrieve a field

GET
https://{your-subdomain}.saleskey.ai
/api/v1/fields/{id}
requires authentication

Headers

Authorization
Example:
Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx
Content-Type
Example:
application/json
Accept
Example:
application/json

URL Parameters

id
integer
required

The field ID.

Example:
11
Example request:
curl --request GET \
    --get "https://{your-subdomain}.saleskey.ai/api/v1/fields/11" \
    --header "Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxxxxxx" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
Example response:
{
    "data": {
        "id": 39,
        "slug": "lead_status_id",
        "name": "Status",
        "type": "select_status",
        "relation_type": "lead",
        "is_default": true,
        "options": [
            {
                "value": 1,
                "label": "New"
            },
            {
                "value": 2,
                "label": "Attempted"
            },
            {
                "value": 3,
                "label": "Contacted"
            },
            {
                "value": 4,
                "label": "Qualified"
            },
            {
                "value": 5,
                "label": "Unqualified"
            },
            {
                "value": 6,
                "label": "Converted"
            },
            {
                "value": 7,
                "label": "Archived"
            }
        ],
        "order": 11
    }
}
{
    "error": {
        "code": "not_found",
        "message": "Field not found."
    }
}