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

# API Conventions

> Request, response, pagination, time and error conventions

<div style={{ width: '100%', height: 240, marginBottom: 32, borderRadius: 16, overflow: 'hidden', position: 'relative' }}>
  <video style={{ width: '100%', height: '100%', objectFit: 'cover', filter: 'sepia(0.3) saturate(1.5) hue-rotate(-14deg) brightness(0.72) contrast(1.12)' }} autoPlay loop muted playsInline>
    <source src="https://mintcdn.com/vero-fa5575b5/G_sL_RHXpWEXOwUp/images/bg_video.mp4?fit=max&auto=format&n=G_sL_RHXpWEXOwUp&q=85&s=f731a6a676fb99a2368193fbaf3281ee" type="video/mp4" data-path="images/bg_video.mp4" />
  </video>
</div>

<div style={{ width: '100%', height: 4, marginBottom: 24, borderRadius: 2, background: 'rgba(0,0,0,0.08)' }}>
  <div style={{ width: '37.5%', height: '100%', borderRadius: 2, background: 'linear-gradient(90deg, var(--accent-primary) 0%, var(--accent-light) 50%, var(--accent-dark) 100%)' }} />
</div>

## Base URL and authentication

Use the public base URL and send your API key in the header provided during onboarding.

```bash theme={null}
curl --request GET   --url "https://api-gw.verolabs.co/v1/instruments?limit=5"   --header "X-API-KEY: $API_KEY"
```

## Response shape

List endpoints return an object with `data`. Cursor-paginated endpoints may also return `next_cursor`.

```json theme={null}
{
  "data": [
    { "symbol": "BTCUSDT" }
  ],
  "next_cursor": "..."
}
```

Detail endpoints return one resource object.

## Pagination

| Param    | Meaning                                                    |
| -------- | ---------------------------------------------------------- |
| `limit`  | Maximum number of items returned in one request            |
| `cursor` | Token returned as `next_cursor` from the previous response |

<Info>
  Cursors are opaque. Clients should not decode or generate cursor values.
</Info>

## Time parameters

`from` and `to` must use ISO 8601 UTC format.

| Valid                      | Invalid                     |
| -------------------------- | --------------------------- |
| `2026-05-15T00:00:00Z`     | `2026-05-15 00:00:00`       |
| `2026-05-15T00:00:00.123Z` | `2026-05-15T07:00:00+07:00` |

## Error format

Errors use a JSON problem format.

```json theme={null}
{
  "type": "invalid-param",
  "title": "Invalid query parameter",
  "status": 400,
  "detail": "param 'from' is required"
}
```

| Status | Meaning                              |
| ------ | ------------------------------------ |
| `400`  | Missing or invalid request parameter |
| `401`  | Missing or invalid credential        |
| `404`  | Resource not found                   |
| `422`  | Valid format but unsupported value   |
| `429`  | Account request limit exceeded       |
| `503`  | API temporarily unavailable          |
