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

# Get Beneficial Owner Signature Status

> Read-only, so it is the endpoint to poll. Every beneficial owner appears, including those never asked for a cédula, which carry no status — a caller who added an owner since their last request would otherwise see a short list and believe they were done. Every owner reporting SIGNED is what satisfies the requirement.

Returns where every `UBO`-role associated person stands on their cédula. Read-only — this is the endpoint to poll, and it's also the safest fallback for the [`DOCUMENT_SIGNED` webhook](/docs/associated-person-signature#webhook-notification).

***

## Important Notes

* **Every UBO appears**, including those never asked for a cédula — those entries carry no `status`. This avoids a caller believing they're done because a short list came back, after adding a new owner since their last request.
* `status` is `PENDING` (awaiting signature) or `SIGNED` (complete). A missing `status` means no cédula was ever requested for that owner, or that requesting one previously failed (see `error`/`errorCode`).
* **Every owner reporting `SIGNED` is what satisfies the [cross-ramp signature requirement](/docs/associated-person-signature#enforcement-on-cross-ramp)** — poll this endpoint until every UBO shows `SIGNED`.
* `signingUrl` is only present while `status` is `PENDING`; it's withheld once `SIGNED`.

***

## Error Codes

### Common Errors

| HTTP Status | Code                   | Message                            |
| ----------- | ---------------------- | ---------------------------------- |
| 401         | `UNAUTHORIZED`         | "API Key is missing"               |
| 401         | `UNAUTHORIZED`         | "Invalid API Key format"           |
| 401         | `UNAUTHORIZED`         | "Invalid API Key"                  |
| 403         | `INVALID_PARTNER_FLOW` | "The partner has an invalid flow." |

### User Ownership Errors

| HTTP Status | Code           | Message                                              |
| ----------- | -------------- | ---------------------------------------------------- |
| 401         | `UNAUTHORIZED` | "Partner information is required for this operation" |
| 401         | `UNAUTHORIZED` | "User is not associated with the partner"            |

### Endpoint-Specific Errors

| HTTP Status | Code                    | Message                  |
| ----------- | ----------------------- | ------------------------ |
| 422         | `UNPROCESSABLE_ENTITY`  | "User is not a business" |
| 500         | `INTERNAL_SERVER_ERROR` | "Internal server error"  |


## OpenAPI

````yaml reference/openapi/AssociatedPersonPartnerControllerV2_listUboFormSignatures.json GET /api/partner/v2/users/{userId}/associated-persons/signatures
openapi: 3.0.0
info:
  title: Capa Partner API - V2
  description: >-
    Partner API for integrating cryptocurrency on-ramp and off-ramp services
    using Capa's infrastructure. Enable your users to seamlessly convert between
    fiat and crypto.
  version: v2
  contact: {}
servers:
  - url: https://api.sandbox.capa.fi
  - url: https://production-api.capa.fi
security: []
paths:
  /api/partner/v2/users/{userId}/associated-persons/signatures:
    get:
      tags:
        - users
      summary: Get where every beneficial owner stands on their cédula
      description: >-
        Read-only, so it is the endpoint to poll. Every beneficial owner
        appears, including those never asked for a cédula, which carry no status
        — a caller who added an owner since their last request would otherwise
        see a short list and believe they were done. Every owner reporting
        SIGNED is what satisfies the requirement.
      operationId: AssociatedPersonPartnerControllerV2_listUboFormSignatures
      parameters:
        - name: userId
          required: true
          in: path
          description: The user's Capa ID
          schema:
            type: string
            format: uuid
      responses:
        '200':
          description: One entry per beneficial owner on record for the business.
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
                  data:
                    type: object
                    properties:
                      count:
                        type: number
                        description: Number of beneficial owners matching the query
                      total:
                        type: number
                        description: Number of beneficial owners on record
                      data:
                        type: array
                        items:
                          type: object
                          properties:
                            associatedPersonId:
                              type: string
                              format: uuid
                              description: >-
                                The beneficial owner this cédula belongs to —
                                the same id returned by GET
                                /users/{userId}/associated-persons
                            name:
                              type: string
                              description: The beneficial owner's full name
                            status:
                              type: string
                              enum:
                                - PENDING
                                - SIGNED
                                - EXPIRED
                                - DELETED
                              description: >-
                                Absent when no cédula has been requested for
                                this owner, or when requesting one failed — see
                                error. PENDING means requested and awaiting
                                their signature; SIGNED means complete.
                            signingUrl:
                              type: string
                              description: >-
                                Where the owner completes and signs the form.
                                Present only while PENDING, and withheld once
                                SIGNED. Capa sends no email, so delivering this
                                to the owner is entirely the caller's
                                responsibility — and anyone holding it can sign
                                as that owner, so it should not be logged or
                                shared beyond them.
                            signedAt:
                              type: string
                              format: date-time
                              description: When the owner signed.
                            error:
                              type: string
                              description: >-
                                Why this owner has no cédula on record, when
                                requesting one failed — for example no email
                                address on file.
                            errorCode:
                              type: string
                              description: >-
                                A stable code for the same failure, so it can be
                                handled without matching on the message.
                          required:
                            - associatedPersonId
                            - name
                          x-readme-ref-name: AssociatedPersonSignatureHttpResponse
                    required:
                      - count
                      - total
                      - data
                    x-readme-ref-name: ListAssociatedPersonSignaturesHttpResponse
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                UNAUTHORIZED:
                  value:
                    success: false
                    code: UNAUTHORIZED
                    message: API Key is missing
                UNAUTHORIZED_2:
                  value:
                    success: false
                    code: UNAUTHORIZED
                    message: Invalid API Key format
                UNAUTHORIZED_3:
                  value:
                    success: false
                    code: UNAUTHORIZED
                    message: Invalid API Key
                UNAUTHORIZED_4:
                  value:
                    success: false
                    code: UNAUTHORIZED
                    message: Partner information is required for this operation
                UNAUTHORIZED_5:
                  value:
                    success: false
                    code: UNAUTHORIZED
                    message: User is not associated with the partner
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                code: INVALID_PARTNER_FLOW
                message: The partner has an invalid flow.
        '422':
          description: Unprocessable Entity
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                code: UNPROCESSABLE_ENTITY
                message: User is not a business
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                success: false
                code: INTERNAL_SERVER_ERROR
                message: Internal server error
      security:
        - PartnerApiKey: []
components:
  schemas:
    ErrorResponse:
      type: object
      properties:
        success:
          type: boolean
          example: false
        code:
          type: string
          description: Machine-readable error code.
        message:
          type: string
          description: Human-readable error message.
        errors:
          type: array
          description: Optional per-field validation details.
          items:
            type: object
            properties:
              field:
                type: string
              message:
                type: string
      required:
        - success
        - code
        - message
  securitySchemes:
    PartnerApiKey:
      type: apiKey
      in: header
      name: partner-api-key
      description: API key for the affiliated partner performing the request.

````