Dwolla Documents API

Upload and retrieve identity-verification documents for Customers and beneficial owners when additional documentation is required to clear verification. Supports photo ID and business documents, tracks each document's review status, and lists all documents attached to a Customer or beneficial owner.

OpenAPI Specification

dwolla-documents-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Dwolla API - Documents
  description: Dwolla API Documentation
  contact:
    name: Dwolla Developer Relations Team
    url: https://developers.dwolla.com
    email: api@dwolla.com
  version: '2.0'
  termsOfService: https://www.dwolla.com/legal/tos/
  license:
    name: MIT
    url: https://github.com/Dwolla/dwolla-openapi/blob/master/LICENSE
jsonSchemaDialect: https://spec.openapis.org/oas/3.1/dialect/base
servers:
- url: https://api.dwolla.com
  description: Production server
- url: https://api-sandbox.dwolla.com
  description: Sandbox server
security:
- clientCredentials: []
tags:
- name: documents
  description: Operations related to Documents
paths:
  /customers/{id}/documents:
    get:
      tags:
      - documents
      summary: List documents for customer
      description: Returns all identity verification documents submitted for a customer. Includes document
        status, verification results, document type (passport, driver's license, etc.), and failure reasons
        if verification was rejected. Used to track document submission and verification progress during
        the business verification process.
      operationId: listCustomerDocuments
      x-speakeasy-group: customers.documents
      x-speakeasy-name-override: list
      x-codeSamples:
      - lang: bash
        source: "GET https://api-sandbox.dwolla.com/customers/176878b8-ecdb-469b-a82b-43ba5e8704b2/documents\n\
          Accept: application/vnd.dwolla.v1.hal+json\nAuthorization: Bearer pBA9fVDBEyYZCEsLfwKehyh1RTpzjUj5KzIRfDi0wKTii7DqY\n\
          \n...\n\n{\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://api-sandbox.dwolla.com/customers/176878b8-ecdb-469b-a82b-43ba5e8704b2/documents\"\
          \n    }\n  },\n  \"_embedded\": {\n    \"documents\": [\n      {\n        \"_links\": {\n  \
          \        \"self\": {\n            \"href\": \"https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\"\
          \n          }\n        },\n        \"id\": \"56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\",\n     \
          \   \"status\": \"pending\",\n        \"type\": \"passport\",\n        \"created\": \"2015-09-29T21:42:16.000Z\"\
          ,\n        \"documentVerificationStatus\": \"pending\"\n      },\n      {\n        \"_links\"\
          : {\n            \"self\": {\n                \"href\": \"https://api-sandbox.dwolla.com/documents/20988444-c7e1-40cf-ab1a-a20da878e568\"\
          ,\n                \"type\": \"application/vnd.dwolla.v1.hal+json\",\n                \"resource-type\"\
          : \"document\"\n            }\n        },\n        \"id\": \"20988444-c7e1-40cf-ab1a-a20da878e568\"\
          ,\n        \"status\": \"reviewed\",\n        \"type\": \"license\",\n        \"created\": \"\
          2019-05-30T22:01:40.000Z\",\n        \"documentVerificationStatus\": \"rejected\",\n       \
          \ \"failureReason\": \"ScanDobMismatch\",\n        \"allFailureReasons\": [\n            {\n\
          \                \"reason\": \"ScanDobMismatch\",\n                \"description\": \"Scan DOB\
          \ does not match DOB on account\"\n            },\n            {\n                \"reason\"\
          : \"ScanIdExpired\",\n                \"description\": \"ID is expired or missing expiration\
          \ date\"\n            }\n        ]\n      }\n    ]\n  },\n  \"total\": 2\n}\n"
      - lang: javascript
        source: "// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node\nvar customerUrl =\n  \"\
          https://api-sandbox.dwolla.com/customers/176878b8-ecdb-469b-a82b-43ba5e8704b2\";\n\ndwolla\n\
          \  .get(`${customerUrl}/documents`)\n  .then((res) => res.body._embedded[\"documents\"][0].id);\
          \ // => '56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc'\n"
      - lang: python
        source: '# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python

          customer_url = ''https://api-sandbox.dwolla.com/customers/176878b8-ecdb-469b-a82b-43ba5e8704b2''


          documents = app_token.get(''%s/documents'' % customer_url)

          documents.body[''total''] # => 2

          '
      - lang: php
        source: '<?php

          // Using dwollaswagger - https://github.com/Dwolla/dwolla-swagger-php

          $customerUrl = ''https://api-sandbox.dwolla.com/customers/176878b8-ecdb-469b-a82b-43ba5e8704b2'';


          $customersApi = new DwollaSwagger\CustomersApi($apiClient);


          $customer = $customersApi->getCustomerDocuments($customerUrl);

          $customer->total; # => 2

          ?>

          '
      - lang: ruby
        source: '# Using dwolla_v2 - https://github.com/Dwolla/dwolla-v2-ruby

          customer_url = ''https://api-sandbox.dwolla.com/customers/176878b8-ecdb-469b-a82b-43ba5e8704b2''


          documents = app_token.get "#{customer_url}/documents"

          documents._embedded[''documents''][0].id # => "56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc"

          '
      parameters:
      - name: id
        in: path
        description: customer unique identifier
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/Accept'
      responses:
        '200':
          description: successful operation
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/Documents'
        '403':
          description: Forbidden
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
        '404':
          description: Not Found
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
    post:
      tags:
      - documents
      summary: Create a document for customer
      description: Uploads an identity verification document for a customer using multipart form-data.
        Required when a customer has "document" status during the verification process.
      operationId: createCustomerDocument
      x-speakeasy-group: customers.documents
      x-speakeasy-name-override: create
      x-codeSamples:
      - lang: bash
        source: 'curl -X POST

          \ -H "Authorization: Bearer tJlyMNW6e3QVbzHjeJ9JvAPsRglFjwnba4NdfCzsYJm7XbckcR"

          \ -H "Accept: application/vnd.dwolla.v1.hal+json"

          \ -H "Cache-Control: no-cache"

          \ -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"

          \ -F "documentType=passport"

          \ -F "file=@foo.png"

          \ ''https://api-sandbox.dwolla.com/customers/1de32eC7-ff0b-4c0c-9f09-19629e6788ce/documents''


          ...


          HTTP/1.1 201 Created

          Location: https://api-sandbox.dwolla.com/documents/11fe0bab-39bd-42ee-bb39-275afcc050d0

          '
      - lang: javascript
        source: "// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node\n// Using form-data - https://github.com/form-data/form-data\
          \ (Not Maintained By Dwolla)\nvar customerUrl = \"https://api-sandbox.dwolla.com/customers/1de32eC7-ff0b-4c0c-9f09-19629e6788ce\"\
          ;\n\nvar requestBody = new FormData();\nrequestBody.append(\"file\", fs.createReadStream(\"\
          mclovin.jpg\"), {\n  filename: \"mclovin.jpg\",\n  contentType: \"image/jpeg\",\n  knownLength:\
          \ fs.statSync(\"mclovin.jpg\").size,\n});\nrequestBody.append(\"documentType\", \"license\"\
          );\n\ndwolla\n  .post(`${customerUrl}/documents`, requestBody)\n  .then((res) => res.headers.get(\"\
          location\")); // => \"https://api-sandbox.dwolla.com/documents/fb919e0b-ffbe-4268-b1e2-947b44328a16\"\
          \n"
      - lang: python
        source: '# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python

          customer_url = ''https://api-sandbox.dwolla.com/customers/1de32eC7-ff0b-4c0c-9f09-19629e6788ce''


          document = app_token.post(''%s/documents'' % customer_url, file = open(''mclovin.jpg'', ''rb''),
          documentType = ''license'')

          document.headers[''location''] # => ''https://api-sandbox.dwolla.com/documents/fb919e0b-ffbe-4268-b1e2-947b44328a16''

          '
      - lang: php
        source: "/**\n * No example for this language yet.\n **/\n"
      - lang: ruby
        source: '# Using dwolla_v2 - https://github.com/Dwolla/dwolla-v2-ruby

          customer_url = ''https://api-sandbox.dwolla.com/customers/1de32eC7-ff0b-4c0c-9f09-19629e6788ce''


          file = Faraday::UploadIO.new(''mclovin.jpg'', ''image/jpeg'')

          document = app_token.post "#{customer_url}/documents", file: file, documentType: ''license''

          document.response_headers[:location] # => "https://api.dwolla.com/documents/fb919e0b-ffbe-4268-b1e2-947b44328a16"

          '
      parameters:
      - name: id
        in: path
        description: customer unique identifier
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/Accept'
      requestBody:
        description: Upload a document for a customer.
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
              - documentType
              - file
              properties:
                documentType:
                  type: string
                  enum:
                  - passport
                  - license
                  - idCard
                  - other
                  example: license
                file:
                  type: string
                  format: binary
      responses:
        '201':
          description: successful operation
          headers:
            Location:
              $ref: '#/components/headers/Location'
        '400':
          description: Bad Request
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/MaximumNumberOfResourcesSchema'
                - $ref: '#/components/schemas/InvalidFileTypeSchema'
                - $ref: '#/components/schemas/DuplicateResourceSchema'
        '403':
          description: not found
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/InvalidResourceStateSchema'
                - $ref: '#/components/schemas/NotAuthorizedSchema'
        '404':
          description: not found
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: notFound
                  message:
                    type: string
                    example: Customer not found. Check CustomerId.
        '413':
          description: request entity too large
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: fileTooLarge
                  message:
                    type: string
                    example: Document requests are limited to 10 MiB.
  /beneficial-owners/{id}/documents:
    get:
      tags:
      - documents
      summary: List documents for beneficial owner
      description: Returns all identity verification documents submitted for a beneficial owner. Includes
        document status, verification results, document type (passport, driver's license, etc.), and failure
        reasons if verification was rejected. Used to track document submission and verification progress
        during the business verification process.
      operationId: listBeneficialOwnerDocuments
      x-speakeasy-group: beneficialOwners.documents
      x-speakeasy-name-override: list
      x-codeSamples:
      - lang: bash
        source: "GET https://api-sandbox.dwolla.com/beneficial-owners/176878b8-ecdb-469b-a82b-43ba5e8704b2/documents\n\
          Accept: application/vnd.dwolla.v1.hal+json\nAuthorization: Bearer pBA9fVDBEyYZCEsLfwKehyh1RTpzjUj5KzIRfDi0wKTii7DqY\n\
          \n...\n\n{\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://api-sandbox.dwolla.com/beneficial-owners/176878b8-ecdb-469b-a82b-43ba5e8704b2/documents\"\
          \n    }\n  },\n  \"_embedded\": {\n    \"documents\": [\n      {\n        \"_links\": {\n  \
          \        \"self\": {\n            \"href\": \"https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\"\
          \n          }\n        },\n        \"id\": \"56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\",\n     \
          \   \"status\": \"pending\",\n        \"type\": \"passport\",\n        \"created\": \"2015-09-29T21:42:16.000Z\"\
          ,\n        \"documentVerificationStatus\": \"pending\"\n      },\n      {\n        \"_links\"\
          : {\n            \"self\": {\n                \"href\": \"https://api-sandbox.dwolla.com/documents/20988444-c7e1-40cf-ab1a-a20da878e568\"\
          ,\n                \"type\": \"application/vnd.dwolla.v1.hal+json\",\n                \"resource-type\"\
          : \"document\"\n            }\n        },\n        \"id\": \"20988444-c7e1-40cf-ab1a-a20da878e568\"\
          ,\n        \"status\": \"reviewed\",\n        \"type\": \"license\",\n        \"created\": \"\
          2019-05-30T22:01:40.000Z\",\n        \"documentVerificationStatus\": \"rejected\",\n       \
          \ \"failureReason\": \"ScanDobMismatch\",\n        \"allFailureReasons\": [\n            {\n\
          \                \"reason\": \"ScanDobMismatch\",\n                \"description\": \"Scan DOB\
          \ does not match DOB on account\"\n            },\n            {\n                \"reason\"\
          : \"ScanIdExpired\",\n                \"description\": \"ID is expired or missing expiration\
          \ date\"\n            }\n        ]\n      }\n    ]\n  },\n  \"total\": 2\n}\n"
      - lang: javascript
        source: "// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node\nvar beneficialOwnerUrl\
          \ =\n  \"https://api-sandbox.dwolla.com/beneficial-owners/176878b8-ecdb-469b-a82b-43ba5e8704b2\"\
          ;\n\ndwolla\n  .get(`${beneficialOwnerUrl}/documents`)\n  .then((res) => res.body._embedded[\"\
          documents\"][0].id); // => '56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc'\n"
      - lang: python
        source: '# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python

          beneficial_owner_url = ''https://api-sandbox.dwolla.com/beneficial-owners/176878b8-ecdb-469b-a82b-43ba5e8704b2''


          documents = app_token.get(''%s/documents'' % beneficial_owner_url)

          documents.body[''total''] # => 2

          '
      - lang: php
        source: '<?php

          // Using dwollaswagger - https://github.com/Dwolla/dwolla-swagger-php

          $beneficialOwnerUrl = ''https://api-sandbox.dwolla.com/beneficial-owners/176878b8-ecdb-469b-a82b-43ba5e8704b2'';


          $beneficialOwnersApi = new DwollaSwagger\BeneficialOwnersApi($apiClient);


          $listDocsBeneficialOwner = $beneficialOwnersApi->getBeneficialOwnerDocuments($beneficialOwnerUrl);

          $listDocsBeneficialOwner->total; # => 2

          ?>

          '
      - lang: ruby
        source: '# Using dwolla_v2 - https://github.com/Dwolla/dwolla-v2-ruby

          beneficial_owner_url = ''https://api-sandbox.dwolla.com/beneficial-owners/176878b8-ecdb-469b-a82b-43ba5e8704b2''


          documents = app_token.get "#{beneficial_owner_url}/documents"

          documents._embedded[''documents''][0].id # => "56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc"

          '
      parameters:
      - name: id
        in: path
        description: beneficial owner unique identifier
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/Accept'
      responses:
        '200':
          description: successful operation
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/Documents'
        '403':
          description: Forbidden
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
        '404':
          description: Not Found
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
    post:
      tags:
      - documents
      summary: Create a document for beneficial owner
      description: Uploads an identity verification document for a beneficial owner using multipart form-data.
        Required when a beneficial owner has "document" status during the business verification process.
      operationId: createBeneficialOwnerDocument
      x-speakeasy-group: beneficialOwners.documents
      x-speakeasy-name-override: create
      x-codeSamples:
      - lang: bash
        source: 'curl -X POST

          \ -H "Authorization: Bearer tJlyMNW6e3QVbzHjeJ9JvAPsRglFjwnba4NdfCzsYJm7XbckcR"

          \ -H "Accept: application/vnd.dwolla.v1.hal+json"

          \ -H "Cache-Control: no-cache"

          \ -H "Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW"

          \ -F "documentType=passport"

          \ -F "file=@foo.png"

          \ ''https://api-sandbox.dwolla.com/beneficial-owners/1de32ec7-ff0b-4c0c-9f09-19629e6788ce/documents''


          ...


          HTTP/1.1 201 Created

          Location: https://api-sandbox.dwolla.com/documents/11fe0bab-39bd-42ee-bb39-275afcc050d0

          '
      - lang: javascript
        source: "// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node\n// Using form-data - https://github.com/form-data/form-data\
          \ (Not Maintained By Dwolla)\nvar beneficialOwnerUrl = \"https://api-sandbox.dwolla.com/beneficial-owners/1DE32EC7-FF0B-4C0C-9F09-19629E6788CE\"\
          ;\n\nvar requestBody = new FormData();\nbody.append(\"file\", fs.createReadStream(\"mclovin.jpg\"\
          ), {\n  filename: \"mclovin.jpg\",\n  contentType: \"image/jpeg\",\n  knownLength: fs.statSync(\"\
          mclovin.jpg\").size,\n});\nbody.append(\"documentType\", \"license\");\n\ndwolla\n  .post(`${beneficialOwnerUrl}/documents`,\
          \ requestBody)\n  .then((res) => res.headers.get(\"location\")); // => \"https://api-sandbox.dwolla.com/documents/fb919e0b-ffbe-4268-b1e2-947b44328a16\"\
          \n"
      - lang: python
        source: '# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python

          beneficial_owner_url = ''https://api-sandbox.dwolla.com/beneficial-owners/1DE32EC7-FF0B-4C0C-9F09-19629E6788CE''


          document = app_token.post(''%s/documents'' % customer_url, file = open(''mclovin.jpg'', ''rb''),
          documentType = ''license'')

          document.headers[''location''] # => ''https://api-sandbox.dwolla.com/documents/fb919e0b-ffbe-4268-b1e2-947b44328a16''

          '
      - lang: php
        source: "/**\n * No example for this language yet.\n **/\n"
      - lang: ruby
        source: '# Using dwolla_v2 - https://github.com/Dwolla/dwolla-v2-ruby

          beneficial_owner_url = ''https://api-sandbox.dwolla.com/beneficial-owners/1DE32EC7-FF0B-4C0C-9F09-19629E6788CE''


          file = Faraday::UploadIO.new(''mclovin.jpg'', ''image/jpeg'')

          document = app_token.post "#{beneficial_owner_url}/documents", file: file, documentType: ''license''

          document.response_headers[:location] # => "https://api.dwolla.com/documents/fb919e0b-ffbe-4268-b1e2-947b44328a16"

          '
      parameters:
      - name: id
        in: path
        description: beneficial owner unique identifier
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/Accept'
      requestBody:
        description: Upload a document for a beneficial owner.
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
              - documentType
              - file
              properties:
                documentType:
                  type: string
                  enum:
                  - passport
                  - license
                  - idCard
                  - other
                  example: license
                file:
                  type: string
                  format: binary
      responses:
        '201':
          description: document created
          headers:
            Location:
              $ref: '#/components/headers/Location'
        '400':
          description: Bad Request
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/MaximumNumberOfResourcesSchema'
                - $ref: '#/components/schemas/InvalidFileTypeSchema'
                - $ref: '#/components/schemas/DuplicateResourceSchema'
        '403':
          description: Forbidden
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
        '404':
          description: Not Found
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
        '413':
          description: request entity too large
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    example: fileTooLarge
                  message:
                    type: string
                    example: Document requests are limited to 10 MiB.
  /documents/{id}:
    get:
      tags:
      - documents
      summary: Retrieve a document
      description: Returns detailed information about a specific identity verification document, including
        its status, type, and verification results. Used to track document submission and verification
        progress during the business verification process.
      operationId: retrieveDocument
      x-speakeasy-name-override: get
      x-codeSamples:
      - lang: bash
        source: "GET https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\nAccept:\
          \ application/vnd.dwolla.v1.hal+json\nAuthorization: Bearer pBA9fVDBEyYZCEsLfwKehyh1RTpzjUj5KzIRfDi0wKTii7DqY\n\
          \n{\n  \"_links\": {\n    \"self\": {\n      \"href\": \"https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\"\
          \n    }\n  },\n  \"id\": \"56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\",\n  \"status\": \"pending\"\
          ,\n  \"type\": \"passport\",\n  \"created\": \"2015-09-29T21:42:16.000Z\",\n  \"documentVerificationStatus\"\
          : \"pending\"\n}\n"
      - lang: javascript
        source: "// Using dwolla-v2 - https://github.com/Dwolla/dwolla-v2-node\nvar documentUrl =\n  \"\
          https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc\";\n\ndwolla.get(documentUrl).then((res)\
          \ => res.body.type); // => \"passport\"\n"
      - lang: python
        source: '# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python

          document_url = ''https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc''


          document = app_token.get(document_url)

          document.body[''type''] # => ''passport''

          '
      - lang: php
        source: '<?php

          // Using dwollaswagger - https://github.com/Dwolla/dwolla-swagger-php

          $documentUrl = ''https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc'';


          $documentsApi = new DwollaSwagger\DocumentsApi($apiClient);


          $document = $documentsApi->getDocument($documentUrl);

          $document->type; # => "passport"

          ?>

          '
      - lang: ruby
        source: '# Using dwolla_v2 - https://github.com/Dwolla/dwolla-v2-ruby

          document_url = ''https://api-sandbox.dwolla.com/documents/56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc''


          document = app_token.get document_url

          document.type # => "passport"

          '
      parameters:
      - name: id
        in: path
        description: Document unique identifier
        required: true
        schema:
          type: string
      - $ref: '#/components/parameters/Accept'
      responses:
        '200':
          description: successful operation
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/Document'
        '403':
          description: Forbidden
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
        '404':
          description: Not Found
          headers: {}
          content:
            application/vnd.dwolla.v1.hal+json:
              schema:
                $ref: '#/components/schemas/NotFoundError'
components:
  schemas:
    Document:
      title: Document
      description: Identity verification document for a customer or beneficial owner
      type: object
      required:
      - _links
      - id
      - status
      - documentVerificationStatus
      - type
      - created
      properties:
        _links:
          type: object
          properties:
            self:
              $ref: '#/components/schemas/HalLink'
        id:
          type: string
          description: Unique identifier for the document
          example: 56502f7a-fa59-4a2f-8579-0f8bc9d7b9cc
        status:
          type: string
          description: Current status of the document upload
          enum:
          - pending
          - reviewed
          example: reviewed
        type:
          type: string
          description: Type of identity document uploaded
          enum:
          - passport
          - license
          - idCard
          - other
          example: passport
        created:
          type: string
          format: date-time
          description: ISO-8601 timestamp when the document was uploaded
          example: '2015-09-29T21:42:16.000Z'
        documentVerificationStatus:
          type: string
          description: Verification status of the document after review
          enum:
          - pending
          - accepted
          - rejected
          example: rejected
        failureReason:
          type: string
          description: Primary reason why document verification failed (if rejected)
          example: ScanDobMismatch
        allFailureReasons:
          type: array
          description: Complete list of all failure reasons if document verification was rejected
          items:
            type: object
            required:
            - reason
            - description
            properties:
              reason:
                type: string
                description: Failure reason code
                example: ScanDobMismatch
              description:
                type: string
                description: Human-readable explanation of the failure reason
                example: Scan DOB does not match DOB on account
    NotAuthorizedSchema:
      title: NotAuthorizedSchema
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: notAuthorized
        message:
          type: string
          example: Not authorized to create documents.
    InvalidFileTypeSchema:
      title: InvalidFileTypeSchema
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: invalidFileType
        message:
          type: string
          example: 'File types supported: Personal IDs - .jpg, .jpeg or .png. Business Documents - .jpg,
            .jpeg, .png, or .pdf.'
    InvalidResourceStateSchema:
      title: InvalidResourceStateSchema
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: invalidResourceState
        message:
          type: string
          example: Resource cannot be modified. Document creation not allowed for already verified Customers
            or non-verified Customer types.
    NotFoundError:
      title: NotFoundError
      description: Error response schema for 404 NotFound
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: NotFound
        message:
          type: string
          example: The requested resource was not found.
    Documents:
      title: Documents
      type: object
      required:
      - _links
      - _embedded
      - total
      properties:
        _links:
          type: object
          additionalProperties:
            $ref: '#/components/schemas/HalLink'
        _embedded:
          type: object
          required:
          - documents
          properties:
            documents:
              type: array
              items:
                $ref: '#/components/schemas/Document'
        total:
          type: integer
          example: 2
    DuplicateResourceSchema:
      title: DuplicateResourceSchema
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: DuplicateResource
        message:
          type: string
          example: 'Bank already exists: id=df8392e5-4c06-42ed-b247-c098ed6f5a11'
        _links:
          type: object
          properties:
            about:
              type: object
              properties:
                href:
                  type: string
                  example: https://api.dwolla.com/funding-sources/df8392e5-4c06-42ed-b247-c098ed6f5a11
                type:
                  type: string
                  example: application/vnd.dwolla.v1.hal+json
                resource-type:
                  type: string
                  example: funding-source
    HalLink:
      title: HalLink
      type: object
      properties:
        href:
          type: string
          example: https://api.dwolla.com
        type:
          type: string
          example: application/vnd.dwolla.v1.hal+json
        resource-type:
          type: string
          example: resource-type
    MaximumNumberOfResourcesSchema:
      title: MaximumNumberOfResourcesSchema
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: maximumNumberOfResources
        message:
          type: string
          example: Max of four files upload allowed. Please wait for Dwolla to manually check the documents.
    ForbiddenError:
      title: ForbiddenError
      description: Error response schema for 403 Forbidden
      type: object
      required:
      - code
      - message
      properties:
        code:
          type: string
          example: Forbidden
        message:
          type: string
          example: The supplied credentials are not authorized for this resource.
  parameters:
    Accept:
      name: Accept
      in: header
      required: true
      description: The media type of the response. Must be application/vnd.dwolla.v1.hal+json
      schema:
        type: string
        enum:
        - application/vnd.dwolla.v1.hal+json
        default: application/vnd.dwolla.v1.hal+json
  headers:
    Location:
      description: The location of the created resource
      schema:
        type: string
  securitySchemes:
    clientCredentials:
      type: oauth2
      flows:
        clientCredentials:
          tokenUrl: /token
          x-speakeasy-token-endpoint-authentication: client_secret_basic
          scopes: {}