# Prospect feed

A revocable, session-free JSON URL for one project, with keyset pagination in two modes.

One revocable URL per project, found on its Connect page. The token in the path is the whole credential, so treat the URL the way you treat a password. Regenerating it revokes the previous one immediately.

```bash
curl -s 'https://prospex.ch/app/prospect/feed/<token>.json?limit=50'
```

Every response carries `schema_version`, `generated_at`, `count`, `has_more`, `next_url`, a `usage` block, and `Cache-Control: no-store`.

## Pagination has two modes

**Snapshot** (no `updated_since`) walks the project in primary-key order. A key never changes, so a page turn cannot skip a row that moved underneath you, and rows added while you walk land at the tail where the same walk picks them up.

**Window** (with `updated_since`) walks oldest change first. A row updated while you are paging moves toward the tail and is served *again*. Delivery is at least once: re-reading a row costs a comparison, skipping one loses a company.

Follow `next_url`. It is absolute and carries every parameter. Adding or removing `updated_since` mid-walk answers 400 rather than serving a page from the wrong order.

## Parameters

An unknown parameter answers **400**.

| Parameter | Meaning |
| --- | --- |
| limit | Rows per page, up to 200. |
| cursor | Opaque. Follow `next_url` instead of building one. |
| updated_since | ISO date or datetime. Switches pagination into window mode. |
| include | `history` for every revision, not only the current one. |
| selection | Selection state. |
| research | Research state. |
| outreach | Outreach state. |
| disposition | `active` or `dismissed`. |
| fit | Qualification outcome. |
| priority | `high`, `normal` or `low`. |
| identity | Research identity outcome. |
| pinned | `true` or `false`. |
| stale | `true` or `false`. |
| fit_origin | `prospex` or `external`. |
| research_origin | `prospex` or `external`. |
| outreach_origin | `prospex` or `external`. |
| stage | Narrow the stage-job filters to one stage. |
| stage_job | A job status, or `open` for any open job, or `none`. |

## Refusals

| Status | error | When |
| --- | --- | --- |
| 400 | invalid_parameter | A parameter this surface does not accept, or a value it cannot read. An unknown parameter is refused because a silently dropped filter returns more rows than you asked for. |
| 402 | subscription_required | The project owner's subscription is not active. The body carries a billing URL. |
| 404 | unknown_token | No feed answers this URL. Also the answer for a feed switched off, so the response never confirms that a token existed. |
| 429 | daily_row_limit | The account has taken its rows for the day. `Retry-After` points at the reset. |
| 503 | feed_disabled | The surface is switched off globally. |
