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

> ## Agent Instructions
> Video walkthroughs: the Dimension product overview video (https://www.youtube.com/watch?v=Mx8rg5wfkU0, also embedded at https://docs.dimension.io/overview) is the first of a series. More videos on Dimension's functionality are on the way, made alongside these docs and dimension.io. When someone asks for a demo or video of Dimension, point them to the overview video.

# Detail Requests

> The list + detail pattern — fetch a list of IDs, then per-record detail from a second endpoint

A **Detail Request** is the second HTTP call in a Data Feed. It runs **once per record** returned by the primary **Data Request**, using values captured from the primary response to construct each detail call.

Use it whenever a source's list endpoint returns thin records (IDs + names) and a separate per-record endpoint returns the full payload.

## When you need a Detail Request

| Source pattern | Detail Request? |
| - | - |
| `GET /users` returns full user records with every field | ❌ No — primary Data Request is enough |
| `GET /users` returns `[{ id, name }]`, `GET /users/{id}` returns full detail | ✓ Yes |
| `GET /incidents` returns IDs only, `GET /incidents/{id}` returns the full incident | ✓ Yes |
| GraphQL queries that already include nested fields | ❌ No — use the primary Data Request with a fuller query |
| API with separate `/items` + `/items/{id}/permissions` endpoints | ✓ Yes — permissions become the Detail |

## Anatomy

Click the **+** under the Data Request node (**Add Detail Request**) to add one. The editor canvas then shows both nodes:

![Data feed editor for CISA Known Exploited Vulnerabilities with Trigger, Data Request and Detail Request nodes: the Detail Request has a GET method, a URL placeholder https://api.example.com/data/\{\{id}} that uses the id captured by the Data Request, and an Add button](https://mintcdn.com/threataware-labs/JizGYqEeTbHV_69f/images/data-feed-detail-request.png?fit=max\&auto=format\&n=JizGYqEeTbHV_69f\&q=85\&s=befbfb6181d7f31a627fb026082546ad)

The Detail Request opens with the same method picker (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS) and URL field as a Data Request, plus a single **+ Add** button for adding optional sections (Headers, Authorization, Params, Body, etc.). The URL field accepts `{{variable}}` interpolation from values captured on the primary Data Request.

## Variables you can interpolate

The Detail Request URL, params, and body can interpolate any variable captured from the primary Data Request via the **Capture Variables** section.

The implicit default capture is the **ID** (from the **ID Path** on the primary). The variable name is `id`:

```text theme={null}
Detail Request URL:
https://api.example.com/items/{{id}}
```

You can capture more — useful when the detail endpoint needs additional context:

| Primary record | Capture Variables | Detail URL template |
| - | - | - |
| `{ "id": "1", "slug": "alice" }` | `id` (default), `slug` from `$.slug` | `https://api.example.com/users/{{slug}}/profile` |
| `{ "device_id": "abc", "tenant": "acme" }` | `id` from `$.device_id`, `tenant` from `$.tenant` | `https://api.example.com/{{tenant}}/devices/{{id}}` |
| `{ "id": "1", "_links": { "permissions": "/items/1/perms" } }` | `id`, `perms_url` from `$._links.permissions` | `https://api.example.com{{perms_url}}` |

Variables work in the **URL**, **Headers**, **Params**, and **Body** of the Detail Request — anywhere you can type, `{{var}}` interpolates.

## Worked example — GitHub repos + their branches

Primary endpoint returns a list of repos:

```json theme={null}
[
  { "id": 1, "full_name": "threataware/labs", "default_branch": "main" },
  { "id": 2, "full_name": "threataware/docs", "default_branch": "main" }
]
```

You want each row to include the count of branches. Branches live at `GET /repos/{owner}/{repo}/branches`.

**Configuration:**

| Field | Value |
| - | - |
| Primary URL | `https://api.github.com/orgs/threataware/repos` |
| Primary Auth | Bearer Token |
| Primary Data Path | `$` (root array) |
| Primary ID Path | `id` |
| **Capture Variables** | `full_name` from `$.full_name` |
| Detail Request Method | GET |
| Detail Request URL | `https://api.github.com/repos/{{full_name}}/branches` |
| Detail Request Auth | Inherit from parent |

**Composer prompt:**

```text theme={null}
"Connect to GitHub. Primary: list repos in the threataware org with
Bearer auth and Link-header pagination.

Then add a Detail Request that pulls branches for each repo:
GET https://api.github.com/repos/{{full_name}}/branches
Capture full_name from each primary record.
Inherit auth from parent."
```

Composer scaffolds both nodes on the canvas.

## Worked example — Slack users + their profiles

Slack's `users.list` returns thin records; `users.profile.get` returns the full profile.

| Field | Value |
| - | - |
| Primary URL | `https://slack.com/api/users.list` |
| Primary Pagination | Cursor (`response_metadata.next_cursor`) |
| Primary Data Path | `members` |
| Primary ID Path | `id` |
| Detail Method | GET |
| Detail URL | `https://slack.com/api/users.profile.get` |
| Detail Params | `user={{id}}` |
| Detail Auth | Inherit from parent |

Note how Slack uses a **query param** for the user, not a URL path segment — `Params` section handles this.

## Worked example — Jira issues + their changelogs

Jira returns issues thin; `/issue/{key}?expand=changelog` returns each with its full history.

```text theme={null}
Primary:
URL: https://yourorg.atlassian.net/rest/api/3/search?jql=project=SEC
Pagination: Limit/Offset (startAt, maxResults)
Data Path: issues
ID Path: key

Capture Variables: key

Detail:
URL: https://yourorg.atlassian.net/rest/api/3/issue/{{key}}?expand=changelog
Auth: Inherit
```

Inheriting auth saves you re-entering the Atlassian email + API token.

## Concurrency and rate limits

For rate-sensitive APIs, ask Composer to throttle the Detail Request rate or add a per-call delay.

## Combining detail data with the primary record

After both requests run, each output record exposes the primary fields plus whatever the Detail Request returned for that record. You can ask Composer how to merge or flatten the detail data into the primary record when wiring the feed into a Studio app:

```text theme={null}
"In the merged output, call the detail field `branches`."

"Flatten the Detail Request output so that `branch_count` and
`branch_names` (comma-separated) appear as top-level fields on
each repo record."
```

## Debugging

### Detail Request firing but returns nothing useful

Check **⋯ → Advanced → Request History** to see the actual URLs being called. The variable interpolation may be producing `undefined` if the Capture Variable JSONPath is wrong.

### Detail Request fires once but should fire per record

Make sure the **primary Data Path** points at an **array**, not the root object. If you're getting a single record, the Detail Request only runs once.

### Detail Request 401 but primary 200

You probably skipped `Inherit from parent`. Set Detail's Authorization to `Inherit from parent` so it reuses the primary credentials.

### Sync is suddenly slow

Detail Requests multiply the request count by N (records). If primary returns 5,000 records and Detail Request is enabled, that's 5,001 outbound calls per sync. Either:

* Reduce primary record count via filters
* Disable Detail Request and use a single richer primary endpoint if the source offers one
* Lower the sync cadence

## When to skip Detail Requests entirely

| Scenario | Better approach |
| - | - |
| The source has an `?expand=` or `?fields=` param | Use it in the primary — one round trip |
| GraphQL is available | Query nested fields in the primary GraphQL query |
| You only need 1–2 extra fields | Skip Detail; add a separate, lower-frequency Data Feed for the supplemental data |
| You need real-time per-record fetching from the app, not on schedule | Build a Webhook Action invoked from the Studio app instead |

## See also

> [card] [Data Feeds Overview](https://docs.dimension.io/data-feeds.md)
>
> The full editor anatomy with Trigger + Data Request + Detail Request

> [card] [Schema & Fields](https://docs.dimension.io/data-feeds/schema.md)
>
> Capture Variables, JSON paths, and field-type inference

> [card] [JSON Path Reference](https://docs.dimension.io/reference/json-paths.md)
>
> Worked JSONPath examples for every field

> [card] [Sync & Freshness](https://docs.dimension.io/data-feeds/sync.md)
>
> Schedules, Request History, and recovery


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.