> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dakota.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Create or update EDD record

> Creates or updates the Enhanced Due Diligence (EDD) record for an application. This endpoint
is idempotent and should be used when EDD is required for the application.

**Authentication:** Accepts Application Token (X-Application-Token header).




## OpenAPI

````yaml /openapi.yaml put /applications/{application_id}/edd
openapi: 3.0.3
info:
  title: Dakota Platform API
  version: 1.0.0
  description: >-
    Combined API specification for Dakota Platform services:

    - Issuance API: Asset minting and burning operations

    - Onboarding API: Know Your Business/Customer verification

    - On/Off Ramp API: Managing on-ramp and off-ramp accounts

    - Recipients API: Managing destinations for KYB'd entities

    - Transactions API: Viewing transaction history across platform operations


    ## Authentication and API Headers


    All API endpoints require the following headers:


    - `x-idempotency-key`: Required for all POST endpoints to ensure request
    idempotency

    - `x-api-key`: Required for authentication across all endpoints


    Note: On /applications endpoints you need a token for authentication instead
    of a x-api-key

    - `x-application-token`: Required for authentication on public /applications
    endpoints (alternative to `x-api-key` where documented)



    ## Rate Limits


    Requests are rate limited per API key. Every response includes the following
    headers:


    | Header | Description |

    | --- | --- |

    | `X-RateLimit-Limit` | Maximum requests allowed in the current one-minute
    window. |

    | `X-RateLimit-Remaining` | Requests remaining in the current window. |

    | `X-RateLimit-Reset` | Absolute Unix timestamp (seconds since epoch) when
    the current rate-limit window resets. |


    When a request is throttled (`429`), responses also include `Retry-After`
    with seconds to wait before retrying.
servers:
  - url: https://api.platform.dakota.xyz
    description: Production environment
  - url: https://api.platform.sandbox.dakota.xyz
    description: Sandbox — safe for testing with simulated data
security:
  - ApiKeyAuth: []
