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

# Declare a fact

> POST /v1/facts. Say what counts as one fact and how its values are chosen. resolve answers only for declared facts.

tckg does not guess identity. Which nodes are values of the same fact, and which value wins, are declared by you. Declarations are time-aware: `resolve` applies the declaration in force at `as_of` (or at `rules_as_of`).

## Request

<ParamField body="fact_key" type="string" required>
  The key nodes carry in `fact_key`.
</ParamField>

<ParamField body="key_fields" type="string[]" required>
  The fields that identify one instance of the fact.
</ParamField>

<ParamField body="policy" type="string" default="latest_valid">
  `latest_valid` (latest validity start wins), `latest_observed` (latest `asserted_at` wins), `source_priority` (first match in `source_order` wins), `strict` (two candidates is a refusal).
</ParamField>

<ParamField body="source_order" type="string[]">
  Required for `source_priority`.
</ParamField>

## Response

<ResponseField name="declared_at" type="timestamp">
  When the declaration took effect. Use it as `rules_as_of` when resolving past knowledge under this rule.
</ResponseField>

<CodeGroup>
  ```bash Request theme={null}
  curl -s -X POST $TCKG/v1/facts -H 'content-type: application/json' -d '{
    "fact_key": "belief:user:randy:NVDA:direction",
    "key_fields": ["space", "symbol"],
    "policy": "latest_valid"
  }'
  ```

  ```json Response theme={null}
  {"declared_at": "2026-10-03T07:29:51.771204+00:00"}
  ```
</CodeGroup>

<Note>
  A node written with a `fact_key` that is not declared yet is still stored, with an `undeclared_fact` warning. Declare first when you can; otherwise declare later and resolve with `rules_as_of`.
</Note>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.