---
title: "Your runs, newest first"
method: GET
path: "/v1/runs"
tags: ["research"]
---

# Your runs, newest first

`GET /v1/runs`

## Request

- Base URL: `https://api.hookdetector.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.hookdetector.com/v1/runs`
- Auth: none declared

Your runs without their results, newest first, a page at a time: pass next_cursor
back as ?cursor= for the next page (null on the last). Each says its kind (short, long
or packaging); ?kind= narrows the list to one. Open one with GET /v1/runs/{run_id}.
Free. MCP: list_runs.

## Query parameters

- `limit` integer: page size, 1 to 100
- `cursor` string, nullable: next_cursor from the previous page; leave out for the first
- `kind` string, nullable: only runs of this kind: short, long or packaging; leave out for every kind

## Headers

- `authorization` string, nullable: Bearer hd_... from POST /v1/accounts or POST /v1/keys

## Response `200`

Successful Response

- RunList
  - `runs` RunSummary[], required
    - `run_id` string, required
    - `kind` string: what the run researches: "short" (hooks from TikTok, Instagram and YouTube Shorts, POST /v1/research), "long" (how long-form YouTube outliers open, POST /v1/longform) or "packaging" (their titles and thumbnails, POST /v1/packaging). Every run from before 2026-10-07 is short
    - `topic` string, required
    - `label` string, nullable: for a long or packaging run asked for by a YouTube address: the channel's name or the video's title, once the run knows it. Null for a subject in words
    - `requested` integer, required
    - `language` string, nullable: the language or dialect asked for, as sent, or null for any language
    - `country` string, nullable: the country asked for, as an ISO 3166-1 alpha-2 code (upper-cased, UK read as GB), or null for any country
    - `status` string, required
    - `charged` integer, required: credits deducted from your balance for this run: what it used, never more than `reserved`; 0 while it runs, on a failed run, and on a run that found no hooks within the account's allowance of free empty runs (three a day, 500 credits in all; `outcome` says which)
    - `created_at` string, required
    - `finished_at` string, nullable, required
    - `conversation_id` string, nullable, required: the chat conversation this run belongs to, or null
  - `next_cursor` string, nullable, required: pass as ?cursor= for the next page; null on the last page

## Other responses

- `401`: missing, invalid, revoked or expired API key (code key_expired)
- `403`: the key lacks the scope this call needs (insufficient_scope), or its credit_limit is spent (key_credit_limit_reached)
- `413`: request body over the size cap
- `422`: invalid input
- `500`: our fault; names the request id

---

[API](https://skmtc.dev/hookdetector/apis/hook-detector.md) · [All operations](https://skmtc.dev/hookdetector/apis/hook-detector/llms.txt) · [OpenAPI document](https://skmtc.dev/hookdetector/apis/hook-detector/revisions/b136a2804d2b?raw)
