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

# List drivers

> List the drivers this DataSource is configured with, by brand list

API versions: v1 (current) https://docs.odysseysignal.com/api/reference/list-drivers.md

`GET /v1/signals/{signal_id}/datasources/{datasource_id}/drivers`

A driver list belongs to the brand list it serves, and the data project says how it is read — the attributes of survey questions, or a manually authored list. Only brand lists this Signal can reach are listed.

Authentication: an API key in `X-Api-Key`, or `Authorization: Bearer <token>`.

## Parameters

### Path parameters

- `signal_id` (string, required)
- `datasource_id` (string, required)

## Example request

```bash
curl "https://api.odysseysignal.app/v1/signals/{signal_id}/datasources/{datasource_id}/drivers" \
  -H "X-Api-Key: $ODYSSEY_API_KEY"
```

## Response 200

Content: `application/json`. The drivers a DataSource is configured with, by brand list.

**Grouped by brand list and then by set, never flattened.** A driver id is
unique only within its set — two questions both number their attributes
from 1 — so a union keyed on id would merge two drivers into one row. A
brand list with no driver list configured is absent rather than listed
empty.

- `environment` (string, nullable): The data environment the answer was read in, `prod` or `test`: the one Odyssey set on the Signal, or the one an Odyssey person picked for this call.
- `datasource_id` (string, required)
- `count` (integer, required)
- `driver_lists` (array of objects, required)
  - `brand_list_id` (string, required): The brand list these drivers serve — the driver list's identity.
  - `label` (string, nullable): What the brand list is called.
  - `dataset_ids` (array of string, required): DataSets on this DataSource scoped to this brand list.
  - `source` (string, required): question | manual — how the data project says the drivers are read.
  - `count` (integer, required): Drivers listed, across every set.
  - `demand_spaces` (array of objects, required): Shared across the sets: a demand space groups drivers from several questions. Empty where none are defined.
    - `id` (integer, required)
    - `label` (string, required)
  - `sets` (array of objects, required)
    - `id` (string, required): The question the drivers were asked in — spelled as the perception metric over it is keyed — or, for a manual list, the type.
    - `type` (string, nullable): relevance (functional) | relation (emotional) | identity | …, where it is authored. Null for a survey set: the survey does not define one.
    - `count` (integer, required)
    - `drivers` (array of objects, required)
      - `id` (integer, required): The attribute id a driver filter takes. Unique only within its set.
      - `label` (string, required)
      - `description` (string, nullable): The full wording, or the authored definition of what counts as this driver.
      - `demand_space_id` (integer, nullable): The demand space it rolls up into; null when ungrouped.

## Errors

Errors are `application/problem+json` (RFC 9457): `type`, `title`, `status`, `detail` and, for some, more fields that say how to fix the call. The `type` is `https://api.odysseysignal.app/problems/<code>`.

| Status | Code | When |
|---|---|---|
| 400 | `invalid-request` | The request is not valid for this DataSet; `detail` says why. |
| 401 | `unauthorized` | No credential, or one that is not accepted. |
| 403 | `forbidden` | The credential is valid but does not cover what was asked. |
| 404 | `not-found` | Nothing there, or nothing this credential may read. |
| 422 | `validation-failed` | The request does not match the contract; `errors` lists each field. |
| 429 | `rate_limited` | Too many requests, or the monthly quota is used up. |
| 503 | `unavailable` | A service behind the API did not answer; try again. |
