Developers › API reference
Sales Lead Management (CRM)
Base address https://crm.kanishu.com/api/v1 · Download the OpenAPI description (for Postman, code generators and the like).
Conventions shared by every endpoint — tokens, headers, lists, safe retries, versions, limits — are in the developer guide; error codes are on Error codes. Each endpoint below names the scope a token needs.
Jump to: API access · Contacts · Deals · Leads · People
API access
POST /api/v1/api-access-requests
Create in api access requests
Request fields (JSON body)
allowed_ips | string (up to 2000), can be null | |
api_client_id | integer, can be null | |
purpose required | string (up to 1000) | |
scopes required | list of string | |
validity_days | integer: 30, 60, 90, can be null |
201 — Created. The record is in `data`; its address in `Location`.
GET /api/v1/api-access-requests/pending
Pending (api access requests pending)
| Parameter | In | Type | About |
|---|---|---|---|
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
200 — OK.
POST /api/v1/api-access-requests/{apiAccessRequest}/approve
Approve (api access requests approve)
| Parameter | In | Type | About |
|---|---|---|---|
apiAccessRequest required | path | integer |
200 — OK.
POST /api/v1/api-access-requests/{apiAccessRequest}/reject
Reject (api access requests reject)
| Parameter | In | Type | About |
|---|---|---|---|
apiAccessRequest required | path | integer |
Request fields (JSON body)
reason required | string (up to 500) |
200 — OK.
GET /api/v1/api-access-requests/{apiAccessRequest}/reveal
Reveal (api access requests reveal)
| Parameter | In | Type | About |
|---|---|---|---|
apiAccessRequest required | path | integer | |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
200 — OK.
Reply fields (1)
token | string | The API token, shown this once. Store it in your secrets manager and send it as Authorization: Bearer <token>. |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=token.
Contacts
GET /api/v1/contacts
List contacts · scope contacts:read
| Parameter | In | Type | About |
|---|---|---|---|
page | query | integer | Page number, from 1. |
per_page | query | integer | Items a page (default 25, at most 100). |
q | query | string | Search text. |
filter[account_id] | query | string | Only records with this value; several values comma-separated mean "any of". |
sort | query | string | Comma-separated; prefix - for descending. Allowed: name, created_at, updated_at. Default: id. |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
include | query | string | Related records in the same answer, comma-separated: `account` — The company account the record belongs to (needs `contacts:read`); `owner` — The record's owner: id, name, email; `deals` — The contact's deals (only those the token's owner may see), as GET /deals returns them (needs `deals:read`); `source_lead` — The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it) (needs `leads:read`). |
200 — A page of results.
Reply fields (75) — each record in data
Also in the answer: meta, links.
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | Company name as typed; account_id is the linked account record. |
account_id | integer | The company account the contact belongs to (?include=account). |
owner_user_id | integer | The salesperson who owns the contact (?include=owner). |
converted_from_lead_id | integer, can be null | The lead this contact was converted from, if any (?include=source_lead). |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
account | object | Only with ?include=account. The company account the record belongs to. |
account.id | integer | |
account.name | string | |
account.domain | string, can be null | |
account.gstin | string, can be null | |
account.owner_user_id | integer | |
account.created_at | string (date and time, ISO 8601) | |
account.updated_at | string (date and time, ISO 8601) | |
account.country | string, can be null | |
account.state | string, can be null | |
account.city | string, can be null | |
account.pincode | string, can be null | |
account.territory_id | integer, can be null | |
owner | object | Only with ?include=owner. The record's owner: id, name, email. |
owner.id | integer | |
owner.name | string | |
owner.email | string | |
deals | list | Only with ?include=deals. The contact's deals (only those the token's owner may see), as GET /deals returns them. |
deals[].id | integer | |
deals[].title | string | |
deals[].contact_id | integer | |
deals[].source_lead_id | integer, can be null | |
deals[].pipeline_id | integer | |
deals[].pipeline_stage_id | integer | |
deals[].value | string, can be null | |
deals[].currency | string | |
deals[].fx_rate | string | |
deals[].fx_rate_date | string (date and time, ISO 8601) | |
deals[].fx_rate_source | string | |
deals[].value_home | string | |
deals[].forecast_category | string, can be null | |
deals[].expected_close_date | string (date and time, ISO 8601), can be null | |
deals[].status | string | |
deals[].stale_alert_sent_at | string (date and time, ISO 8601), can be null | |
deals[].owner_user_id | integer | |
deals[].closed_at | string (date and time, ISO 8601), can be null | |
deals[].close_reason | string, can be null | |
deals[].close_note | string, can be null | |
deals[].created_at | string (date and time, ISO 8601) | |
deals[].updated_at | string (date and time, ISO 8601) | |
deals[].custom_fields | object | |
source_lead | object, can be null | Only with ?include=source_lead. The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it). |
source_lead.id | integer | |
source_lead.name | string | |
source_lead.email | string | |
source_lead.phone | string | |
source_lead.company | string | |
source_lead.account_id | integer | |
source_lead.source | string | |
source_lead.status | string | |
source_lead.disqualified_reason | string, can be null | |
source_lead.score | integer | |
source_lead.stale_alert_sent_at | string (date and time, ISO 8601), can be null | |
source_lead.owner_user_id | integer | |
source_lead.converted_to_contact_id | integer | |
source_lead.converted_at | string (date and time, ISO 8601) | |
source_lead.created_at | string (date and time, ISO 8601) | |
source_lead.updated_at | string (date and time, ISO 8601) | |
source_lead.country | string | |
source_lead.state | string | |
source_lead.city | string | |
source_lead.pincode | string | |
source_lead.territory_id | integer, can be null | |
source_lead.custom_fields | object |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,email.
POST /api/v1/contacts
Create in contacts · scope contacts:write
Request fields (JSON body)
company | string (up to 255), can be null | Company name as typed; account_id is the linked account record. |
email | string (email) (up to 255), can be null | |
name required | string (up to 255) | |
phone | string (up to 50), can be null |
201 — Created. The record is in `data`; its address in `Location`.
Reply fields (11) — in data
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | Company name as typed; account_id is the linked account record. |
account_id | integer | The company account the contact belongs to (?include=account). |
owner_user_id | integer | The salesperson who owns the contact (?include=owner). |
converted_from_lead_id | integer, can be null | The lead this contact was converted from, if any (?include=source_lead). |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
GET /api/v1/contacts/{contact}
Get one of contacts · scope contacts:read
| Parameter | In | Type | About |
|---|---|---|---|
contact required | path | integer | |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
include | query | string | Related records in the same answer, comma-separated: `account` — The company account the record belongs to (needs `contacts:read`); `owner` — The record's owner: id, name, email; `deals` — The contact's deals (only those the token's owner may see), as GET /deals returns them (needs `deals:read`); `source_lead` — The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it) (needs `leads:read`). |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (75) — in data
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | Company name as typed; account_id is the linked account record. |
account_id | integer | The company account the contact belongs to (?include=account). |
owner_user_id | integer | The salesperson who owns the contact (?include=owner). |
converted_from_lead_id | integer, can be null | The lead this contact was converted from, if any (?include=source_lead). |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
account | object | Only with ?include=account. The company account the record belongs to. |
account.id | integer | |
account.name | string | |
account.domain | string | |
account.gstin | string | |
account.owner_user_id | integer | |
account.created_at | string (date and time, ISO 8601) | |
account.updated_at | string (date and time, ISO 8601) | |
account.country | string | |
account.state | string | |
account.city | string | |
account.pincode | string | |
account.territory_id | integer, can be null | |
owner | object | Only with ?include=owner. The record's owner: id, name, email. |
owner.id | integer | |
owner.name | string | |
owner.email | string | |
deals | list | Only with ?include=deals. The contact's deals (only those the token's owner may see), as GET /deals returns them. |
deals[].id | integer | |
deals[].title | string | |
deals[].contact_id | integer | |
deals[].source_lead_id | integer, can be null | |
deals[].pipeline_id | integer | |
deals[].pipeline_stage_id | integer | |
deals[].value | string | |
deals[].currency | string | |
deals[].fx_rate | string | |
deals[].fx_rate_date | string (date and time, ISO 8601) | |
deals[].fx_rate_source | string | |
deals[].value_home | string | |
deals[].forecast_category | string | |
deals[].expected_close_date | string (date and time, ISO 8601) | |
deals[].status | string | |
deals[].stale_alert_sent_at | string (date and time, ISO 8601), can be null | |
deals[].owner_user_id | integer | |
deals[].closed_at | string (date and time, ISO 8601), can be null | |
deals[].close_reason | string, can be null | |
deals[].close_note | string, can be null | |
deals[].created_at | string (date and time, ISO 8601) | |
deals[].updated_at | string (date and time, ISO 8601) | |
deals[].custom_fields | object | |
source_lead | object, can be null | Only with ?include=source_lead. The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it). |
source_lead.id | integer | |
source_lead.name | string | |
source_lead.email | string | |
source_lead.phone | string | |
source_lead.company | string | |
source_lead.account_id | integer | |
source_lead.source | string | |
source_lead.status | string | |
source_lead.disqualified_reason | string, can be null | |
source_lead.score | integer | |
source_lead.stale_alert_sent_at | string (date and time, ISO 8601), can be null | |
source_lead.owner_user_id | integer | |
source_lead.converted_to_contact_id | integer | |
source_lead.converted_at | string (date and time, ISO 8601) | |
source_lead.created_at | string (date and time, ISO 8601) | |
source_lead.updated_at | string (date and time, ISO 8601) | |
source_lead.country | string | |
source_lead.state | string | |
source_lead.city | string | |
source_lead.pincode | string | |
source_lead.territory_id | integer, can be null | |
source_lead.custom_fields | object |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,email.
PATCH /api/v1/contacts/{contact}
Change one of contacts · scope contacts:write
| Parameter | In | Type | About |
|---|---|---|---|
contact required | path | integer |
Request fields (JSON body) — send only the fields you change
company | string (up to 255), can be null | Company name as typed; account_id is the linked account record. |
email | string (email) (up to 255), can be null | |
name | string (up to 255) | |
phone | string (up to 50), can be null |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (11) — in data
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | Company name as typed; account_id is the linked account record. |
account_id | integer | The company account the contact belongs to (?include=account). |
owner_user_id | integer | The salesperson who owns the contact (?include=owner). |
converted_from_lead_id | integer, can be null | The lead this contact was converted from, if any (?include=source_lead). |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
Deals
GET /api/v1/deals
List deals · scope deals:read
| Parameter | In | Type | About |
|---|---|---|---|
page | query | integer | Page number, from 1. |
per_page | query | integer | Items a page (default 25, at most 100). |
q | query | string | Search text. |
filter[status] | query | string | Only records with this value; several values comma-separated mean "any of". |
filter[pipeline_stage_id] | query | string | Only records with this value; several values comma-separated mean "any of". |
filter[contact_id] | query | string | Only records with this value; several values comma-separated mean "any of". |
sort | query | string | Comma-separated; prefix - for descending. Allowed: title, value, expected_close_date, created_at, updated_at. Default: id. |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
include | query | string | Related records in the same answer, comma-separated: `contact` — The deal's contact, as GET /contacts/{contact} returns it (needs `contacts:read`); `stage` — The deal's pipeline stage: id, name, probability_percent, is_won_stage, is_lost_stage, and its pipeline (id, name); `owner` — The record's owner: id, name, email; `source_lead` — The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it) (needs `leads:read`). |
200 — A page of results.
Reply fields (71) — each record in data
Also in the answer: meta, links.
id | integer | |
title | string | |
contact_id | integer | The deal's contact (?include=contact). |
source_lead_id | integer, can be null | The lead the deal came from, if any (?include=source_lead). |
pipeline_id | integer | The sales pipeline the deal is in. |
pipeline_stage_id | integer | The stage within that pipeline (?include=stage returns its name and win probability). |
value | string, can be null | Deal value in the deal's own currency. |
currency | string | ISO currency code of value (e.g. INR, USD). |
fx_rate | string | Exchange rate used for value_home (1 unit of currency in home currency). |
fx_rate_date | string (date and time, ISO 8601) | The date of that exchange rate. |
fx_rate_source | string | Where the rate came from (e.g. the reference rate service, or typed in). |
value_home | string | The value in your organisation's home currency, at the exchange rate fixed when entered. |
forecast_category | string, can be null | commit, best_case, pipeline or omitted — how sure the owner is it will close. |
expected_close_date | string (date and time, ISO 8601), can be null | When the deal is expected to close. |
status | string | open, won or lost. |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the deal had no activity. |
owner_user_id | integer | The salesperson who owns the deal (?include=owner). |
closed_at | string (date and time, ISO 8601), can be null | When it was marked won or lost. |
close_reason | string, can be null | Why it was won or lost: Price, Timing, Competitor, No budget, No response, Feature gap or Other. |
close_note | string, can be null | Free-text note recorded when it was closed. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
contact | object | Only with ?include=contact. The deal's contact, as GET /contacts/{contact} returns it. |
contact.id | integer | |
contact.name | string | |
contact.email | string | |
contact.phone | string | |
contact.company | string | |
contact.account_id | integer | |
contact.owner_user_id | integer | |
contact.converted_from_lead_id | integer, can be null | |
contact.created_at | string (date and time, ISO 8601) | |
contact.updated_at | string (date and time, ISO 8601) | |
contact.custom_fields | object | |
stage | object | Only with ?include=stage. The deal's pipeline stage: id, name, probability_percent, is_won_stage, is_lost_stage, and its pipeline (id, name). |
stage.id | integer | |
stage.name | string | |
stage.probability_percent | integer | The chance of winning at this stage, used for weighted forecasts. |
stage.is_won_stage | boolean | true if reaching this stage means the deal is won. |
stage.is_lost_stage | boolean | true if reaching this stage means the deal is lost. |
stage.pipeline | object | |
stage.pipeline.id | integer | |
stage.pipeline.name | string | |
owner | object | Only with ?include=owner. The record's owner: id, name, email. |
owner.id | integer | |
owner.name | string | |
owner.email | string | |
source_lead | object, can be null | Only with ?include=source_lead. The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it). |
source_lead.id | integer | |
source_lead.name | string | |
source_lead.email | string | |
source_lead.phone | string | |
source_lead.company | string | |
source_lead.account_id | integer | |
source_lead.source | string | |
source_lead.status | string | |
source_lead.disqualified_reason | string, can be null | |
source_lead.score | integer | |
source_lead.stale_alert_sent_at | string (date and time, ISO 8601), can be null | |
source_lead.owner_user_id | integer | |
source_lead.converted_to_contact_id | integer | |
source_lead.converted_at | string (date and time, ISO 8601) | |
source_lead.created_at | string (date and time, ISO 8601) | |
source_lead.updated_at | string (date and time, ISO 8601) | |
source_lead.country | string | |
source_lead.state | string | |
source_lead.city | string | |
source_lead.pincode | string | |
source_lead.territory_id | integer, can be null | |
source_lead.custom_fields | object |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=title,contact_id.
POST /api/v1/deals
Create in deals · scope deals:write
Request fields (JSON body)
contact_id | string, can be null | The deal's contact (?include=contact). |
currency | string, can be null | ISO currency code of value (e.g. INR, USD). |
expected_close_date | string (date), can be null | When the deal is expected to close. |
pipeline_id required | string | The sales pipeline the deal is in. |
pipeline_stage_id required | string | The stage within that pipeline (?include=stage returns its name and win probability). |
title required | string (up to 255) | |
value | number, can be null | Deal value in the deal's own currency. |
201 — Created. The record is in `data`; its address in `Location`.
Reply fields (23) — in data
id | integer | |
title | string | |
contact_id | integer | The deal's contact (?include=contact). |
source_lead_id | integer | The lead the deal came from, if any (?include=source_lead). |
pipeline_id | integer | The sales pipeline the deal is in. |
pipeline_stage_id | integer | The stage within that pipeline (?include=stage returns its name and win probability). |
value | string, can be null | Deal value in the deal's own currency. |
currency | string | ISO currency code of value (e.g. INR, USD). |
fx_rate | string | Exchange rate used for value_home (1 unit of currency in home currency). |
fx_rate_date | string (date and time, ISO 8601) | The date of that exchange rate. |
fx_rate_source | string | Where the rate came from (e.g. the reference rate service, or typed in). |
value_home | string | The value in your organisation's home currency, at the exchange rate fixed when entered. |
forecast_category | string, can be null | commit, best_case, pipeline or omitted — how sure the owner is it will close. |
expected_close_date | string (date and time, ISO 8601), can be null | When the deal is expected to close. |
status | string | open, won or lost. |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the deal had no activity. |
owner_user_id | integer | The salesperson who owns the deal (?include=owner). |
closed_at | string (date and time, ISO 8601), can be null | When it was marked won or lost. |
close_reason | string, can be null | Why it was won or lost: Price, Timing, Competitor, No budget, No response, Feature gap or Other. |
close_note | string, can be null | Free-text note recorded when it was closed. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
GET /api/v1/deals/{deal}
Get one of deals · scope deals:read
| Parameter | In | Type | About |
|---|---|---|---|
deal required | path | integer | |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
include | query | string | Related records in the same answer, comma-separated: `contact` — The deal's contact, as GET /contacts/{contact} returns it (needs `contacts:read`); `stage` — The deal's pipeline stage: id, name, probability_percent, is_won_stage, is_lost_stage, and its pipeline (id, name); `owner` — The record's owner: id, name, email; `source_lead` — The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it) (needs `leads:read`). |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (71) — in data
id | integer | |
title | string | |
contact_id | integer | The deal's contact (?include=contact). |
source_lead_id | integer | The lead the deal came from, if any (?include=source_lead). |
pipeline_id | integer | The sales pipeline the deal is in. |
pipeline_stage_id | integer | The stage within that pipeline (?include=stage returns its name and win probability). |
value | string, can be null | Deal value in the deal's own currency. |
currency | string | ISO currency code of value (e.g. INR, USD). |
fx_rate | string | Exchange rate used for value_home (1 unit of currency in home currency). |
fx_rate_date | string (date and time, ISO 8601) | The date of that exchange rate. |
fx_rate_source | string | Where the rate came from (e.g. the reference rate service, or typed in). |
value_home | string | The value in your organisation's home currency, at the exchange rate fixed when entered. |
forecast_category | string, can be null | commit, best_case, pipeline or omitted — how sure the owner is it will close. |
expected_close_date | string (date and time, ISO 8601), can be null | When the deal is expected to close. |
status | string | open, won or lost. |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the deal had no activity. |
owner_user_id | integer | The salesperson who owns the deal (?include=owner). |
closed_at | string (date and time, ISO 8601), can be null | When it was marked won or lost. |
close_reason | string, can be null | Why it was won or lost: Price, Timing, Competitor, No budget, No response, Feature gap or Other. |
close_note | string, can be null | Free-text note recorded when it was closed. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
contact | object | Only with ?include=contact. The deal's contact, as GET /contacts/{contact} returns it. |
contact.id | integer | |
contact.name | string | |
contact.email | string | |
contact.phone | string | |
contact.company | string | |
contact.account_id | integer | |
contact.owner_user_id | integer | |
contact.converted_from_lead_id | integer | |
contact.created_at | string (date and time, ISO 8601) | |
contact.updated_at | string (date and time, ISO 8601) | |
contact.custom_fields | object | |
stage | object | Only with ?include=stage. The deal's pipeline stage: id, name, probability_percent, is_won_stage, is_lost_stage, and its pipeline (id, name). |
stage.id | integer | |
stage.name | string | |
stage.probability_percent | integer | The chance of winning at this stage, used for weighted forecasts. |
stage.is_won_stage | boolean | true if reaching this stage means the deal is won. |
stage.is_lost_stage | boolean | true if reaching this stage means the deal is lost. |
stage.pipeline | object | |
stage.pipeline.id | integer | |
stage.pipeline.name | string | |
owner | object | Only with ?include=owner. The record's owner: id, name, email. |
owner.id | integer | |
owner.name | string | |
owner.email | string | |
source_lead | object | Only with ?include=source_lead. The lead the record came from, as GET /leads/{lead} returns it (only if the token's owner may see it). |
source_lead.id | integer | |
source_lead.name | string | |
source_lead.email | string | |
source_lead.phone | string | |
source_lead.company | string | |
source_lead.account_id | integer | |
source_lead.source | string | |
source_lead.status | string | |
source_lead.disqualified_reason | string, can be null | |
source_lead.score | integer | |
source_lead.stale_alert_sent_at | string (date and time, ISO 8601), can be null | |
source_lead.owner_user_id | integer | |
source_lead.converted_to_contact_id | integer | |
source_lead.converted_at | string (date and time, ISO 8601) | |
source_lead.created_at | string (date and time, ISO 8601) | |
source_lead.updated_at | string (date and time, ISO 8601) | |
source_lead.country | string | |
source_lead.state | string | |
source_lead.city | string | |
source_lead.pincode | string | |
source_lead.territory_id | integer, can be null | |
source_lead.custom_fields | object |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=title,contact_id.
PATCH /api/v1/deals/{deal}
Change one of deals · scope deals:write
| Parameter | In | Type | About |
|---|---|---|---|
deal required | path | integer |
Request fields (JSON body) — send only the fields you change
expected_close_date | string (date), can be null | When the deal is expected to close. |
title | string (up to 255) | |
value | number, can be null | Deal value in the deal's own currency. |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (23) — in data
id | integer | |
title | string | |
contact_id | integer | The deal's contact (?include=contact). |
source_lead_id | integer | The lead the deal came from, if any (?include=source_lead). |
pipeline_id | integer | The sales pipeline the deal is in. |
pipeline_stage_id | integer | The stage within that pipeline (?include=stage returns its name and win probability). |
value | string, can be null | Deal value in the deal's own currency. |
currency | string | ISO currency code of value (e.g. INR, USD). |
fx_rate | string | Exchange rate used for value_home (1 unit of currency in home currency). |
fx_rate_date | string (date and time, ISO 8601) | The date of that exchange rate. |
fx_rate_source | string | Where the rate came from (e.g. the reference rate service, or typed in). |
value_home | string | The value in your organisation's home currency, at the exchange rate fixed when entered. |
forecast_category | string, can be null | commit, best_case, pipeline or omitted — how sure the owner is it will close. |
expected_close_date | string (date and time, ISO 8601), can be null | When the deal is expected to close. |
status | string | open, won or lost. |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the deal had no activity. |
owner_user_id | integer | The salesperson who owns the deal (?include=owner). |
closed_at | string (date and time, ISO 8601), can be null | When it was marked won or lost. |
close_reason | string, can be null | Why it was won or lost: Price, Timing, Competitor, No budget, No response, Feature gap or Other. |
close_note | string, can be null | Free-text note recorded when it was closed. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
custom_fields | object | Your organisation's own extra fields, by field name. |
Leads
GET /api/v1/leads
List leads · scope leads:read
| Parameter | In | Type | About |
|---|---|---|---|
page | query | integer | Page number, from 1. |
per_page | query | integer | Items a page (default 25, at most 100). |
q | query | string | Search text. |
filter[status] | query | string | Only records with this value; several values comma-separated mean "any of". |
filter[source] | query | string | Only records with this value; several values comma-separated mean "any of". |
sort | query | string | Comma-separated; prefix - for descending. Allowed: name, score, created_at, updated_at. Default: id. |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
include | query | string | Related records in the same answer, comma-separated: `account` — The company account the record belongs to (needs `contacts:read`); `owner` — The record's owner: id, name, email; `converted_contact` — The contact the lead was converted to, as GET /contacts/{contact} returns it (needs `contacts:read`). |
200 — A page of results.
Reply fields (51) — each record in data
Also in the answer: meta, links.
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | |
account_id | integer, can be null | The company account the lead belongs to, if linked (?include=account returns it). |
source | string | Where the lead came from (e.g. website, referral, event) — your own wording. |
status | string | new, contacted, qualified, unqualified or converted. |
disqualified_reason | string, can be null | Why the lead was marked unqualified, if it was. |
score | integer | Lead score from your scoring rules (higher is warmer). |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the lead had no activity. |
owner_user_id | integer | The salesperson who owns the lead (?include=owner returns id, name, email). |
converted_to_contact_id | integer, can be null | The contact the lead became when converted (?include=converted_contact). |
converted_at | string (date and time, ISO 8601), can be null | When the lead was converted. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
country | string | |
state | string | |
city | string | |
pincode | string | Postal code (PIN code in India). |
territory_id | integer, can be null | The sales territory, set from the location by your territory rules. |
custom_fields | object | Your organisation's own extra fields, by field name. |
account | object, can be null | Only with ?include=account. The company account the record belongs to. |
account.id | integer | |
account.name | string | |
account.domain | string, can be null | |
account.gstin | string, can be null | |
account.owner_user_id | integer | |
account.created_at | string (date and time, ISO 8601) | |
account.updated_at | string (date and time, ISO 8601) | |
account.country | string, can be null | |
account.state | string, can be null | |
account.city | string, can be null | |
account.pincode | string, can be null | |
account.territory_id | integer, can be null | |
owner | object | Only with ?include=owner. The record's owner: id, name, email. |
owner.id | integer | |
owner.name | string | |
owner.email | string | |
converted_contact | object, can be null | Only with ?include=converted_contact. The contact the lead was converted to, as GET /contacts/{contact} returns it. |
converted_contact.id | integer | |
converted_contact.name | string | |
converted_contact.email | string | |
converted_contact.phone | string | |
converted_contact.company | string | |
converted_contact.account_id | integer | |
converted_contact.owner_user_id | integer | |
converted_contact.converted_from_lead_id | integer | |
converted_contact.created_at | string (date and time, ISO 8601) | |
converted_contact.updated_at | string (date and time, ISO 8601) | |
converted_contact.custom_fields | object |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,email.
POST /api/v1/leads
Create in leads · scope leads:write
Request fields (JSON body)
city | string (up to 80), can be null | |
company | string (up to 255), can be null | |
country | string (up to 80), can be null | |
email | string (email) (up to 255), can be null | |
name required | string (up to 255) | |
phone | string (up to 50), can be null | |
pincode | string (up to 12), can be null | Postal code (PIN code in India). |
source | string (up to 255), can be null | Where the lead came from (e.g. website, referral, event) — your own wording. |
state | string (up to 80), can be null |
201 — Created. The record is in `data`; its address in `Location`.
Reply fields (22) — in data
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | |
account_id | integer, can be null | The company account the lead belongs to, if linked (?include=account returns it). |
source | string | Where the lead came from (e.g. website, referral, event) — your own wording. |
status | string | new, contacted, qualified, unqualified or converted. |
disqualified_reason | string, can be null | Why the lead was marked unqualified, if it was. |
score | integer | Lead score from your scoring rules (higher is warmer). |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the lead had no activity. |
owner_user_id | integer | The salesperson who owns the lead (?include=owner returns id, name, email). |
converted_to_contact_id | integer, can be null | The contact the lead became when converted (?include=converted_contact). |
converted_at | string (date and time, ISO 8601), can be null | When the lead was converted. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
country | string | |
state | string | |
city | string | |
pincode | string | Postal code (PIN code in India). |
territory_id | integer, can be null | The sales territory, set from the location by your territory rules. |
custom_fields | object | Your organisation's own extra fields, by field name. |
GET /api/v1/leads/{lead}
Get one of leads · scope leads:read
| Parameter | In | Type | About |
|---|---|---|---|
lead required | path | integer | |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
include | query | string | Related records in the same answer, comma-separated: `account` — The company account the record belongs to (needs `contacts:read`); `owner` — The record's owner: id, name, email; `converted_contact` — The contact the lead was converted to, as GET /contacts/{contact} returns it (needs `contacts:read`). |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (51) — in data
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | |
account_id | integer, can be null | The company account the lead belongs to, if linked (?include=account returns it). |
source | string | Where the lead came from (e.g. website, referral, event) — your own wording. |
status | string | new, contacted, qualified, unqualified or converted. |
disqualified_reason | string, can be null | Why the lead was marked unqualified, if it was. |
score | integer | Lead score from your scoring rules (higher is warmer). |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the lead had no activity. |
owner_user_id | integer | The salesperson who owns the lead (?include=owner returns id, name, email). |
converted_to_contact_id | integer, can be null | The contact the lead became when converted (?include=converted_contact). |
converted_at | string (date and time, ISO 8601), can be null | When the lead was converted. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
country | string | |
state | string | |
city | string | |
pincode | string | Postal code (PIN code in India). |
territory_id | integer, can be null | The sales territory, set from the location by your territory rules. |
custom_fields | object | Your organisation's own extra fields, by field name. |
account | object, can be null | Only with ?include=account. The company account the record belongs to. |
account.id | integer | |
account.name | string | |
account.domain | string, can be null | |
account.gstin | string, can be null | |
account.owner_user_id | integer | |
account.created_at | string (date and time, ISO 8601) | |
account.updated_at | string (date and time, ISO 8601) | |
account.country | string, can be null | |
account.state | string, can be null | |
account.city | string, can be null | |
account.pincode | string, can be null | |
account.territory_id | integer, can be null | |
owner | object | Only with ?include=owner. The record's owner: id, name, email. |
owner.id | integer | |
owner.name | string | |
owner.email | string | |
converted_contact | object, can be null | Only with ?include=converted_contact. The contact the lead was converted to, as GET /contacts/{contact} returns it. |
converted_contact.id | integer | |
converted_contact.name | string | |
converted_contact.email | string | |
converted_contact.phone | string | |
converted_contact.company | string | |
converted_contact.account_id | integer | |
converted_contact.owner_user_id | integer | |
converted_contact.converted_from_lead_id | integer | |
converted_contact.created_at | string (date and time, ISO 8601) | |
converted_contact.updated_at | string (date and time, ISO 8601) | |
converted_contact.custom_fields | object |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=name,email.
PATCH /api/v1/leads/{lead}
Change one of leads · scope leads:write
| Parameter | In | Type | About |
|---|---|---|---|
lead required | path | integer |
Request fields (JSON body) — send only the fields you change
city | string (up to 80), can be null | |
company | string (up to 255), can be null | |
country | string (up to 80), can be null | |
email | string (email) (up to 255), can be null | |
name | string (up to 255) | |
phone | string (up to 50), can be null | |
pincode | string (up to 12), can be null | Postal code (PIN code in India). |
state | string (up to 80), can be null | |
status | string: new, contacted, qualified, unqualified, converted | new, contacted, qualified, unqualified or converted. |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (22) — in data
id | integer | |
name | string | |
email | string | |
phone | string | |
company | string | |
account_id | integer, can be null | The company account the lead belongs to, if linked (?include=account returns it). |
source | string | Where the lead came from (e.g. website, referral, event) — your own wording. |
status | string | new, contacted, qualified, unqualified or converted. |
disqualified_reason | string, can be null | Why the lead was marked unqualified, if it was. |
score | integer | Lead score from your scoring rules (higher is warmer). |
stale_alert_sent_at | string (date and time, ISO 8601), can be null | When the owner was last reminded that the lead had no activity. |
owner_user_id | integer | The salesperson who owns the lead (?include=owner returns id, name, email). |
converted_to_contact_id | integer, can be null | The contact the lead became when converted (?include=converted_contact). |
converted_at | string (date and time, ISO 8601), can be null | When the lead was converted. |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) | |
country | string | |
state | string | |
city | string | |
pincode | string | Postal code (PIN code in India). |
territory_id | integer, can be null | The sales territory, set from the location by your territory rules. |
custom_fields | object | Your organisation's own extra fields, by field name. |
People
GET /api/v1/people
List people · scope people:read
| Parameter | In | Type | About |
|---|---|---|---|
page | query | integer | Page number, from 1. |
per_page | query | integer | Items a page (default 25, at most 100). |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
200 — A page of results.
Reply fields (24) — each record in data
Also in the answer: meta, links.
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date), can be null | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object, can be null | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object, can be null | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object, can be null | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=display_name,preferred_name.
POST /api/v1/people
Create in people · scope people:write
Request fields (JSON body)
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
display_name required | string (up to 255) | The name shown everywhere in Kanishu. |
employee_number | string (up to 50), can be null | Your own employee number for them (e.g. from payroll or HR). |
employment_status | string: pre_joining, active, on_leave, leaving, left | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date), can be null | Their first working day. |
location_id | string (uuid), can be null | |
manager_person_id | string (uuid), can be null | The manager's People id. |
org_unit_id | string (uuid), can be null | The department or team id, from GET /people-organisation. |
person_type | string: employee, contractor, external, other | employee, contractor, external (auditor, consultant…) or other. |
position_id | string (uuid), can be null | |
preferred_name | string (up to 255), can be null | What they like to be called, if different. |
work_email | string (email) (up to 255), can be null | Their work email address; how they are matched to logins in the products. |
201 — Created. The record is in `data`; its address in `Location`.
Reply fields (24) — in data
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date) | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |
GET /api/v1/people-organisation
Organisation (people organisation) · scope people:read
| Parameter | In | Type | About |
|---|---|---|---|
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (18) — in data
departments | list | |
departments[].id | string (uuid) | |
departments[].name | string | |
departments[].type | string | What kind of unit it is (e.g. department, team, business unit). |
departments[].code | string | |
departments[].part_of_id | integer or string, can be null | The unit this one sits under, or null at the top. |
departments[].in_use | boolean | false when the unit is archived and no longer offered. |
positions | list | |
positions[].id | string (uuid) | |
positions[].name | string | |
positions[].code | string, can be null | |
positions[].in_use | boolean | false when the position is archived. |
locations | list | |
locations[].id | string (uuid) | |
locations[].name | string | |
locations[].code | string, can be null | |
locations[].city | string, can be null | |
locations[].in_use | boolean | false when the location is archived. |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=departments,positions.
POST /api/v1/people/joiners
Add a joiner (from their start date) · scope people:write
Request fields (JSON body)
access | list of string, can be null | Logins they should get, as product key => role (e.g. {"itsm": "agent"}); each one waits for an approval. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
display_name required | string (up to 255) | The name shown everywhere in Kanishu. |
employee_number | string (up to 50), can be null | Your own employee number for them (e.g. from payroll or HR). |
employment_status | string: pre_joining, active, on_leave, leaving, left | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date), can be null | Their first working day. |
location_id | string (uuid), can be null | |
manager_person_id | string (uuid), can be null | The manager's People id. |
org_unit_id | string (uuid), can be null | The department or team id, from GET /people-organisation. |
person_type | string: employee, contractor, external, other | employee, contractor, external (auditor, consultant…) or other. |
position_id | string (uuid), can be null | |
preferred_name | string (up to 255), can be null | What they like to be called, if different. |
start_date required | string (date) | Their first working day; their logins are prepared for it. |
work_email | string (email) (up to 255), can be null | Their work email address; how they are matched to logins in the products. |
201 — The new person, as GET /people/{person} returns them.
Reply fields (24) — in data
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date) | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |
GET /api/v1/people/{person}
Get one of people · scope people:read
| Parameter | In | Type | About |
|---|---|---|---|
person required | path | integer | |
fields | query | string | Only these fields of each record, comma-separated (e.g. `id,name`; nested: `owner.name`). `id` always comes back. |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (24) — in data
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date) | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |
Need fewer? Add ?fields= with the names you want, e.g. ?fields=display_name,preferred_name.
PATCH /api/v1/people/{person}
Change one of people · scope people:write
| Parameter | In | Type | About |
|---|---|---|---|
person required | path | integer |
Request fields (JSON body) — send only the fields you change
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
display_name | string (up to 255) | The name shown everywhere in Kanishu. |
employee_number | string (up to 50), can be null | Your own employee number for them (e.g. from payroll or HR). |
employment_status | string: pre_joining, active, on_leave, leaving, left | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date), can be null | Their first working day. |
location_id | string (uuid), can be null | |
manager_person_id | string (uuid), can be null | The manager's People id. |
org_unit_id | string (uuid), can be null | The department or team id, from GET /people-organisation. |
person_type | string: employee, contractor, external, other | employee, contractor, external (auditor, consultant…) or other. |
position_id | string (uuid), can be null | |
preferred_name | string (up to 255), can be null | What they like to be called, if different. |
work_email | string (email) (up to 255), can be null | Their work email address; how they are matched to logins in the products. |
200 — OK. The record is in `data`, with its version in the `ETag` header.
Reply fields (24) — in data
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date) | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |
POST /api/v1/people/{person}/leave
Record a leaver (logins switched off after the last working day, or now if urgent) · scope people:write
| Parameter | In | Type | About |
|---|---|---|---|
person required | path | integer |
Request fields (JSON body)
last_working_date required | string (date) | Their last working day, once they are leaving; their logins are switched off after it. |
reason | string (up to 500), can be null | Why they are leaving (kept in People's History). |
urgent | boolean | true to switch their logins off now instead of after the last working day. |
200 — The person, as GET /people/{person} returns them.
Reply fields (24) — in data
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date) | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |
POST /api/v1/people/{person}/move
Move a person (department, manager, position or location) from a date · scope people:write
| Parameter | In | Type | About |
|---|---|---|---|
person required | path | integer |
Request fields (JSON body)
department_id | string (uuid), can be null | The department or team they move to, from GET /people-organisation. |
effective_date required | string (date) | The date the move takes effect. |
location_id | string (uuid), can be null | |
manager_id | string (uuid), can be null | Their new manager's People id. |
position_id | string (uuid), can be null |
200 — The person, as GET /people/{person} returns them.
Reply fields (24) — in data
id | string (uuid) | The person's id in People (a UUID). Use it with /people/{person}. |
display_name | string | The name shown everywhere in Kanishu. |
preferred_name | string, can be null | What they like to be called, if different. |
work_email | string | Their work email address; how they are matched to logins in the products. |
employee_number | string, can be null | Your own employee number for them (e.g. from payroll or HR). |
type | string | employee, contractor, external (auditor, consultant…) or other. |
status | string | pre_joining (joining soon), active, on_leave, leaving (last working day set) or left. |
joining_date | string (date) | Their first working day. |
last_working_date | string (date), can be null | Their last working day, once they are leaving; their logins are switched off after it. |
access_end_date | string (date), can be null | When their access to Kanishu products ends, if earlier or later than the last working day (e.g. contractors). |
department | object | Their department or team (id and name), from GET /people-organisation. |
department.id | string (uuid) | |
department.name | string | |
position | object | Their job position (id and name). |
position.id | string (uuid) | |
position.name | string | |
location | object | Their office or site (id and name). |
location.id | string (uuid) | |
location.name | string | |
manager | object, can be null | Their manager in People (id and display_name). |
manager.id | string (uuid) | |
manager.display_name | string | |
created_at | string (date and time, ISO 8601) | |
updated_at | string (date and time, ISO 8601) |