Changed operations
- Retrieve case's documents (
GET /v1/cases/{id}/documents
)- ✨ [Added] property
document_type_key
todata[].check
in response body
- ✨ [Added] property
GET /v1/cases/{id}/documents
)
document_type_key
to data[].check
in response bodyIntroducing key
property for Template to improve DX and consistency with other support objects (Custom properties, Document type, ...) that uses human-readable key as identifier.
GET /v1/cases
)
data[].template_id
in response bodytemplate
to data[]
in response bodyPOST /v1/cases
), Update a case (PATCH /v1/cases/{id}
)
template_id
in request bodytemplate_key
in request bodytemplate_id
in response bodytemplate
in response bodyGET /v1/cases/{id}
)
template_id
in response bodytemplate
in response bodyGET /v1/activities
)
key
to data[].context.template
in response bodyGET /v1/templates
)
key
key
to data[]
in response bodyGET /v1/templates/{id}
)
key
in response bodyPOST /v1/templates/run
)
template_id
in request bodytemplate_key
in request bodySee below the list of upcoming changes
GET /v1/cases/{id}
)
document_type_key
to individuals[].checks[]
in response bodydocument_type_key
to companies[].checks[]
in response bodyPOST /v1/companies
), Retrieve a company (GET /v1/companies/{id}
), Update a company (PATCH /v1/companies/{id}
), Set company relevance (POST /v1/companies/{id}/set-relevant
), Create an individual (POST /v1/individuals
), Retrieve an individual (GET /v1/individuals/{id}
), Update an individual (PATCH /v1/individuals/{id}
), Set individual relevance (POST /v1/individuals/{id}/set-relevant
)
document_type_key
to checks[]
in response bodyGET /v1/checks
)
document_type_key
to data[]
in response bodyPOST /v1/checks/document
), Add files (POST /v1/checks/document/{id}/add_files
), Retrieve a Document check (GET /v1/checks/document/{id}
), Force review (POST /v1/checks/document/{id}/force_review
), Review a Document check (PATCH /v1/checks/document/{id}/review
)
data.settings.custom_document_type
in response body: true
document_type_key
to data.settings
in response bodyGET /v1/custom_document_types
)
GET /v1/document_types
) insteadGET /v1/document_types
)
POST /v1/checks/id_verification
), Retrieve an ID Verification check (GET /v1/checks/id_verification/{id}
), Review an ID Verification check (PATCH /v1/checks/id_verification/{id}/review
), Refresh an ID Verification check url (POST /v1/checks/id_verification/{id}/refresh_url
)
data.vendor
depending on the name
data.vendor.sdk_token
for onfido
CaseWebhook
document_type_key
to case.individuals[].checks[]
document_type_key
to case.companies[].checks[]
IndividualWebhook
document_type_key
to individual.checks[]
CompanyWebhook
document_type_key
to company.checks[]
DocumentCheckWebhook
check.data.settings.custom_document_type
: true
document_type_key
to check.data.settings
IdVerificationCheckWebhook
check.data.vendor
depending on the name
check.data.vendor.sdk_token
for onfido
CheckDeletedWebhook
document_type_key
to checkThe following changes (🆕 New Behaviors) are schedule to take effect on October 28th, 2025. Please review and update your integrations accordingly to ensure continued functionality.
subtype
for Document checksWe are standardizing the subtype
format for Document checks across all API responses and webhook payloads to improve consistency and simplify integration logic.
You are impacted only if you parse the subtype
of Document check to extract the key or the UUID of the document type and have special business logic depending on this key or the UUID.
The subtype
format currently varies based on document type:
"document_type:{key}"
"custom_document_type:{uuid}"
The subtype
will use the standardized format for all document types: "document_type:{key}"
The new format will always be of the form "document_type:{key}"
for all document types.
If you were relying on the format of the subtype
and extracting the key or the UUID to have some conditional business logic, the new property document_type_key
or settings.document_type_key
(depending on the operations) will allow you to keep the same logic. Additionally, since the document type key can be re-used across Dotfile workspaces, it will be simpler to keep the share the same logic in your integration across workspaces.
If your integration parses the subtype
field, use the new document_type_key
property instead:
Before:
// Parsing subtype to extract key/UUID
const subtype = check.subtype; // "document_type:bank_details" or "custom_document_type:f9a2ae0f-6bd0-4fd7-88eb-737d59034ea6"
const keyOrUuid = subtype.split(':')[1];
After:
// Use the dedicated property
const documentTypeKey = check.document_type_key; // "bank_details" or "my_document_type"
// No need to parse or check format
GET /v1/cases/{id}
)GET /v1/checks
)POST /v1/companies
), Retrieve a company (GET /v1/companies/{id}
), Update a company (PATCH /v1/companies/{id}
), Set company relevance (POST /v1/companies/{id}/set-relevant
)POST /v1/individuals
), Retrieve an individual (GET /v1/individuals/{id}
), Update an individual (PATCH /v1/individuals/{id}
), Set individual relevance (POST /v1/individuals/{id}/set-relevant
)Migration: Use check.document_type_key
instead of parsing check.subtype
CaseWebhook
, IndividualWebhook
, CompanyWebhook
, CheckDeletedWebhook
Migration: Use check.document_type_key
instead of parsing check.subtype
POST /v1/checks/document
), Add files (POST /v1/checks/document/{id}/add_files
), Retrieve a Document check (GET /v1/checks/document/{id}
), Force review (POST /v1/checks/document/{id}/force_review
), Review a Document check (PATCH /v1/checks/document/{id}/review
)DocumentCheckWebhook
Migration: Use data.settings.document_type_key
instead of parsing check.subtype
The new property data.settings.document_type_key
have been added that will always be set to the key
of the document type ("default" or "custom").
data.settings.document_type
and removal of data.settings.custom_document_type
for Document checksThe property data.settings.document_type_key
have been added to replace data.settings.document_type
and is always set for all document types.
The property data.settings.document_type
will be changed: Instead of containing a string or null, it will always contains the document type object (same as the current value of data.settings.custom_document_type
but for all document types).
You are impacted only if you are using the data.settings.document_type
or some properties of data.settings.custom_document_type
for Document checks.
data.settings.document_type
set to the document type key
for "default" document types, set to null
for "custom" document typesdata.settings.custom_document_type
set to null
for "default" document types, set with the object for custom document typesdata.settings.document_type
will be an object
always set with the same shape as the current data.settings.custom_document_type
data.settings.custom_document_type
will be removedReplace data.settings.document_type
with data.settings.document_type_key
, which provides consistent behavior for all document types.
Before:
const { settings } = check.data;
let key; // string
let documentType; // Object or null
if (settings.document_type !== null) {
// Handle default document type
key = settings.document_type;
documentType = null;
}
if (settings.custom_document_type !== null) {
// Handle custom document type
key = settings.custom_document_type.key;
documentType = settings.custom_document_type;
}
// Do something with the key or documentType
After:
const { settings } = check.data;
const key = settings.document_type_key; // String
// Do something with the key
// If you need information on the document type object, also do the following:
let documentType; // Object, always set after the changes take effect
if (settings.document_type) {
if (typeof settings.document_type === "object") {
// Be ready for the new document_type
documentType = settings.document_type;
}
// Until the change takes effect, document_type can still be a null or a string and in this case it should be ignored
} else if (settings.custom_document_type) {
// Until the change takes effect, custom_document_type is still set for "custom" document type
documentType = settings.custom_document_type;
}
// Do something with the documentType
POST /v1/checks/document
), Add files (POST /v1/checks/document/{id}/add_files
), Retrieve a Document check (GET /v1/checks/document/{id}
), Force review (POST /v1/checks/document/{id}/force_review
), Review a Document check (PATCH /v1/checks/document/{id}/review
)DocumentCheckWebhook
The List all custom document types (GET /v1/custom_document_types
) endpoint is deprecated and will be removed.
You are impacted only if you are using the List all custom document types (GET /v1/custom_document_types
) operation.
Use List all document types (GET /v1/document_types
) instead, which returns all available document types without distinguishing between "default" and "custom" types.
status
Request Body ChangesThe status
field in case request bodies will no longer accept "approved"
and "rejected"
values.
You are impacted only if you are using the Create a case (POST /v1/cases
) or Update a case (PATCH /v1/cases
) endpoints with "approved"
or "rejected"
values in request body for the status
.
status
field in case request bodies accepts the values "draft"
, "open"
, "approved"
or "rejected"
.status
field in case request bodies will continue to accept the values "draft"
or"open"
."approved"
or"rejected"
will returns an HTTP response 400 BAD REQUESTCreate cases without a status
, then use Create a case review (POST /v1/cases/{id}/reviews
) to set the desired status.
To update the status of an existing case to "approved"
, "rejected"
or "closed"
, use the Create a case review (POST /v1/cases/{id}/reviews
).
Before:
// Creating case with status (deprecated)
const response = await fetch('/v1/cases', {
method: 'POST',
body: JSON.stringify({
status: 'approved',
// other case data...
}),
// headers and other options...
});
After:
// Create case without status, then review
const caseResponse = await fetch('/v1/cases', {
method: 'POST',
body: JSON.stringify({
// case data without status...
}),
// headers and other options...
});
const caseId = caseResponse.id;
// Set status via review
await fetch(`/v1/cases/${caseId}/reviews`, {
method: 'POST',
body: JSON.stringify({
status: 'approved',
// Other review options
}),
// headers and other options...
});
POST /v1/cases
)PATCH /v1/cases
)POST /v1/checks/aml
)
exact_match
to settings
in request bodyexact_match
to data.settings
in response bodyGET /v1/checks/aml/{id}
), Review AML hits (PATCH /v1/checks/aml/{id}/hits/review
), Review an AML check (PATCH /v1/checks/aml/{id}/review
), Update an AML check monitoring (PATCH /v1/checks/aml/{id}/monitoring
)
exact_match
to data.settings
in response bodyAmlCheckWebhook
exact_match
to check.data.settingsGET /v1/activities
)
type
: "user__updated_review__case"
data[].type
in response body: "user__updated_review__case"
GET /v1/cases/{id}
)
individuals[].checks[].type
in response body: "online_reputation"
.checks[].type
in response body: "online_reputation"
POST /v1/companies
), Retrieve a company (GET /v1/companies/{id}
), Update a company (PATCH /v1/companies/{id}
), Set company relevance (POST /v1/companies/{id}/set-relevant
), Create an individual (POST /v1/individuals
), Retrieve an individual (GET /v1/individuals/{id}
), Update an individual (PATCH /v1/individuals/{id}
), Set individual relevance (POST /v1/individuals/{id}/set-relevant
)
.checks[].type
in response body: "online_reputation"
GET /v1/checks
)
type
: "online_reputation"
.checks[].type
in response body: "online_reputation"
GET /v1/activities
)
data[].context.check.type
in response body: "online_reputation"
POST /v1/checks/online_reputation
)
GET /v1/checks/online_reputation/{id}
)
PATCH /v1/checks/online_reputation/{id}/review
)
CaseWebhook
"online_reputation"
"online_reputation"
IndividualWebhook
"online_reputation"
CompanyWebhook
"online_reputation"
CheckDeletedWebhook
"online_reputation"
OnlineReputationCheckDataVendorDTO
, OnlineReputationSourceDTO
, OnlineReputationCheckDataCompanyDTO
, OnlineReputationCheckDataInformationDTO
, OnlineReputationCheckDataDTO
GET /v1/checks
)
type
: "electronic_signature"
.checks[].type
in response body: "electronic_signature"
GET /v1/activities
)
data[].context.check.type
in response body: "electronic_signature"
POST /v1/checks/electronic_signature
)
GET /v1/checks/electronic_signature/{id}
)
PATCH /v1/checks/electronic_signature/{id}/review
)
CaseWebhook
"electronic_signature"
"electronic_signature"
IndividualWebhook
"electronic_signature"
CompanyWebhook
"electronic_signature"
CheckDeletedWebhook
"electronic_signature"
ElectronicSignatureCheckSettingsCreate
, ElectronicSignatureCheckDataSettings
, ElectronicSignatureCheckDataVendor
, ElectronicSignatureCheckDataInformation
, ElectronicSignatureCheckData
, ElectronicSignatureCheckWebhook
GET /v1/activities
)
type
: "system__updated_risk__case"
type
: "system__added_tags__case"
type
: "system__added__case_control"
type
: "system__removed__case_control"
data[].type
in response body: "system__updated_risk__case"
data[].type
in response body: "system__added_tags__case"
data[].type
in response body: "system__added__case_control"
data[].type
in response body: "system__removed__case_control"
GET /v1/activities
)
type
: "template__added__case_control"
type
: "template__removed__case_control"
type
: "user__mark_as_completed__case_control"
type
: "system__mark_as_completed__case_control"
type
: "user__mark_as_uncompleted__case_control"
type
: "system__mark_as_uncompleted__case_control"
data[].type
in response body: "template__added__case_control"
data[].type
in response body: "template__removed__case_control"
data[].type
in response body: "user__mark_as_completed__case_control"
data[].type
in response body: "system__mark_as_completed__case_control"
data[].type
in response body: "user__mark_as_uncompleted__case_control"
data[].type
in response body: "system__mark_as_uncompleted__case_control"
POST /v1/checks/document
)
fraud_analysis
to settings
in request bodyDocumentCheckSettingsCreate
fraud_analysis