> From TickerLayer docs, Perpetuals: https://tickerlayer.com/docs/products/perpetuals#perpetuals-symbols-sources
> REST base URL https://api.tickerlayer.com, API key in the `x-api-key` header. WebSocket wss://stream.tickerlayer.com?apiKey=YOUR_API_KEY. Full API reference: https://tickerlayer.com/llms-full.txt

## Symbol and source universe

**Endpoint:** `GET /perpetuals/symbols?sources=true`

The symbol list with every source row each symbol can deliver. Needs source-level access. Poll it, for example once an hour, and diff it to learn about a new symbol, a new source row or a removed one before it reaches your ingest.

### Request

```bash
curl -sS "https://api.tickerlayer.com/perpetuals/symbols?sources=true" \
  -H "x-api-key: <YOUR_API_KEY>"
```

```python
import requests

res = requests.get(
    "https://api.tickerlayer.com/perpetuals/symbols?sources=true",
    headers={"x-api-key": "<YOUR_API_KEY>"},
)
print(res.json())
```

```javascript
const res = await fetch("https://api.tickerlayer.com/perpetuals/symbols?sources=true", {
  headers: { "x-api-key": "<YOUR_API_KEY>" },
});
const data = await res.json();
console.log(data);
```

```go
req, _ := http.NewRequest("GET", "https://api.tickerlayer.com/perpetuals/symbols?sources=true", nil)
req.Header.Set("x-api-key", "<YOUR_API_KEY>")
```

### Response

```json
{
  "symbols": [
    {
      "symbol": "BNBUSDT",
      "name": "BNB",
      "instrument_type": "perpetual",
      "underlying_asset_class": "crypto",
      "base": "BNB",
      "source_count": 6,
      "sources": [
        {
          "source_id": "pv_01",
          "venue_symbol": "BNBUSDT",
          "native_currency": "USDT",
          "market_type": "perpetual",
          "in_composite": true
        },
        {
          "source_id": "pv_07",
          "venue_symbol": "BNBUSDT",
          "native_currency": "USDT",
          "market_type": "spot",
          "in_composite": false
        }
      ]
    }
  ],
  "count": 266
}
```

### Notes

`source_id` values are permanent. `in_composite` is the fixed rule for that row, not a live verdict. A symbol that exists only as a spot row is listed with `instrument_type: spot` and answers with an empty composite and its source rows. Additions are also announced in the docs updates rail.
