> ## Documentation Index
> Fetch the complete documentation index at: https://docs.get-exo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Contradictions and proposals

> The tensions Exo found in a subject's beliefs, and the connections it proposes rather than assumes.

## What this family does

Two resources share this family because they are the same idea seen from both ends. Contradictions are conflicts Exo detected and will not resolve on your behalf. Proposals are connections the background daemon believes exist and will not commit without a decision.

Accepting a proposal writes the edge. Rejecting one records the rejection, which is how the daemon learns what this subject does not consider related.

## Routes

| Method | Path                                                                            | Scope   | What it does            |
| ------ | ------------------------------------------------------------------------------- | ------- | ----------------------- |
| `GET`  | [`/v1/contradictions`](/api-reference/insights/list-contradictions)             | `read`  | List contradictions     |
| `GET`  | [`/v1/proposals`](/api-reference/insights/list-proposals)                       | `read`  | List edge proposals     |
| `POST` | [`/v1/proposals/{proposal_id}/accept`](/api-reference/insights/accept-proposal) | `write` | Accept an edge proposal |
| `POST` | [`/v1/proposals/{proposal_id}/reject`](/api-reference/insights/reject-proposal) | `write` | Reject an edge proposal |

## Headers that apply here

Neither header is declared as an OpenAPI parameter, so neither appears in the generated schema tables.

* **`X-Exo-Subject`** selects which subject the call acts for on the subject-aware routes above. Omit it to act as the key owner. See [Subjects](/api-reference/subjects).
* **`Idempotency-Key`** makes a retry safe on `POST /v1/proposals/{proposal_id}/accept`, `POST /v1/proposals/{proposal_id}/reject`. See [Idempotency](/platform/idempotency).

## The shape of a call

List open contradictions.

<CodeGroup>
  ```bash cURL theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
  curl "https://api.get-exo.com/v1/contradictions?pageSize=25" \
    -H "X-Exo-API-Key: $EXO_KEY"
  ```

  ```python Python theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
  import httpx

  response = httpx.get(
      "https://api.get-exo.com/v1/contradictions",
      headers={"X-Exo-API-Key": EXO_KEY},
      params={"pageSize": 25},
  )
  page = response.json()
  ```

  ```typescript TypeScript theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
  const response = await fetch(
    "https://api.get-exo.com/v1/contradictions?pageSize=25",
    { headers: { "X-Exo-API-Key": process.env.EXO_KEY! } },
  );
  const page = await response.json();
  ```
</CodeGroup>

The response:

```json theme={"theme":{"light":"github-light-default","dark":"github-dark-default"}}
{
  "data": [
    {
      "id": "cc_51a0f8d3b62e947c",
      "a": "usage-based only",
      "b": "seat plus usage",
      "tension": 0.75,
      "status": "open",
      "detectedAt": "2026-07-14T09:12:03Z"
    }
  ],
  "hasMore": false,
  "nextCursor": null
}
```

## Traps

**Every contradiction is `open`.** The v1 store tracks no resolution state, so filtering `status=resolved` returns an empty page. Resolve a tension by superseding the side that lost, with `POST /v1/graph/nodes/{node_id}/supersede`.

**Both decision routes replay.** Accept and reject honour `Idempotency-Key`, so a retried decision returns the original outcome rather than fighting the first one.

**Proposals are subject-scoped.** A proposal id that belongs to another subject is 404 `proposal_not_found`.

## Related

<Columns cols={2}>
  <Card title="API reference" icon="book-open" href="/api-reference/overview">
    Base URL, authentication, and the conventions every route shares.
  </Card>

  <Card title="Errors" icon="circle-alert" href="/platform/errors">
    The problem envelope and the full code catalogue.
  </Card>
</Columns>
