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

# POST /v2/trade/perps/accounts: Enrol a User

> Enrol the user on Polymarket Perps with your attestation of their jurisdiction. Bravado supplies the wallet. Scope trade.perps.

> [!NOTE]
>
> Sign each request with a fresh HMAC signature. The cURL and HTTP header values below are placeholders, not reusable credentials. For runnable signing code, use [request signing examples](https://docs.bravadotrade.com/authentication-examples.md).

Takes your attestation of where the end user is. Bravado supplies the user's wallet; you send only the attestation. Scope `trade.perps`; `Idempotency-Key` is required.

Perps is for deposit-wallet (V2) users only. A user still on a V1 Safe gets `409 USER_PROVISIONING_PENDING` with `reason: "v2_wallet_required"`. Migrate the user first.

```text theme={null}
POST https://partner-api.bravadotrade.com/v2/trade/perps/accounts
```

### Body

**attestation** `object` *required*

**attestation fields**

**jurisdiction** `string` *required*

ISO-3166-1 alpha-2 of the end user, for example `BR`.

**subdivision** `string | null`

ISO-3166-2 when you know it, for example `UA-43`.

**method** `string` *required*

`kyc` or `ip_self_declaration`.

**attested\_at** `string` *required*

ISO-8601 instant of the attestation.

**attestation\_version** `string` *required*

Your attestation's version label, 1 to 32 characters.

**partner\_signer** `string` *required*

Who at your company attests, 1 to 128 characters.

After enrolling, read [`GET /v2/trade/perps/readiness`](https://docs.bravadotrade.com/api/trade/perps/readiness) for the next step.

### Attestation age

An attestation older than 180 days makes opens answer `409 USER_PROVISIONING_PENDING` with `reason: "attestation_stale"`. Call this route again with a fresh attestation, under a new `Idempotency-Key`.

### Errors

| Status | When |
| - | - |
| `400 Bad Request` | `INVALID_BODY`: a field outside the shapes above |
| `403 Forbidden` | `GEO_BLOCKED`: the attested jurisdiction cannot trade perps. The user is never enrolled |
| `409 Conflict` | `USER_PROVISIONING_PENDING` with `reason: "v2_wallet_required"`: migrate the user to a deposit wallet first |
| `409 Conflict` | `USER_PROVISIONING_PENDING` with `reason: "enrolment_in_progress"` and `Retry-After: 5`: another enrolment for this user is running. **The key is kept**, so a retry with the same key replays this `409`. Wait, then read readiness |

Every Perps code and its retry rule: [Errors](https://docs.bravadotrade.com/api/trade/perps.md#errors).

### Example

```bash cURL theme={null}
curl -X POST https://partner-api.bravadotrade.com/v2/trade/perps/accounts \
  -H "X-BRAVADO-API-KEY: $BRAVADO_API_KEY" \
  -H "X-BRAVADO-TIMESTAMP: <unix-ms>" \
  -H "X-BRAVADO-SIGNATURE: <signature-for-this-request>" \
  -H "Idempotency-Key: 7c1e9a52-perps-enrol-user-42" \
  -H "Content-Type: application/json" \
  -d '{
    "attestation": {
      "jurisdiction": "BR",
      "subdivision": null,
      "method": "kyc",
      "attested_at": "2026-10-23T14:00:00Z",
      "attestation_version": "v1",
      "partner_signer": "compliance@yourcompany.com"
    }
  }'
```

## Related

* [`GET /v2/trade/perps/readiness`](https://docs.bravadotrade.com/api/trade/perps/readiness) for the user's state after enrolment.
* [`POST /v2/trade/perps/deposits`](https://docs.bravadotrade.com/api/trade/perps/deposit) to fund the account.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.