Skip to main content
POST
Submit an attestation for an application

Authorizations

X-Application-Token
string
header
required

Application-specific token for public URL access. Generated when a customer is created. Provides access to a single application without requiring an API key. Token is valid for 90 days and rate-limited to 250 requests per hour.

Headers

x-idempotency-key
string<uuid>
required

Unique key (UUID) to ensure request idempotency on POST, PUT and PATCH requests.

A key is scoped to your client, the HTTP method and the path, and is remembered for 24 hours after a successful (below 400) response. Repeating the same request (same JSON body, whatever the key order or whitespace) with the same key within that window returns the original response with X-Idempotent-Replayed: true instead of executing the request again. Using the same key on the same endpoint with a different body returns 422 with problem type idempotency-key-reused; the request is not executed. Error responses (4xx and 5xx) are not remembered, so a request refused for a fixable reason can be corrected and retried under the same key. Request bodies that are not JSON (for example file uploads) are not compared.

Path Parameters

application_id
string
required

The unique identifier for the application KSUID is a 27-character globally unique ID that combines a timestamp with a random component. Used for all entity identifiers in the Dakota platform.

Required string length: 27
Pattern: ^[0-9A-Za-z]{27}$
Example:

"1NFHrqBHb3cTfLVkFSGmHZqdDPi"

Body

application/json

Attestation submission data

Request to submit an attestation for a KYB application.

To accept a banking partner's disclosure online (the customer-facing half of the partner-onboarding disclosure gate), additionally supply disclosure_id (the terms key the provider declared, e.g. partner_disclosures) and disclosure_version. When those fields are present the attestation is recorded as a partner disclosure acknowledgment with acceptance_channel = customer_online (acceptor name + client IP captured server-side), advancing the partner-onboarding substatus and — for an already-approved application — triggering the programmatic reprovision. The API is partner-agnostic: callers supply a terms key + version, never a partner name. When disclosure_id is absent the behavior is a standard onboarding attestation.

attestation_type
enum<string>
required

Type of attestation being submitted

Available options:
information_accuracy,
terms_of_service,
privacy_policy,
funds_transfer_agreement,
lead_bank_privacy_policy,
e_sign
Example:

"information_accuracy"

timestamp
integer<int64>
required

Unix epoch timestamp (in seconds) when the attestation was made. For every type other than e_sign it must be strictly later than the application's earliest e_sign timestamp, so a type stamped in the same second as e_sign is rejected. See POST /applications/{application_id}/attestations for the ordering rule.

Example:

1705315800

applicant_id
string<ksuid>
required

ID of the individual applicant making the attestation. This is what identifies the attestor: the request carries no name, and the name recorded on the attestation is the one on this applicant's record.

Example:

"2hCjxJzUAW6JVRkZqaF9E0KpM3b"

disclosure_id
string

Optional. The partner disclosure terms key the customer is accepting, as declared by the provider (e.g. partner_disclosures). When present, this attestation is recorded as a partner disclosure acknowledgment. Partner-agnostic — a terms key, never a partner name.

While the application is still in onboarding, an acceptance recorded this way needs the e-sign acceptance to exist already and its timestamp to be after the e-sign acceptance's; otherwise the request is refused with a 400.

Example:

"partner_disclosures"

disclosure_version
string

Optional. The version of the partner disclosure being accepted (e.g. 2026-06). Required when disclosure_id is present.

Example:

"2026-06"

Optional. The version of the Dakota-published document the customer was actually shown, as returned by GET /legal/documents/{document_key}.

Pass it whenever you render the text yourself. Without it the acceptance is pinned to whichever revision is in force when the request arrives — which is not necessarily the one on the customer's screen, if a new revision went live between render and submit. Rejected with 400 if that version is not currently in force, so a stale page fails loudly instead of recording consent to text nobody read.

Ignored when disclosure_id is present; use disclosure_version for partner disclosures.

Example:

"2026-07-23"

Response

Attestation submitted successfully