tags:
  - name: Agentic Payments
    x-alpha: true
    description: >-
      Alpha — agent-driven payments: provision agents, draft and approve
      spending mandates, accept reviewed instructions, and manage scheduled
      payments.


      **Prerequisites:** Customer onboarded; signer groups attached for
      recognition.

      **Related:** Wallets, Signer Groups, Transactions
  - name: Mandates
    x-alpha: true
    description: >-
      Alpha — spending mandates: signed, signer-bound authorizations governing
      what may be spent, approved or cancelled by a second recognized signer (§8
      — the dual-control rule that every mandate mutation must be signed by a
      recognized signer OTHER than the bound one). Independent of agents and
      scheduled payments.


      **Prerequisites:** Signer groups attached for recognition.

      **Related:** Signer Groups, Transactions
  - name: Insights
    x-alpha: true
    description: >-
      Alpha — read-only account insight: a deterministic report over a
      customer's agentic activity (funding balances, upcoming obligations,
      failures, mandate headroom and expiry) plus an advisory chat that narrates
      it. Never moves money, never creates or changes anything.


      **Prerequisites:** Customer onboarded; insight is computed from the
      customer's scheduled payments, mandates, and wallets.

      **Related:** Agentic Payments, Mandates
  - name: Customers
    description: >-
      Manage customer entities representing businesses and organizations
      onboarded to Dakota.


      **Prerequisites:** Complete KYB via Onboarding endpoints before initiating
      money movement.

      **Related:** Onboarding, Recipients, Transactions, Accounts, Wallets
  - name: Wallets
    description: >-
      Manage wallets, balances, and wallet-to-signer-group relationships for
      custody and movement controls.


      **Prerequisites:** Customer must exist. Configure signer groups before
      policy-enforced workflows.

      **Related:** Signer Groups, Policies, Transactions, Customers
  - name: Transactions
    description: >-
      Create, cancel, and retrieve transaction records across account and wallet
      flows.


      **Prerequisites:** Accounts or destinations must be configured based on
      flow type.

      **Related:** Accounts, Recipients, Policies, Events
  - name: Recipients
    description: >-
      Manage recipient entities and destination rails used by customers for
      payouts and transfers.


      **Prerequisites:** Customer must be onboarded and active.

      **Related:** Customers, Transactions, Accounts, Onboarding
  - name: Accounts
    description: >-
      Manage account resources used for onramp, offramp, and swap operations.


      **Prerequisites:** Customer must be created and network/asset constraints
      must be known.

      **Related:** Customers, Transactions, Auto Transactions, Info
  - name: Auto Transactions
    description: >-
      Manage automated transaction configurations and execution history for
      account automation workflows.


      **Prerequisites:** Source account must exist and be configured for
      automation.

      **Related:** Accounts, Transactions, Events
  - name: Onboarding
    description: >-
      Manage KYB/KYC onboarding lifecycle, application documents, attestations,
      and verification steps.


      **Prerequisites:** Customer context and required entity/application
      metadata.

      **Related:** Customers, Exceptions, Recipients, Transactions
  - name: Policies
    description: >-
      Define and manage policy objects and rules used for transaction governance
      and risk controls.


      **Prerequisites:** Wallet and signer group resources should be configured
      for enforcement scenarios.

      **Related:** Wallets, Signer Groups, Transactions
  - name: Signer Groups
    description: >-
      Manage signer groups and signer assignments for multi-party authorization
      models.


      **Prerequisites:** Wallets should exist before linking signer groups.

      **Related:** Wallets, Policies, Transactions
  - name: Authentication
    description: >-
      Manage API authentication credentials and key lifecycle for platform
      access.


      **Prerequisites:** Client organization must be provisioned.

      **Related:** Users, Info
  - name: Users
    description: >-
      Manage client users, roles, and identity metadata for platform access
      control.


      **Prerequisites:** Auth credentials and client context must be
      established.

      **Related:** Authentication
  - name: Webhooks
    description: >-
      Manage outbound webhook targets and delivery configuration for event
      notifications.


      **Prerequisites:** Subscriber endpoint must be reachable and secured.

      **Related:** Events, Authentication
  - name: Payouts
    description: >-
      Manage where Dakota sends your accrued developer-fee payouts.


      **Prerequisites:** Auth credentials and client context must be
      established.

      **Related:** Events
  - name: Events
    description: >-
      Retrieve event records emitted by platform operations for audit and
      troubleshooting.


      **Prerequisites:** Requesting client must have access to referenced
      resources.

      **Related:** Webhooks, Transactions, Onboarding
  - name: Info
    description: >-
      Read platform capability metadata, such as supported rails, networks, and
      assets.


      **Prerequisites:** Valid authentication headers.

      **Related:** Accounts, Transactions
  - name: Sandbox
    description: >-
      Trigger sandbox-only simulation endpoints for safe end-to-end integration
      testing with synthetic data. The sandbox host
      (`https://api.platform.sandbox.dakota.xyz`) also accepts a family of
      `X-Sandbox-*` request headers on most write endpoints (`Customers`,
      `Accounts`, `Transactions`, simulate endpoints) that let integrators drive
      deterministic failure modes — pick a preset via `X-Sandbox-Scenario`, or
      compose a custom one with
      `X-Sandbox-Error-Step`/`X-Sandbox-Error-Status`/`X-Sandbox-Error-Message`.
      `X-Sandbox-Instant-Completion` collapses async flows to a single
      synchronous step, and `X-Sandbox-Skip-Auto-Approval` keeps newly created
      KYB applications in `pending` for manual-review testing. All `X-Sandbox-*`
      headers are ignored in production.


      **Prerequisites:** Sandbox environment and test customer data.

      **Related:** Customers, Accounts, Transactions, Onboarding
