> ## 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.

# Get datasource

> Describe one DataSource: its type and the DataSets available on it

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

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

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}" \
  -H "X-Api-Key: $ODYSSEY_API_KEY"
```

## Response 200

Content: `application/json`. One DataSource, in the same shape as in the listing.

- `id` (string, required)
- `type` (string, required): data_project today. The discriminator that keeps this contract open to other kinds of source.
- `label` (string, required): What to show. The Signal's own label, falling back to the DataSource's name, so there is always something to display.
- `datasets` (array of objects, required): DataSets readable on this DataSource, each with where to describe it.
  - `key` (string, required): Address of the DataSet in the URL path.
  - `name` (string, required): What to call it. For Perception this is authored per brand list — *Organisations*, *Products* — which is the only thing that tells two perception datasets apart; the built-in datasets carry their own.
  - `description` (string, nullable): What it holds, where somebody wrote it down.
  - `url` (string, required): Where to describe it: its metrics, dimensions and period.
- `markets` (array of objects, required): Markets readable on this DataSource.
  - `id` (integer, required): The market id on this DataSource, not a global scheme: Sweden can be 2 here and 752 on another DataSource.
  - `label` (string, required): Falls back to the id where the DataSource's registry does not name it, so a market never disappears from the list over a labelling gap.
- `language` (string, nullable): The language labels and verbatims come back in.
- `url` (string, nullable): Where to describe this DataSource, including the address of each of its DataSets.
- `entities_url` (string, nullable): Where the brands this DataSource carries are listed, by brand list. A roster belongs to a brand list rather than to a DataSet, so it is published once here.
- `drivers_url` (string, nullable): Where the drivers configured for this DataSource are listed, by brand list. Like the brand roster, a driver list belongs to a brand list rather than to a DataSet.
- `periods_url` (string, nullable): Where this DataSource's periods are listed — in total and per DataSet.

## 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. |
