# List Reveals

> The workspace's reveal history for one month, newest first.

Requires an API key with the `read` scope.

## Query Parameters

<ParamField query="month" type="string">
  Month as `YYYY-MM`, from 2020-01 to 2100-12. Defaults to the current month.
</ParamField>

<ParamField query="status" type="string">
  `found`, `returned` (not found or errored) or `pending`.
</ParamField>

<ParamField query="q" type="string">
  Substring match on first name, last name, email or company.
</ParamField>

<ParamField query="page" type="integer" default="1">
  Page number, starting at 1.
</ParamField>

<ParamField query="pageSize" type="integer" default="50">
  Rows per page. Values above 100 are capped at 100.
</ParamField>

## Response

<ResponseField name="data" type="object">
  One page of history.

  <Expandable title="data">
    <ResponseField name="reveals" type="array">
      The rows.

      <Expandable title="reveals">
        <ResponseField name="id" type="string">Reveal identifier. Use it as a `revealIds` entry.</ResponseField>
        <ResponseField name="batchId" type="string">Batch the reveal belongs to.</ResponseField>
        <ResponseField name="personId" type="string">Provider person id.</ResponseField>
        <ResponseField name="firstName" type="string">First name.</ResponseField>
        <ResponseField name="lastName" type="string">Last name.</ResponseField>
        <ResponseField name="title" type="string">Job title.</ResponseField>
        <ResponseField name="company" type="string">Company.</ResponseField>
        <ResponseField name="companyDomain" type="string">Company domain.</ResponseField>
        <ResponseField name="linkedinUrl" type="string">LinkedIn URL.</ResponseField>
        <ResponseField name="status" type="string">`pending`, `found`, `not_found` or `error`.</ResponseField>
        <ResponseField name="email" type="string">The email, once found.</ResponseField>
        <ResponseField name="certainty" type="string">Confidence in the email: `ultra_sure`, `very_sure` or `probable`.</ResponseField>
        <ResponseField name="failureReason" type="string">Why a reveal returned nothing or was refunded, for example `already_in_leads`.</ResponseField>
        <ResponseField name="leadId" type="string">The active lead for this email, or `null`.</ResponseField>
        <ResponseField name="inLeads" type="boolean">Whether an active lead exists.</ResponseField>
        <ResponseField name="creditsCharged" type="integer">Credits charged for this row.</ResponseField>
        <ResponseField name="createdAt" type="string">ISO 8601 timestamp.</ResponseField>
        <ResponseField name="completedAt" type="string">ISO 8601 timestamp, or `null` while pending.</ResponseField>
        <ResponseField name="campaignName" type="string">Campaign the reveal was made into, or `null`.</ResponseField>
        <ResponseField name="nowIn" type="string">Where a found person is now: the campaign name, `Leads` or `Lead Finder only`. `null` otherwise.</ResponseField>
      </Expandable>
    </ResponseField>
    <ResponseField name="total" type="integer">Rows matching the filters.</ResponseField>
    <ResponseField name="page" type="integer">Current page.</ResponseField>
    <ResponseField name="pageSize" type="integer">Rows per page.</ResponseField>
    <ResponseField name="summary" type="object">Totals for the whole month, ignoring `status` and `q`: `month`, `reveals`, `found`, `notFound`, `pending`, `creditsUsed`, `inCampaign`.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
```bash cURL
curl -X GET "https://api.foxreach.io/api/v1/lead-finder/reveals?month=2026-10&status=found" \
  -H "X-API-Key: otr_your_key"
```

```python Python SDK (beta)
from foxreach import FoxReach

client = FoxReach(api_key="otr_your_key")
history = client.lead_finder.list_reveals(month="2026-10", status="found")
```

```typescript TypeScript SDK (beta)
import { FoxReach } from "foxreach";

const client = new FoxReach({ apiKey: "otr_your_key" });
const history = await client.leadFinder.listRevealBatches({ month: "2026-10", status: "found" });
```
</RequestExample>

<ResponseExample>
```json
{
  "data": {
    "reveals": [
      {
        "id": "rev_abc123",
        "batchId": "bat_abc123",
        "personId": "per_abc123",
        "firstName": "Jane",
        "lastName": "Doe",
        "title": "CTO",
        "company": "Acme Inc",
        "companyDomain": "acme.com",
        "linkedinUrl": "https://www.linkedin.com/in/janedoe",
        "status": "found",
        "email": "jane@acme.com",
        "certainty": "ultra_sure",
        "failureReason": null,
        "leadId": null,
        "inLeads": false,
        "creditsCharged": 1,
        "createdAt": "2026-10-30T14:02:00",
        "completedAt": "2026-10-30T14:02:09",
        "campaignName": null,
        "nowIn": "Lead Finder only"
      }
    ],
    "total": 1,
    "page": 1,
    "pageSize": 50,
    "summary": {
      "month": "2026-10",
      "reveals": 1,
      "found": 1,
      "notFound": 0,
      "pending": 0,
      "creditsUsed": 1,
      "inCampaign": 0
    }
  }
}
```
</ResponseExample>

## Errors

| Status | Description |
|--------|-------------|
| `401` | Missing, invalid, revoked or expired API key |
| `403` | API key does not have the required scope: `read` |
| `404` | `Lead Finder is not enabled` while Lead Finder is switched off on this environment |
| `422` | `month must be YYYY-MM` or `status must be found, returned or pending` |
| `503` | `Lead Finder is not configured` when it is enabled but has no data provider key |

## Rate Limit

- **100 requests per minute, per API key.** Fixed 60-second window.
- Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (unix epoch seconds).
- A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns (`Retry-After`, exponential backoff, monitoring `X-RateLimit-Remaining`), see [Rate Limiting](/rate-limiting).