paths:
  /applications/{application_id}/edd:
    put:
      tags:
        - Onboarding
      summary: Create or update EDD record
      description: >
        Creates or updates the Enhanced Due Diligence (EDD) record for an
        application. This endpoint

        is idempotent and should be used when EDD is required for the
        application.


        **Authentication:** Accepts Application Token (X-Application-Token
        header).
      operationId: createOrUpdateEDD
      parameters:
        - name: application_id
          in: path
          required: true
          description: The unique identifier for the application
          schema:
            $ref: '#/components/schemas/KSUID'
        - $ref: '#/components/parameters/IdempotencyKeyHeader'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EDDRequest'
            example:
              account_usage_description: Processing payments for e-commerce transactions
              top_customer_countries:
                - US
                - GB
                - CA
              is_token_issuer: false
              will_conduct_token_sale: false
              token_sale_amount_usd: 1000000
              token_sale_availability: Public sale to accredited investors
              token_sale_registration_status: Registered with SEC
              is_regulated: true
              unregulated_justification: Operating in exempt category under local regulations
              country_of_regulation: US
              regulatory_license_type: Money Services Business (MSB)
              verifies_customer_identity: true
              has_transaction_monitoring: true
              subject_to_aml_audits: true
              last_audit_date: '2024-06-30'
      responses:
        '200':
          description: EDD record created or updated successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EDDWithApplicationID'
              example:
                application_id: 1NFHrqBHb3cTfLVkFSGmHZqdDPi
                application_status: pending
                application_decision: approved
                edd:
                  account_usage_description: Processing payments for e-commerce transactions
                  top_customer_countries:
                    - US
                    - GB
                    - CA
                  is_token_issuer: false
                  will_conduct_token_sale: false
                  token_sale_amount_usd: 1000000
                  token_sale_availability: Public sale to accredited investors
                  token_sale_registration_status: Registered with SEC
                  is_regulated: true
                  unregulated_justification: Operating in exempt category under local regulations
                  country_of_regulation: US
                  regulatory_license_type: Money Services Business (MSB)
                  verifies_customer_identity: true
                  has_transaction_monitoring: true
                  subject_to_aml_audits: true
                  last_audit_date: '2024-06-30'
                  id: 1NFHrqBHb3cTfLVkFSGmHZqdDPi
                  business_id: 1NFHrqBHb3cTfLVkFSGmHZqdDPi
                  document_info:
                    uploaded_documents:
                      - document_id: 2hCjxJzUAW6JVRkZqaF9E0KpM3a
                        document_type: passport
                        status: uploaded
                        uploaded_at: '2025-01-15T10:30:00Z'
                    missing_documents:
                      - purpose: business_formation
                        accepted_types:
                          - articles_of_incorporation
                        description: >-
                          Articles of Incorporation or equivalent formation
                          document
                  created_at: '2025-01-15T10:30:00Z'
                  updated_at: '2025-01-15T14:45:00Z'
        '400':
          description: Invalid request or validation failed
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://docs.dakota.xyz/api-reference/errors#invalid-request
                title: Invalid request or validation failed
                status: 400
                detail: Invalid request or validation failed
                instance: https://api.platform.dakota.xyz/applications/example-id/edd
                request_id: req_01hzy6y7v8w9x0y1z2a3b4c5d6
        '401':
          description: Unauthorized
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: >-
                  https://docs.dakota.xyz/api-reference/errors#authentication-error
                title: Unauthorized
                status: 401
                detail: Unauthorized
                instance: https://api.platform.dakota.xyz/applications/example-id/edd
                request_id: req_01hzy6y7v8w9x0y1z2a3b4c5d6
        '403':
          description: Forbidden
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://docs.dakota.xyz/api-reference/errors#forbidden
                title: Forbidden
                status: 403
                detail: Forbidden
                instance: https://api.platform.dakota.xyz/applications/example-id/edd
                request_id: req_01hzy6y7v8w9x0y1z2a3b4c5d6
        '404':
          description: Application not found
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://docs.dakota.xyz/api-reference/errors#not-found
                title: Application not found
                status: 404
                detail: Application not found
                instance: https://api.platform.dakota.xyz/applications/example-id/edd
                request_id: req_01hzy6y7v8w9x0y1z2a3b4c5d6
        default:
          description: Unexpected error
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
              example:
                type: https://docs.dakota.xyz/api-reference/errors#internal-error
                title: Unexpected error
                status: 500
                detail: Unexpected error
                instance: https://api.platform.dakota.xyz/applications/example-id/edd
                request_id: req_01hzy6y7v8w9x0y1z2a3b4c5d6
      security:
        - ApplicationTokenAuth: []
      externalDocs:
        description: Read full guide in docs
        url: >-
          https://docs.dakota.xyz/api-reference/onboarding/create-or-update-edd-record
