> ## 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.

# 🖋️ Associated Person Signature (UBO Cédula)

> Business users doing a cross-ramp in Mexico must have every beneficial owner (UBO) digitally sign a cédula. Learn when it's required, how to collect it, and how to know when it's done.

***

## Overview

For **business** users, Mexican regulation (art. 95 Bis LGOAAC) requires every Ultimate Beneficial Owner (UBO) — anyone with significant ownership or control over the business — to sign a **cédula**, a beneficial-owner declaration. Capa generates this document, hosts the digital signature session, and tracks its status per owner.

This applies specifically to **cross-ramp transactions in MXN**: a business user cannot create a cross-ramp transaction involving MXN until every UBO on record has signed their cédula.

<Note>This requirement is rolled out per environment. If your account doesn't yet require it, [Request Beneficial Owner Signatures](/reference/associatedpersonpartnercontrollerv2_requestuboformsignatures) and [Get Beneficial Owner Signature Status](/reference/associatedpersonpartnercontrollerv2_listuboformsignatures) still work — signatures collected ahead of time are honored once enforcement is turned on for your account.</Note>

## When Is It Required?

A cross-ramp transaction is blocked until every UBO has signed when **all** of the following hold:

* The user is of type `BUSINESS`.
* The cross-ramp involves **MXN** as either the source or target currency.

If the currency isn't MXN, or the user is an `INDIVIDUAL`, this requirement doesn't apply and cross-ramp creation proceeds normally.

## Integration Flow

