> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.coperniq.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.coperniq.io/_mcp/server.

## Opportunity `status` on read endpoints, now `WON`/`LOST`

### Fixed: `status` is now returned when reading opportunities

`GET /opportunities/{opportunity_id}`, `GET /opportunities`, and `GET /opportunities/search` now include the opportunity's `status`. Create and update already accepted it, but these read endpoints never returned it. The legacy `/requests` aliases return it too.

### Changed: closed opportunities are `WON` or `LOST`

Opportunity `status` uses `WON` and `LOST` for closed opportunities:

| Value     | Meaning |
| --------- | ------- |
| `ACTIVE`  | Open    |
| `ON_HOLD` | On hold |
| `WON`     | Won     |
| `LOST`    | Lost    |

* Every opportunity response uses these values, including the response from `POST`/`PATCH /opportunities`.
* `POST`/`PATCH /opportunities` and status search filters (e.g. `?prop1=status&op1=eq&value1=WON`) take the same values.
* Project `status` is unchanged.

### Changed: `status` search filters only accept exact-match operators

On `GET /opportunities/search` and `GET /projects/search`, a `status` filter now supports only `eq`, `neq`, `in`, and `nin`. Any other operator (e.g. `contains`, `gt`, `between`) returns a `400 VALIDATION_ERROR` instead of a `200` with no results.