components:
  schemas:
    KSUID:
      type: string
      title: KSUID
      description: >-
        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.
      pattern: ^[0-9A-Za-z]{27}$
      minLength: 27
      maxLength: 27
      example: 1NFHrqBHb3cTfLVkFSGmHZqdDPi
    EDDRequest:
      type: object
      description: Request to create or update an Enhanced Due Diligence (EDD) record
      required:
        - account_usage_description
      properties:
        account_usage_description:
          type: string
          description: Required description of how the account will be used
          example: Processing payments for e-commerce transactions
        top_customer_countries:
          type: array
          description: List of countries where the majority of customers are located
          items:
            type: string
            description: ISO 3166-1 alpha-2 country code
            minLength: 2
            maxLength: 2
          example:
            - US
            - GB
            - CA
        is_token_issuer:
          type: boolean
          description: Whether the business issues tokens
          example: false
        will_conduct_token_sale:
          type: boolean
          description: Whether the business will conduct a token sale
          example: false
        token_sale_amount_usd:
          type: number
          format: double
          description: Amount to be raised in token sale (USD)
          example: 1000000
        token_sale_availability:
          type: string
          description: Description of token sale availability
          example: Public sale to accredited investors
        token_sale_registration_status:
          type: string
          description: Registration status with relevant authorities
          example: Registered with SEC
        is_regulated:
          type: boolean
          description: Whether the business is regulated by financial authorities
          example: true
        unregulated_justification:
          type: string
          description: >-
            Justification for why the business is not regulated (required if
            is_regulated=false)
          example: Operating in exempt category under local regulations
        country_of_regulation:
          type: string
          description: ISO 3166-1 alpha-2 country code where the business is regulated
          minLength: 2
          maxLength: 2
          example: US
        regulatory_license_type:
          type: string
          description: Type of regulatory license held (required if is_regulated=true)
          example: Money Services Business (MSB)
        verifies_customer_identity:
          type: boolean
          description: Whether the business verifies customer identity (KYC)
          example: true
        has_transaction_monitoring:
          type: boolean
          description: Whether the business has transaction monitoring in place
          example: true
        subject_to_aml_audits:
          type: boolean
          description: Whether the business is subject to AML audits
          example: true
        last_audit_date:
          type: string
          format: date
          description: Date of the last AML audit in YYYY-MM-DD format
          example: '2024-06-30'
          nullable: true
    EDDWithApplicationID:
      type: object
      description: Response containing EDD data with application context
      required:
        - application_id
        - application_status
        - application_decision
        - edd
      properties:
        application_id:
          $ref: '#/components/schemas/KSUID'
          description: The application ID
        application_status:
          $ref: '#/components/schemas/ApplicationStatus'
          description: Current status of the application
        application_decision:
          type: string
          enum:
            - approved
            - declined
            - withdrawn
          nullable: true
          description: Decision outcome (if any)
        edd:
          $ref: '#/components/schemas/EDDResponse'
          description: The EDD data
    ProblemDetails:
      type: object
      required:
        - type
        - title
        - status
      description: |
        Error response following RFC 9457 Problem Details.
        Public API error responses use this format.
      example:
        type: https://docs.dakota.xyz/api-reference/errors#not-found
        title: Customer Not Found
        status: 404
        detail: Customer cst_2abc123 was not found in your organization.
        instance: https://api.platform.dakota.xyz/customers/cst_2abc123
        request_id: req_7f3a8b2c
      properties:
        type:
          type: string
          format: uri
          description: |
            URI reference identifying the problem type.
            Resolves to human-readable documentation.
          example: https://docs.dakota.xyz/api-reference/errors#not-found
        title:
          type: string
          description: >-
            Short, human-readable summary of the problem type. Stable across
            occurrences.
          example: Customer Not Found
        status:
          type: integer
          description: HTTP status code for this occurrence.
          example: 404
        detail:
          type: string
          description: Human-readable explanation specific to this occurrence.
          example: Customer cst_2abc123 was not found in your organization.
        instance:
          type: string
          format: uri
          description: The request path that triggered this error.
          example: https://api.platform.dakota.xyz/customers/cst_2abc123
        request_id:
          type: string
          description: Unique request identifier. Include when contacting support.
          example: req_7f3a8b2c
        errors:
          type: array
          description: Field-level validation errors (present for validation failures).
          items:
            $ref: '#/components/schemas/ValidationError'
    ApplicationStatus:
      type: string
      title: Application Status
      description: >
        Current status of an application in the onboarding flow.


        Status flow:

        - `pending` - Initial state, not yet submitted

        - `submitted` - Submitted for verification

        - `under_review` - Being reviewed by compliance team

        - `request_for_information` - Admin requesting additional info/documents
        from applicant

        - `admin_revision` - Admin making corrections to application data

        - `approved` - Application approved

        - `declined` - Application declined

        - `completed` - Legacy status (deprecated, use approved/declined
        instead)

        - `compliance_review` - Application is awaiting compliance review of a
        Proof of Address
          document. Set when an individual applicant uploads a PoA-equivalent document
          (proof_of_address, bank_statement, or utility_bill) after their application has
          already been approved or completed. The customer remains active but is subject to
          the $3,000 USD-equivalent rolling 7-day transaction limit until the review concludes.
      enum:
        - pending
        - submitted
        - under_review
        - request_for_information
        - admin_revision
        - approved
        - declined
        - completed
        - compliance_review
      example: submitted
    EDDResponse:
      allOf:
        - $ref: '#/components/schemas/EDDRequest'
        - type: object
          required:
            - id
            - business_id
            - created_at
            - updated_at
          properties:
            id:
              $ref: '#/components/schemas/KSUID'
              description: Unique identifier for the EDD record
            business_id:
              $ref: '#/components/schemas/KSUID'
              description: ID of the business this EDD record belongs to
            document_info:
              $ref: '#/components/schemas/DocumentInfo'
              description: >-
                Information about uploaded and missing documents for this EDD
                record (only included when getting EDD directly)
            created_at:
              type: string
              format: date-time
              description: ISO 8601 timestamp when the EDD record was created
              example: '2025-01-15T10:30:00Z'
            updated_at:
              type: string
              format: date-time
              description: ISO 8601 timestamp when the EDD record was last updated
              example: '2025-01-15T14:45:00Z'
    ValidationError:
      type: object
      required:
        - field
        - message
      properties:
        field:
          type: string
          description: Field path using dot notation for nested fields.
          example: bank_account.routing_number
        message:
          type: string
          description: Human-readable description of the field error.
          example: Routing number must be exactly 9 digits
        code:
          type: string
          description: Machine-readable error code for this field.
          example: invalid_format
    DocumentInfo:
      type: object
      description: Document status information for an applicant entity
      required:
        - uploaded_documents
        - missing_documents
      properties:
        uploaded_documents:
          type: array
          description: List of documents that have been uploaded for this entity
          items:
            $ref: '#/components/schemas/UploadedDocument'
        missing_documents:
          type: array
          description: List of required documents that haven't been uploaded yet
          items:
            $ref: '#/components/schemas/MissingDocument'
    UploadedDocument:
      type: object
      description: Simplified document information for application entities
      required:
        - document_id
        - document_type
        - status
        - uploaded_at
      properties:
        document_id:
          type: string
          format: ksuid
          description: Unique document identifier
          example: 2hCjxJzUAW6JVRkZqaF9E0KpM3a
        document_type:
          type: string
          description: Type of document
          enum:
            - articles_of_incorporation
            - certificate_of_good_standing
            - corporate_registry_extract
            - shareholder_registry
            - source_of_funds
            - bank_reference_letter
            - operating_agreement
            - certificate_of_incorporation
            - passport
            - drivers_license_front
            - drivers_license_back
            - residence_permit_front
            - residence_permit_back
            - source_of_wealth
            - bank_statement
            - regulatory_license
            - aml_audit_report
          example: passport
        status:
          type: string
          description: Upload/verification status
          enum:
            - uploaded
            - pending_verification
            - verified
            - rejected
          example: uploaded
        uploaded_at:
          type: string
          format: date-time
          description: ISO 8601 timestamp when the EDD record was created
          example: '2025-01-15T10:30:00Z'
    MissingDocument:
      type: object
      description: >-
        Information about a missing document the applicant has not yet uploaded.
        Includes both required documents (whose absence blocks readiness) and
        optional ones (e.g. Proof of Address for individuals when the
        PoA-optional flow is enabled — surfaced so the UI can render an upload
        affordance without gating submission).
      required:
        - purpose
        - accepted_types
        - description
      properties:
        purpose:
          type: string
          description: The purpose this document serves in the onboarding requirements
          enum:
            - business_formation
            - business_bylaws
            - business_proof_of_address
            - business_source_of_funds
            - business_nature_of_business
            - business_shareholder_registry
            - individual_identity
            - individual_proof_of_address
            - individual_source_of_wealth
            - edd_regulatory_license
            - edd_financial_docs
            - edd_aml_audit
          example: business_formation
        accepted_types:
          type: array
          description: >-
            Document type identifiers that can satisfy this requirement.
            Single-option requirements have one element, multi-option
            requirements have multiple.
          items:
            type: string
            enum:
              - articles_of_incorporation
              - certificate_of_good_standing
              - corporate_registry_extract
              - shareholder_registry
              - source_of_funds
              - bank_reference_letter
              - operating_agreement
              - certificate_of_incorporation
              - proof_of_address
              - utility_bill
              - pitch_deck
              - marketing_material
              - business_plan
              - memorandum
              - articles_of_association
              - crypto_statement
              - investment_statement
              - subscription_agreement
              - safe_agreement
              - convertible_note
              - loan_agreement
              - promissory_note
              - passport
              - drivers_license_front
              - drivers_license_back
              - residence_permit_front
              - residence_permit_back
              - source_of_wealth
              - bank_statement
              - regulatory_license
              - aml_audit_report
              - payslip
              - employment_contract
              - shareholders_agreement
              - income_verification_letter
              - savings_statement
          example:
            - articles_of_incorporation
        description:
          type: string
          description: Human-readable description of the document requirement
          example: Articles of Incorporation or equivalent formation document
        required:
          type: boolean
          description: >-
            Whether this document must be uploaded for the application to be
            ready for review. When false, the document is optional — typically
            because an alternative gating mechanism applies (e.g. the
            post-onboarding $3,000 / 7-day rolling-window threshold for Proof of
            Address on individual applications under the PoA-optional flow).
          example: true
  parameters:
    IdempotencyKeyHeader:
      name: x-idempotency-key
      in: header
      required: true
      description: >-
        Unique key to ensure request idempotency. If the same key is used within
        a certain time window, the original response will be returned instead of
        executing the request again.
      schema:
        type: string
        format: uuid
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
    ApplicationTokenAuth:
      type: apiKey
      in: header
      name: X-Application-Token
      description: >
        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 30 days and rate-limited to 250 requests per hour.

````