---
title: "Search review history"
method: GET
path: "/api/v1/review/search"
tags: ["API Reference"]
---

# Search review history

`GET /api/v1/review/search`

## Request

- Base URL: `https://revnu.com`
- URL: `https://revnu.com/api/v1/review/search`
- Auth: HTTP bearer

Check existing work for several people or topics in one request, including resolved cards, without returning full drafts.

Requires the `review:read` scope.

**Response.** ```json
{
  "matches": [{
    "query": "Acme",
    "hasMore": false,
    "openCardCount": 0,
    "items": [{
      "id": "k97…",
      "title": "Reply to Acme",
      "status": "done",
      "sourceType": "agent",
      "updatedAt": 1792400000000,
      "resolvedAt": 1792400000000,
      "resolutionAction": "approve",
      "delivery": "unconfirmed",
      "reviewUrl": "https://revnu.com/dashboard/review…"
    }]
  }],
  "coverage": "Search coverage and delivery evidence limitations."
}
```

Search matches are bounded by relevance, combined across title and prompt,
then ordered by update time. `hasMore` means matches may be missing because the
result limit or the batch's shared read budget stopped the search. Later names
can return no items with `hasMore: true`; that is incomplete evidence. An
empty list means no matching title or prompt, not that no work or send exists.

`status` describes the card. A done card does not prove delivery.
`sent_recorded` means the card's resolution records a send. `queued` means
approved for delivery. Other resolutions return `unconfirmed`. This endpoint
does not check the provider for a receipt.

Draft bodies and internal payloads are omitted. [Get a card](/docs/review-get)
returns the full details. Reading history does not change any card or send a
message. Responses are not cached.

## Query parameters

- `query` string
- `limit` integer

## Response `200`

``json { "matches": [{ "query": "Acme", "hasMore": false, "openCardCount": 0, "items": [{ "id": "k97…", "title": "Reply to Acme", "status": "done", "sourceType": "agent", "updatedAt": 1792400000000, "resolvedAt": 1792400000000, "resolutionAction": "approve", "delivery": "unconfirmed", "reviewUrl": "

- object
  - `matches` object[], required
    - `query` string, required
    - `hasMore` boolean, required
    - `openCardCount` number, nullable, required
    - `items` object[], required
      - `id` string, required
      - `title` string, required
      - `status` 'cancelled' | 'dismissed' | 'done' | 'expired' | 'needs_revision' | 'pending' | 'snoozed', required
      - `sourceType` 'ads_budget' | 'ads_launch' | 'agent' | 'blog_draft' | 'blog_edit' | 'booking_link' | 'gift_send' | 'gmail_draft' | 'gmail_reply' | 'lead' | 'lead_contact' | 'linkedin_invite' | 'linkedin_message' | 'measurement_charter' | 'memory_rule' | 'outbound_setup' | 'outreach_sequence' | 'reddit_comment' | 'system' | 'null', nullable, required
      - `updatedAt` number, required
      - `resolvedAt` number, nullable, required
      - `resolutionAction` string, nullable, required
      - `delivery` 'queued' | 'sent_recorded' | 'unconfirmed', required
      - `reviewUrl` string, required
  - `coverage` string, required

## Other responses

- `400`: The request is malformed; the error names the problem.
- `401`: Missing, malformed, unknown or revoked token.
- `402`: `setup_pending`: the account hasn't started its trial. Finish setup with `GET /setup`.
- `403`: The token lacks the scope in `requiredScope`.
- `429`: Rate limited.
- `503`: Temporarily unavailable; retry the same call.

---

[API](https://skmtc.dev/revnu/apis/revnu-api.md) · [All operations](https://skmtc.dev/revnu/apis/revnu-api/llms.txt) · [OpenAPI document](https://skmtc.dev/revnu/apis/revnu-api/revisions/52e523c2db61?raw)
