The Propper API lets your own website, back office or automation talk to the
platform. Everything runs on one host:

```
https://api.proppertrading.com/v1
```

There is no propfirm identifier anywhere in a URL. The API key you send decides
which firm the request acts for, so a key from one firm can never read or change
another firm's data.

## Your first request

```bash
curl https://api.proppertrading.com/v1/ping \
  -H "Authorization: Bearer sk_live_a1b2c3d4_9f83c2e15b7a4d6e8091c3f5a7b9d1e2"
```

```json
{
    "data": {
        "ok": true,
        "environment": "live",
        "api_key": "a1b2c3d4",
        "scopes": ["affiliates:write"],
        "tenant": { "name": "Acme Funded", "slug": "acme" },
        "time": "2026-08-03T12:00:00+00:00"
    },
    "meta": { "request_id": "req_01kz4bkr1aj1gv63d8fv3133ey" }
}
```

If that works, your key is valid and you can see exactly which scopes it carries.

## What to read next

- [Authentication](/docs/api/authentication) - how keys work and how to keep them safe.
- [Errors](/docs/api/errors) - the error shape and every code we can return.
- [Idempotency](/docs/api/idempotency) - required on every POST.
- [Pagination](/docs/api/pagination) - how to walk a list safely.

## Conventions

Every response uses the same envelope. Success:

```json
{
    "data": {},
    "meta": { "request_id": "req_01kz4bkr1aj1gv63d8fv3133ey" }
}
```

Failure:

```json
{
    "error": {
        "type": "invalid_request_error",
        "code": "email_already_registered",
        "message": "This email address already has a reserved referral code.",
        "request_id": "req_01kz4bkr1aj1gv63d8fv3133ey"
    }
}
```

- All timestamps are ISO-8601 in UTC.
- All ids are strings carrying a prefix that tells you the type, such as `aff_pre_`.
- Only `application/json` request bodies are accepted.
- Every response carries an `X-Request-Id` header that matches `meta.request_id`.
  Quote it when you contact support and we can find the exact request.

:::tip Reading this with an AI
Every page here is available as markdown by adding `.md` to its URL, for example
[/docs/api/errors.md](/docs/api/errors.md). [/docs/llms.txt](/docs/llms.txt)
lists all of them in one file.
:::