Organization setup and preferences
Inspect setup, change the organization profile, and manage permitted sharing and notification preferences.
The APIs on this page require alpha access for your organization. App availability and API access are separate. Check access and permissions.
Get the organization's setup
GET /v1/setup
Gets the organization's plan, its Attio workspace, and what to set up next, in order, each with the link where a person does it in Neon Deer. Connecting Attio, adding an API key and changing the plan all happen there, never through the API. No token, key, member's email or billing detail is returned.
Requires organization:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: get_organization_setup. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
No request parameters are needed.
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
object | Yes | |
data.object |
"organization_setup" |
Yes | |
data.plan |
object | Yes | |
data.plan.name |
string or null | Yes | |
data.plan.trial_ends_at |
string or null | Yes | |
data.plan.billing_url |
string | Yes | |
data.attio_workspace |
object or null | Yes | |
data.attio_workspace.name |
string or null | Yes | Alternative 1. |
data.attio_workspace.slug |
string or null | Yes | Alternative 1. |
data.next_steps |
array of object | Yes | |
data.next_steps[].step |
"connect_attio", "reconnect_attio", "set_up_app", "reconnect_app", "add_api_key", "fix_api_key", "connect_activity_source" |
Yes | |
data.next_steps[].app |
"duplicate_detection", "workflow_automations", "email_notifications" or null |
Yes | |
data.next_steps[].title |
string | Yes | |
data.next_steps[].url |
string | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Get the organization's connections
GET /v1/setup/connections
Gets what is connected: the Attio workspace, each app's connection status, the third-party API keys that are added (never the keys), and how many activity sources are connected. Each comes with the link where a person connects or fixes it in Neon Deer. No token, key, member's email or billing detail is returned.
Requires organization:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: get_organization_connections. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
No request parameters are needed.
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
object | Yes | |
data.object |
"organization_connections" |
Yes | |
data.attio |
object | Yes | |
data.attio.state |
"connected", "needs_reconnecting", "not_connected" |
Yes | |
data.attio.workspace_name |
string or null | Yes | |
data.attio.workspace_slug |
string or null | Yes | |
data.attio.connected_at |
string or null | Yes | |
data.attio.manage_url |
string | Yes | |
data.apps |
array of object | Yes | |
data.apps[].app |
"duplicate_detection", "workflow_automations", "email_notifications" |
Yes | |
data.apps[].name |
string | Yes | |
data.apps[].state |
"active", "needs_reconnecting", "not_set_up" |
Yes | |
data.apps[].attio_app_access |
"connected", "unconfirmed", "lapsed", "not_connected" or null |
Yes | |
data.apps[].workspace_access |
"connected", "unconfirmed", "lapsed", "not_connected" or null |
Yes | |
data.apps[].setup_url |
string | Yes | |
data.api_keys |
array of object | Yes | |
data.api_keys[].provider |
value | Yes | |
data.api_keys[].state |
"added", "needs_attention", "not_added" |
Yes | |
data.api_keys[].manage_url |
string | Yes | |
data.activity_sources |
object or null | Yes | |
data.activity_sources.connected |
integer | Yes | Alternative 1. |
data.activity_sources.manage_url |
string | Yes | Alternative 1. |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
List the organization's apps
GET /v1/setup/apps
Lists the apps available to the organization and what each does on its plan: whether the plan includes it, what the plan leaves out, and its monthly allowances, each the plan's own number or unlimited, with what is used this month. During a trial no allowance is listed; the plan shows when the trial ends. Where something is not on the plan, upgrade_url is where an administrator changes it in Neon Deer. No token, key, member's email or billing detail is returned.
Requires organization:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: list_organization_apps. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
No request parameters are needed.
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
array of object | Yes | |
data[].object |
"organization_app" |
Yes | |
data[].app |
"duplicate_detection", "workflow_automations", "email_notifications" |
Yes | |
data[].name |
string | Yes | |
data[].on_plan |
boolean | Yes | |
data[].not_on_plan |
array of string | Yes | |
data[].allowances |
array of object | Yes | |
data[].allowances[].name |
string | Yes | |
data[].allowances[].unlimited |
boolean | Yes | |
data[].allowances[].limit |
integer or null | Yes | |
data[].allowances[].used |
integer | Yes | |
data[].allowances[].resets_at |
string or null | Yes | |
data[].app_url |
string | Yes | |
data[].upgrade_url |
string or null | Yes | |
plan |
object | Yes | |
plan.name |
string or null | Yes | |
plan.trial_ends_at |
string or null | Yes | |
plan.billing_url |
string | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Get the organization's name and time zone
GET /v1/setup/profile
Gets the organization's name, its time zone and the version to send with a change.
Requires organization:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: get_organization_profile. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
No request parameters are needed.
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
object | Yes | |
data.object |
"organization_profile" |
Yes | |
data.name |
string | Yes | |
data.time_zone |
string or null | Yes | |
data.version |
integer | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Change the organization's name or time zone
PATCH /v1/setup/profile
Changes the organization's name, its time zone or both, at the version you read. The name is what every member sees in Neon Deer. The time zone is the one schedules run on and dates are counted in: each recurring duplicate scan set up in Neon Deer keeps its hour on the new clock, so it runs at a different moment, and retimed_schedules lists them. Scheduled runs and batches keep the time zone they were set up with. The values replaced are not kept.
Requires organization:write. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: update_organization_profile. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
Parameters
| Name | Send in | Required | Type or allowed values | Notes |
|---|---|---|---|---|
expected_version |
JSON body | Yes | integer | |
name |
JSON body | No | string | |
time_zone |
JSON body | No | string |
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
object | Yes | |
data.object |
"organization_profile" |
Yes | |
data.name |
string | Yes | |
data.time_zone |
string or null | Yes | |
data.version |
integer | Yes | |
data.retimed_schedules |
array of string | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Get usage sharing
GET /v1/setup/usage-sharing
Gets whether the organization shares aggregate usage and reliability figures from its apps with Neon Deer, and the version to send with a change. CRM record contents are never shared.
Requires organization:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: get_organization_usage_sharing. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
No request parameters are needed.
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
object | Yes | |
data.object |
"usage_sharing" |
Yes | |
data.enabled |
boolean | Yes | |
data.version |
integer | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Change usage sharing
PATCH /v1/setup/usage-sharing
Turns sharing the organization's aggregate usage and reliability figures with Neon Deer on or off, at the version you read. CRM record contents are never shared.
Requires organization:write. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: update_organization_usage_sharing. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
Parameters
| Name | Send in | Required | Type or allowed values | Notes |
|---|---|---|---|---|
expected_version |
JSON body | Yes | integer | |
enabled |
JSON body | Yes | boolean |
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
object | Yes | |
data.object |
"usage_sharing" |
Yes | |
data.enabled |
boolean | Yes | |
data.version |
integer | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Get my notification preferences
GET /v1/setup/notification-preferences
Gets the notification preferences of the person who connected this AI app: for each kind of notification they can receive, whether it shows in Neon Deer and how often it is emailed. An API key no person signed in to has none.
Requires organization:read. The connection also needs access to the relevant tables, objects, or workflows. This action also requires a signed-in person through an AI connection; standalone API keys cannot use it.
MCP action: get_my_notification_preferences. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
No request parameters are needed.
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
array of object | Yes | |
data[].object |
"notification_preference" |
Yes | |
data[].category |
string | Yes | |
data[].in_app |
boolean | Yes | |
data[].email_frequency |
"immediate", "daily", "weekly", "off" |
Yes | |
data[].default |
boolean | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
Change my notification preferences
PATCH /v1/setup/notification-preferences
Changes the notification preferences of the person who connected this AI app, theirs only. Kinds of notification you leave out stay as they are. An API key no person signed in to has none.
Requires organization:notifications:write. The connection also needs access to the relevant tables, objects, or workflows. This action also requires a signed-in person through an AI connection; standalone API keys cannot use it.
MCP action: update_my_notification_preferences. Its argument names match the fields below; an HTTP header is passed using its argument name in MCP.
Parameters
| Name | Send in | Required | Type or allowed values | Notes |
|---|---|---|---|---|
preferences |
JSON body | Yes | array of object | |
preferences[].category |
Within the JSON value | Within this object | string | |
preferences[].in_app |
Within the JSON value | Within this object | boolean | |
preferences[].email_frequency |
Within the JSON value | Within this object | "immediate", "daily", "weekly", "off" |
Response
| HTTP status | Result |
|---|---|
200 |
The requested result. Asynchronous work returns an operation to poll. |
Required fields are required within their containing object. Notes identify fields that apply only to a particular response alternative.
| Response field | Type | Required in object | Notes |
|---|---|---|---|
data |
array of object | Yes | |
data[].object |
"notification_preference" |
Yes | |
data[].category |
string | Yes | |
data[].in_app |
boolean | Yes | |
data[].email_frequency |
"immediate", "daily", "weekly", "off" |
Yes | |
data[].default |
boolean | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter. |
401 |
One of: missing_credential, invalid_credential, credential_expired, credential_revoked. |
402 |
One of: payment_overdue. |
403 |
The current permissions, plan or policy do not allow this request. |
404 |
One of: not_found. |
409 |
The request conflicts with current resource state, authorization or an earlier request. Read the error code and current resource before retrying. |
410 |
The requested resource or retained recovery data has expired. |
413 |
One of: request_too_large. |
422 |
A field, filter or selection cannot be used for this request. |
423 |
One of: organization_reopening. |
428 |
One of: customer_agreement_required. |
429 |
One of: rate_limited. |
503 |
One of: service_unavailable. |
See errors and recovery and safe retries before repeating a write.
The public OpenAPI document lists generally available API families. Alpha operations may not appear in that document; their request and response fields are listed on this page. Use the API Playground to inspect a real response with your connection's access.