Recurring scan schedules
Create named duplicate-scan schedules with individual record selections and review their occurrences.
The APIs on this page require alpha access for your organization. App availability and API access are separate. Check access and permissions.
List scan schedules
GET /v1/deduplication/schedules
Lists scan schedules, one page at a time.
Requires dedupe:schedules:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: list_dedupe_scan_schedules. 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 |
|---|---|---|---|---|
limit |
query | No | integer | |
cursor |
query | No | string | |
object_type |
query | No | "companies", "people" |
|
status |
query | No | array of "active", "paused", "deleted" |
Repeat this query parameter for multiple values. |
ownership |
query | No | "api", "portal" |
|
sort |
query | No | "created_at", "-created_at" |
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 |
"deduplication_schedule" |
Yes | |
data[].id |
string | Yes | |
data[].version |
string | Yes | |
data[].ownership |
"api", "portal" |
Yes | |
data[].name |
string | Yes | |
data[].provider_workspace_id |
string | Yes | |
data[].object_type |
"companies", "people" |
Yes | |
data[].action |
object | Yes | |
data[].action.type |
"scan" |
Yes | |
data[].action.ai_assessment |
object | Yes | |
data[].action.ai_assessment.mode |
"none" |
Yes | When data[].action.ai_assessment.mode is "none". |
data[].action.ai_assessment.mode |
"after_scan" |
Yes | When data[].action.ai_assessment.mode is "after_scan". |
data[].action.ai_assessment.budget |
object | Yes | When data[].action.ai_assessment.mode is "after_scan". |
data[].action.ai_assessment.budget.max_assessment_units |
integer | Yes | When data[].action.ai_assessment.mode is "after_scan". |
data[].action.ai_assessment.assessment_expires_after_seconds |
integer | Yes | When data[].action.ai_assessment.mode is "after_scan". |
data[].selection |
object | Yes | |
data[].selection.mode |
"all" |
Yes | When data[].selection.mode is "all". |
data[].selection.mode |
"of", "within" |
Yes | When data[].selection.mode is "of", "within". |
data[].selection.where |
__schema0 | Yes | When data[].selection.mode is "of", "within". |
data[].selection.where.type |
"and", "or" |
Yes | When data[].selection.mode is "of", "within". |
data[].selection.where.conditions |
array of object or __schema0 | Yes | When data[].selection.mode is "of", "within". |
data[].selection.where.conditions[].type |
"attribute" |
Yes | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "attribute". |
data[].selection.where.conditions[].attribute |
string | Yes | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "attribute". When data[].selection.where.conditions[].type is "related". |
data[].selection.where.conditions[].operator |
"is", "is_not", "contains", "not_contains", "lt", "lte", "gt", "gte", "any_of", "none_of", "empty", "not_empty" |
Yes | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "attribute". |
data[].selection.where.conditions[].value |
string or number or boolean or array of string | No | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "attribute". |
data[].selection.where.conditions[].type |
"related" |
Yes | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "related". |
data[].selection.where.conditions[].object |
string | Yes | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "related". |
data[].selection.where.conditions[].where |
__schema0 | Yes | When data[].selection.mode is "of", "within". When data[].selection.where.conditions[].type is "related". |
data[].recurrence |
object | Yes | |
data[].recurrence.cadence |
"daily" |
Yes | Alternative 1. |
data[].recurrence.days_of_week |
array of integer | Yes | Alternative 1. Alternative 2. |
data[].recurrence.hour |
integer | Yes | |
data[].recurrence.cadence |
"weekly" |
Yes | Alternative 2. |
data[].recurrence.cadence |
"monthly" |
Yes | Alternative 3. |
data[].recurrence.day_of_month |
integer | Yes | Alternative 3. |
data[].timezone |
string | Yes | |
data[].status |
"active", "paused", "deleted" |
Yes | |
data[].blocked_reason |
"timezone_changed", "workspace_changed", "authority_revoked", "capacity", "billing", "not_entitled", "selection_invalid" or null |
Yes | |
data[].overlap_policy |
"skip" |
Yes | |
data[].misfire_policy |
"coalesce" |
Yes | |
data[].limits |
object | Yes | |
data[].limits.max_records |
integer or null | Yes | |
data[].limits.max_paid_units |
0 |
Yes | |
data[].next_occurrences |
array of object | Yes | |
data[].next_occurrences[].scheduled_for |
string (date-time) | Yes | |
data[].next_occurrences[].local_time |
string | Yes | |
data[].client_reference |
string or null | Yes | |
data[].created_at |
string (date-time) | Yes | |
data[].updated_at |
string (date-time) | Yes | |
pagination |
object | Yes | |
pagination.next_cursor |
string or null | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter, invalid_request, invalid_cursor. |
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. |
412 |
One of: version_conflict. |
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.
Create scan schedule
POST /v1/deduplication/schedules
Creates a schedule that scans an object for duplicates on a recurring basis. An object can have several schedules, each with its own name and selection; names are unique per object. Without a name, a schedule of every record is named after its object; a schedule with a selection needs a name. Send expected_timezone matching your organization's timezone. It starts paused unless you set status to active; to be active, the key also needs the dedupe:scan scope and access to the whole object, and an AI assessment needs its own scope and budget. Send selection to scan part of the object each time, as Start scan takes it. Its conditions are checked against your Attio attributes before every scan; if one no longer fits, the schedule pauses with blocked_reason selection_invalid and scans nothing until its conditions are changed or cleared. A schedule never merges records.
Requires dedupe:schedules:write. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: create_dedupe_scan_schedule. 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 |
|---|---|---|---|---|
name |
JSON body | No | string | |
provider_workspace_id |
JSON body | Yes | string | |
object_type |
JSON body | Yes | "companies", "people" |
|
action |
JSON body | Yes | object | |
action.type |
Within the JSON value | Within this object | "scan" |
|
action.ai_assessment |
Within the JSON value | Within this object | object | |
action.ai_assessment.mode |
Within the JSON value | Within this object | "none" |
When action.ai_assessment.mode is "none". |
action.ai_assessment.mode |
Within the JSON value | Within this object | "after_scan" |
When action.ai_assessment.mode is "after_scan". |
action.ai_assessment.budget |
Within the JSON value | Within this object | object | When action.ai_assessment.mode is "after_scan". |
action.ai_assessment.budget.max_assessment_units |
Within the JSON value | Within this object | integer | When action.ai_assessment.mode is "after_scan". |
action.ai_assessment.assessment_expires_after_seconds |
Within the JSON value | Within this object | integer | When action.ai_assessment.mode is "after_scan". |
recurrence |
JSON body | Yes | object | |
recurrence.cadence |
Within the JSON value | Within this object | "daily" |
Alternative 1. |
recurrence.days_of_week |
Within the JSON value | Within this object | array of integer | Alternative 1. Alternative 2. |
recurrence.hour |
Within the JSON value | Within this object | integer | |
recurrence.cadence |
Within the JSON value | Within this object | "weekly" |
Alternative 2. |
recurrence.cadence |
Within the JSON value | Within this object | "monthly" |
Alternative 3. |
recurrence.day_of_month |
Within the JSON value | Within this object | integer | Alternative 3. |
expected_timezone |
JSON body | Yes | string | |
status |
JSON body | No | "active", "paused" |
Default: "paused". |
overlap_policy |
JSON body | No | "skip" |
Default: "skip". |
misfire_policy |
JSON body | No | "coalesce" |
Default: "coalesce". |
limits |
JSON body | No | object | |
limits.max_records |
Within the JSON value | No | integer | |
limits.max_paid_units |
Within the JSON value | No | 0 |
|
client_reference |
JSON body | No | string | |
selection |
JSON body | No | object | |
selection.mode |
Within the JSON value | Within this object | "all" |
When selection.mode is "all". |
selection.mode |
Within the JSON value | Within this object | "of", "within" |
When selection.mode is "of", "within". |
selection.where |
Within the JSON value | Within this object | DedupeScanConditionGroup | When selection.mode is "of", "within". |
selection.where.type |
Within the JSON value | Within this object | "and", "or" |
When selection.mode is "of", "within". |
selection.where.conditions |
Within the JSON value | Within this object | array of object or DedupeScanConditionGroup | When selection.mode is "of", "within". |
selection.where.conditions[].type |
Within the JSON value | Within this object | "attribute" |
When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". |
selection.where.conditions[].attribute |
Within the JSON value | Within this object | string | When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". When selection.where.conditions[].type is "related". |
selection.where.conditions[].operator |
Within the JSON value | Within this object | "is", "is_not", "contains", "not_contains", "lt", "lte", "gt", "gte", "any_of", "none_of", "empty", "not_empty" |
When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". |
selection.where.conditions[].value |
Within the JSON value | No | string or number or boolean or array of string | When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". |
selection.where.conditions[].type |
Within the JSON value | Within this object | "related" |
When selection.mode is "of", "within". When selection.where.conditions[].type is "related". |
selection.where.conditions[].object |
Within the JSON value | Within this object | string | When selection.mode is "of", "within". When selection.where.conditions[].type is "related". |
selection.where.conditions[].where |
Within the JSON value | Within this object | DedupeScanConditionGroup | When selection.mode is "of", "within". When selection.where.conditions[].type is "related". |
request_key |
Header: Idempotency-Key |
Yes | string |
Response
| HTTP status | Result |
|---|---|
201 |
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 |
"deduplication_schedule" |
Yes | |
data.id |
string | Yes | |
data.version |
string | Yes | |
data.ownership |
"api", "portal" |
Yes | |
data.name |
string | Yes | |
data.provider_workspace_id |
string | Yes | |
data.object_type |
"companies", "people" |
Yes | |
data.action |
object | Yes | |
data.action.type |
"scan" |
Yes | |
data.action.ai_assessment |
object | Yes | |
data.action.ai_assessment.mode |
"none" |
Yes | When data.action.ai_assessment.mode is "none". |
data.action.ai_assessment.mode |
"after_scan" |
Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.budget |
object | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.budget.max_assessment_units |
integer | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.assessment_expires_after_seconds |
integer | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.selection |
object | Yes | |
data.selection.mode |
"all" |
Yes | When data.selection.mode is "all". |
data.selection.mode |
"of", "within" |
Yes | When data.selection.mode is "of", "within". |
data.selection.where |
__schema0 | Yes | When data.selection.mode is "of", "within". |
data.selection.where.type |
"and", "or" |
Yes | When data.selection.mode is "of", "within". |
data.selection.where.conditions |
array of object or __schema0 | Yes | When data.selection.mode is "of", "within". |
data.selection.where.conditions[].type |
"attribute" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].attribute |
string | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].operator |
"is", "is_not", "contains", "not_contains", "lt", "lte", "gt", "gte", "any_of", "none_of", "empty", "not_empty" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].value |
string or number or boolean or array of string | No | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].type |
"related" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].object |
string | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].where |
__schema0 | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.recurrence |
object | Yes | |
data.recurrence.cadence |
"daily" |
Yes | Alternative 1. |
data.recurrence.days_of_week |
array of integer | Yes | Alternative 1. Alternative 2. |
data.recurrence.hour |
integer | Yes | |
data.recurrence.cadence |
"weekly" |
Yes | Alternative 2. |
data.recurrence.cadence |
"monthly" |
Yes | Alternative 3. |
data.recurrence.day_of_month |
integer | Yes | Alternative 3. |
data.timezone |
string | Yes | |
data.status |
"active", "paused", "deleted" |
Yes | |
data.blocked_reason |
"timezone_changed", "workspace_changed", "authority_revoked", "capacity", "billing", "not_entitled", "selection_invalid" or null |
Yes | |
data.overlap_policy |
"skip" |
Yes | |
data.misfire_policy |
"coalesce" |
Yes | |
data.limits |
object | Yes | |
data.limits.max_records |
integer or null | Yes | |
data.limits.max_paid_units |
0 |
Yes | |
data.next_occurrences |
array of object | Yes | |
data.next_occurrences[].scheduled_for |
string (date-time) | Yes | |
data.next_occurrences[].local_time |
string | Yes | |
data.client_reference |
string or null | Yes | |
data.created_at |
string (date-time) | Yes | |
data.updated_at |
string (date-time) | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter, invalid_request. |
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. |
412 |
One of: version_conflict. |
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 scan schedule
GET /v1/deduplication/schedules/{schedule_id}
Gets one scan schedule, with the version to send when you change or delete it.
Requires dedupe:schedules:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: get_dedupe_scan_schedule. 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 |
|---|---|---|---|---|
schedule_id |
path | Yes | 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 |
"deduplication_schedule" |
Yes | |
data.id |
string | Yes | |
data.version |
string | Yes | |
data.ownership |
"api", "portal" |
Yes | |
data.name |
string | Yes | |
data.provider_workspace_id |
string | Yes | |
data.object_type |
"companies", "people" |
Yes | |
data.action |
object | Yes | |
data.action.type |
"scan" |
Yes | |
data.action.ai_assessment |
object | Yes | |
data.action.ai_assessment.mode |
"none" |
Yes | When data.action.ai_assessment.mode is "none". |
data.action.ai_assessment.mode |
"after_scan" |
Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.budget |
object | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.budget.max_assessment_units |
integer | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.assessment_expires_after_seconds |
integer | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.selection |
object | Yes | |
data.selection.mode |
"all" |
Yes | When data.selection.mode is "all". |
data.selection.mode |
"of", "within" |
Yes | When data.selection.mode is "of", "within". |
data.selection.where |
__schema0 | Yes | When data.selection.mode is "of", "within". |
data.selection.where.type |
"and", "or" |
Yes | When data.selection.mode is "of", "within". |
data.selection.where.conditions |
array of object or __schema0 | Yes | When data.selection.mode is "of", "within". |
data.selection.where.conditions[].type |
"attribute" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].attribute |
string | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].operator |
"is", "is_not", "contains", "not_contains", "lt", "lte", "gt", "gte", "any_of", "none_of", "empty", "not_empty" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].value |
string or number or boolean or array of string | No | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].type |
"related" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].object |
string | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].where |
__schema0 | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.recurrence |
object | Yes | |
data.recurrence.cadence |
"daily" |
Yes | Alternative 1. |
data.recurrence.days_of_week |
array of integer | Yes | Alternative 1. Alternative 2. |
data.recurrence.hour |
integer | Yes | |
data.recurrence.cadence |
"weekly" |
Yes | Alternative 2. |
data.recurrence.cadence |
"monthly" |
Yes | Alternative 3. |
data.recurrence.day_of_month |
integer | Yes | Alternative 3. |
data.timezone |
string | Yes | |
data.status |
"active", "paused", "deleted" |
Yes | |
data.blocked_reason |
"timezone_changed", "workspace_changed", "authority_revoked", "capacity", "billing", "not_entitled", "selection_invalid" or null |
Yes | |
data.overlap_policy |
"skip" |
Yes | |
data.misfire_policy |
"coalesce" |
Yes | |
data.limits |
object | Yes | |
data.limits.max_records |
integer or null | Yes | |
data.limits.max_paid_units |
0 |
Yes | |
data.next_occurrences |
array of object | Yes | |
data.next_occurrences[].scheduled_for |
string (date-time) | Yes | |
data.next_occurrences[].local_time |
string | Yes | |
data.client_reference |
string or null | Yes | |
data.created_at |
string (date-time) | Yes | |
data.updated_at |
string (date-time) | 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. |
412 |
One of: version_conflict. |
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.
Update scan schedule
PATCH /v1/deduplication/schedules/{schedule_id}
Changes, renames, pauses or resumes a scan schedule this key created. Send its version as expected_version and expected_timezone matching your organization's timezone. Scans missed while paused are skipped, not run on resume. A selection you send replaces the conditions whole, mode all clears them, and leaving it out keeps them. A schedule a person set up in Neon Deer can't be changed by an API key; through an AI app a person connected, and while that person may manage Duplicate Detection settings, its recurrence and whether it is paused can be changed, nothing else. What this replaces is not kept, so it can't be undone.
Requires dedupe:schedules:write. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: update_dedupe_scan_schedule. 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 |
|---|---|---|---|---|
schedule_id |
path | Yes | string | |
expected_version |
JSON body | Yes | string | |
expected_timezone |
JSON body | Yes | string | |
name |
JSON body | No | string | |
recurrence |
JSON body | No | object | |
recurrence.cadence |
Within the JSON value | Within this object | "daily" |
Alternative 1. |
recurrence.days_of_week |
Within the JSON value | Within this object | array of integer | Alternative 1. Alternative 2. |
recurrence.hour |
Within the JSON value | Within this object | integer | |
recurrence.cadence |
Within the JSON value | Within this object | "weekly" |
Alternative 2. |
recurrence.cadence |
Within the JSON value | Within this object | "monthly" |
Alternative 3. |
recurrence.day_of_month |
Within the JSON value | Within this object | integer | Alternative 3. |
status |
JSON body | No | "active", "paused" |
|
limits |
JSON body | No | object | |
limits.max_records |
Within the JSON value | No | integer | |
limits.max_paid_units |
Within the JSON value | No | 0 |
|
ai_assessment |
JSON body | No | object | |
ai_assessment.mode |
Within the JSON value | Within this object | "none" |
When ai_assessment.mode is "none". |
ai_assessment.mode |
Within the JSON value | Within this object | "after_scan" |
When ai_assessment.mode is "after_scan". |
ai_assessment.budget |
Within the JSON value | Within this object | object | When ai_assessment.mode is "after_scan". |
ai_assessment.budget.max_assessment_units |
Within the JSON value | Within this object | integer | When ai_assessment.mode is "after_scan". |
ai_assessment.assessment_expires_after_seconds |
Within the JSON value | Within this object | integer | When ai_assessment.mode is "after_scan". |
client_reference |
JSON body | No | string or null | |
selection |
JSON body | No | object | |
selection.mode |
Within the JSON value | Within this object | "all" |
When selection.mode is "all". |
selection.mode |
Within the JSON value | Within this object | "of", "within" |
When selection.mode is "of", "within". |
selection.where |
Within the JSON value | Within this object | DedupeScanConditionGroup | When selection.mode is "of", "within". |
selection.where.type |
Within the JSON value | Within this object | "and", "or" |
When selection.mode is "of", "within". |
selection.where.conditions |
Within the JSON value | Within this object | array of object or DedupeScanConditionGroup | When selection.mode is "of", "within". |
selection.where.conditions[].type |
Within the JSON value | Within this object | "attribute" |
When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". |
selection.where.conditions[].attribute |
Within the JSON value | Within this object | string | When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". When selection.where.conditions[].type is "related". |
selection.where.conditions[].operator |
Within the JSON value | Within this object | "is", "is_not", "contains", "not_contains", "lt", "lte", "gt", "gte", "any_of", "none_of", "empty", "not_empty" |
When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". |
selection.where.conditions[].value |
Within the JSON value | No | string or number or boolean or array of string | When selection.mode is "of", "within". When selection.where.conditions[].type is "attribute". |
selection.where.conditions[].type |
Within the JSON value | Within this object | "related" |
When selection.mode is "of", "within". When selection.where.conditions[].type is "related". |
selection.where.conditions[].object |
Within the JSON value | Within this object | string | When selection.mode is "of", "within". When selection.where.conditions[].type is "related". |
selection.where.conditions[].where |
Within the JSON value | Within this object | DedupeScanConditionGroup | When selection.mode is "of", "within". When selection.where.conditions[].type is "related". |
request_key |
Header: Idempotency-Key |
Yes | 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 |
"deduplication_schedule" |
Yes | |
data.id |
string | Yes | |
data.version |
string | Yes | |
data.ownership |
"api", "portal" |
Yes | |
data.name |
string | Yes | |
data.provider_workspace_id |
string | Yes | |
data.object_type |
"companies", "people" |
Yes | |
data.action |
object | Yes | |
data.action.type |
"scan" |
Yes | |
data.action.ai_assessment |
object | Yes | |
data.action.ai_assessment.mode |
"none" |
Yes | When data.action.ai_assessment.mode is "none". |
data.action.ai_assessment.mode |
"after_scan" |
Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.budget |
object | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.budget.max_assessment_units |
integer | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.action.ai_assessment.assessment_expires_after_seconds |
integer | Yes | When data.action.ai_assessment.mode is "after_scan". |
data.selection |
object | Yes | |
data.selection.mode |
"all" |
Yes | When data.selection.mode is "all". |
data.selection.mode |
"of", "within" |
Yes | When data.selection.mode is "of", "within". |
data.selection.where |
__schema0 | Yes | When data.selection.mode is "of", "within". |
data.selection.where.type |
"and", "or" |
Yes | When data.selection.mode is "of", "within". |
data.selection.where.conditions |
array of object or __schema0 | Yes | When data.selection.mode is "of", "within". |
data.selection.where.conditions[].type |
"attribute" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].attribute |
string | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].operator |
"is", "is_not", "contains", "not_contains", "lt", "lte", "gt", "gte", "any_of", "none_of", "empty", "not_empty" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].value |
string or number or boolean or array of string | No | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "attribute". |
data.selection.where.conditions[].type |
"related" |
Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].object |
string | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.selection.where.conditions[].where |
__schema0 | Yes | When data.selection.mode is "of", "within". When data.selection.where.conditions[].type is "related". |
data.recurrence |
object | Yes | |
data.recurrence.cadence |
"daily" |
Yes | Alternative 1. |
data.recurrence.days_of_week |
array of integer | Yes | Alternative 1. Alternative 2. |
data.recurrence.hour |
integer | Yes | |
data.recurrence.cadence |
"weekly" |
Yes | Alternative 2. |
data.recurrence.cadence |
"monthly" |
Yes | Alternative 3. |
data.recurrence.day_of_month |
integer | Yes | Alternative 3. |
data.timezone |
string | Yes | |
data.status |
"active", "paused", "deleted" |
Yes | |
data.blocked_reason |
"timezone_changed", "workspace_changed", "authority_revoked", "capacity", "billing", "not_entitled", "selection_invalid" or null |
Yes | |
data.overlap_policy |
"skip" |
Yes | |
data.misfire_policy |
"coalesce" |
Yes | |
data.limits |
object | Yes | |
data.limits.max_records |
integer or null | Yes | |
data.limits.max_paid_units |
0 |
Yes | |
data.next_occurrences |
array of object | Yes | |
data.next_occurrences[].scheduled_for |
string (date-time) | Yes | |
data.next_occurrences[].local_time |
string | Yes | |
data.client_reference |
string or null | Yes | |
data.created_at |
string (date-time) | Yes | |
data.updated_at |
string (date-time) | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter, invalid_request. |
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. |
412 |
One of: version_conflict. |
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.
Delete scan schedule
DELETE /v1/deduplication/schedules/{schedule_id}
Deletes a scan schedule, so no more scans start from it. Scans it already started keep running; stop them with Cancel scan. This can't be undone.
Requires dedupe:schedules:write. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: delete_dedupe_scan_schedule. 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 |
|---|---|---|---|---|
schedule_id |
path | Yes | string | |
expected_version |
query | Yes | string |
Response
| HTTP status | Result |
|---|---|
204 |
The resource was removed. No response body. |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter, invalid_request, invalid_cursor. |
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. |
412 |
One of: version_conflict. |
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 scan occurrences
GET /v1/deduplication/schedules/{schedule_id}/occurrences
Lists each time a scan schedule was due and what happened, including skipped times, one page at a time.
Requires dedupe:schedules:read. The connection also needs access to the relevant tables, objects, or workflows.
MCP action: list_dedupe_scan_occurrences. 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 |
|---|---|---|---|---|
schedule_id |
path | Yes | string | |
limit |
query | No | integer | |
cursor |
query | No | string | |
status |
query | No | array of "queued", "running", "completed", "partial", "failed", "canceled", "skipped" |
Repeat this query parameter for multiple values. |
scheduled_for_from |
query | No | string (date-time) | |
scheduled_for_before |
query | No | string (date-time) | |
sort |
query | No | "-scheduled_for", "scheduled_for" |
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 |
"deduplication_schedule_occurrence" |
Yes | |
data[].id |
string | Yes | |
data[].schedule_id |
string | Yes | |
data[].scheduled_for |
string (date-time) | Yes | |
data[].resolved_at |
string (date-time) | Yes | |
data[].timezone |
string | Yes | |
data[].status |
"queued", "running", "completed", "partial", "failed", "canceled", "skipped" |
Yes | |
data[].reason |
"overlap", "coalesced", "authority_revoked", "consent_required", "capacity", "dependency_unavailable" or null |
Yes | |
data[].coalesced_count |
integer | Yes | |
data[].first_missed_at |
string (date-time) or null | Yes | |
data[].run_id |
string or null | Yes | |
data[].admitted_at |
string (date-time) or null | Yes | |
data[].started_at |
string (date-time) or null | Yes | |
data[].ended_at |
string (date-time) or null | Yes | |
pagination |
object | Yes | |
pagination.next_cursor |
string or null | Yes |
Errors
| HTTP status | Meaning |
|---|---|
400 |
One of: credential_in_url, invalid_parameter, unknown_parameter, invalid_request, invalid_cursor. |
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. |
412 |
One of: version_conflict. |
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.