<Steps>
  <Step title="Create the business user and complete KYB">
    [Create User](/reference/userpartnercontrollerv2_createuser) with `type: "BUSINESS"`, then complete [KYB verification](/reference/kybpartnercontrollerv2_submitbusinessprofile) for `country: "MX"`
  </Step>

  <Step title="Register each beneficial owner">
    Make sure every UBO is on record as an associated person with `UBO` included in `roles` and a valid `email` set
  </Step>

  <Step title="Request the cédula signatures">
    [Request Beneficial Owner Signatures](/reference/associatedpersonpartnercontrollerv2_requestuboformsignatures) with `country: "MX"`. Capa returns a `signingUrl` per owner.
  </Step>

  <Step title="Deliver each signingUrl to its owner">
    Capa does not email the owners — share each `signingUrl` with the corresponding UBO through your own channel (email, SMS, in-app).
  </Step>

  <Step title="Track completion">
    Poll [Get Beneficial Owner Signature Status](/reference/associatedpersonpartnercontrollerv2_listuboformsignatures), or listen for the [`DOCUMENT_SIGNED` webhook](#webhook-notification), until every UBO shows `SIGNED`
  </Step>

  <Step title="Create the cross-ramp">
    [Create Cross-Ramp](/reference/crossramppartnerv2controller_createpartnercrossramp) now succeeds for MXN
  </Step>
</Steps>

## Beneficial Owners (Associated Persons)

A UBO is any associated person recorded for the business whose `roles` includes `UBO`. Only people with this role are asked to sign a cédula — other roles (`LEGAL_REP`, `SIGNER`, `CONTROL_PERSON`, `RESOURCE_PROVIDER`) are not.

<Note>Every UBO must have an `email` set — Capa's signature provider uses it to identify the signer, and there is no fallback to a shared business email. Whether someone counts as a UBO is entirely determined by whether `UBO` is included in their `roles`; there is no ownership-percentage threshold enforced by the API.</Note>

## Requesting Signatures

Call [Request Beneficial Owner Signatures](/reference/associatedpersonpartnercontrollerv2_requestuboformsignatures) to generate a cédula signing link for every `UBO`-role associated person who doesn't already have one:

```
POST /api/partner/v2/users/{userId}/associated-persons/signatures
```

```json theme={null}
{
  "country": "MX"
}
```

Key behavior:

* **MX only.** `country` must be `MX`.
* **Idempotent.** An owner with an already-`PENDING` or `SIGNED` cédula is left alone — calling this again never issues a second link for the same person. This makes it safe to call after adding a new UBO: only the new owner gets a fresh link.
* **Per-owner failures don't block the batch.** A business must have at least one UBO on record (and no more than 25 in a single call); beyond that, an individual owner missing an `email` shows up as an `error` in the response rather than failing the whole request.
* The business must already be **KYB-verified for MX**.
* **Capa sends no email or SMS.** Your integration is responsible for delivering each `signingUrl` to its owner, and for treating it as sensitive — whoever holds the link can sign as that person.

## Checking Signature Status

Poll [Get Beneficial Owner Signature Status](/reference/associatedpersonpartnercontrollerv2_listuboformsignatures) to check progress:

```
GET /api/partner/v2/users/{userId}/associated-persons/signatures
```

The response lists **every** `UBO`-role associated person on record — including any who were never sent a cédula, whose entry simply carries no `status`. This keeps a "short list" from being mistaken for completion after a new owner is added.

| `status`   | Meaning                                                                                          |
| ---------- | ------------------------------------------------------------------------------------------------ |
| *(absent)* | No cédula has been requested yet for this owner, or the request failed (see `error`/`errorCode`) |
| `PENDING`  | Requested — the owner has not yet signed. `signingUrl` is included.                              |
| `SIGNED`   | Complete. `signingUrl` is withheld once signed.                                                  |

The cross-ramp requirement is satisfied once **every UBO on record reports `SIGNED`**.

## Enforcement on Cross-Ramp

[Create Cross-Ramp](/reference/crossramppartnerv2controller_createpartnercrossramp) rejects the request if any UBO signature is still outstanding for an MXN cross-ramp:

| HTTP Status | Code                            | Message                                                                                                           |
| ----------- | ------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| 403         | `SIGNATURE_REQUIREMENT_NOT_MET` | "User is not allowed to perform the operation because a required signature is outstanding for BENEFICIAL\_OWNER." |

If you see this error, call [Get Beneficial Owner Signature Status](/reference/associatedpersonpartnercontrollerv2_listuboformsignatures) to see which owner(s) are still pending, and make sure they've received their `signingUrl`.

## Webhook Notification

When a UBO signs their cédula, Capa sends a webhook notification once the signature is confirmed:

```json JSON theme={null}
{
  "type": "SIGNATURE",
  "event": "DOCUMENT_SIGNED",
  "userId": "8374f327-38bd-4b0b-b8a7-2524599eb903",
  "externalUserId": "customer_1753744084024",
  "partnerId": "b1f2c3d4-5678-4abc-8def-1234567890ab",
  "subject": "BENEFICIAL_OWNER",
  "templateKey": "CEDULA",
  "signature": {
    "associatedPersonId": "a1b2c3d4-5678-4abc-8def-1234567890ab",
    "status": "SIGNED",
    "result": "SUCCESS",
    "country": "MX",
    "signedAt": "2026-09-08T14:32:00.000Z"
  }
}
```

| Field                | Description                                                                                                                                                                                                  |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `subject`            | `BENEFICIAL_OWNER` for a UBO cédula. (The same event/`type` combination is also used when a business's own agreement is signed, with `subject: "USER"` — filter on `subject`, not on a separate event name.) |
| `signature.result`   | `SUCCESS` or `PENDING_REVIEW`. **Treat both as signed** — `PENDING_REVIEW` means only Capa's internal compliance review is still outstanding, not that the owner needs to do anything further.               |
| `signature.signedAt` | May be absent in rare cases where the signing provider's webhook couldn't be fully parsed.                                                                                                                   |

This event fires once per signature — a redelivered or duplicate provider webhook onto an already-`SIGNED` record does not re-fire it. As with all Capa webhooks, ensure your [Webhook Settings](/reference/partnerwebhooksettingsv2controller_update) are configured to receive it, and treat [Get Beneficial Owner Signature Status](/reference/associatedpersonpartnercontrollerv2_listuboformsignatures) as the source of truth if a webhook is ever missed — see [How Our Webhooks Work](/docs/how-our-webhooks-work).

***

## What's Next

* [Request Beneficial Owner Signatures](/reference/associatedpersonpartnercontrollerv2_requestuboformsignatures)
* [Get Beneficial Owner Signature Status](/reference/associatedpersonpartnercontrollerv2_listuboformsignatures)
* [Cross-Ramp](/docs/cross-ramp)
* [Submit Business Profile (KYB)](/reference/kybpartnercontrollerv2_submitbusinessprofile)
