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

# Quickstart

> Three calls to your first match.

<Warning>
  **Spec-only preview.** The API is not yet live. The commands below will not return real responses today; they describe the developer experience we are shipping. [Talk to us](mailto:jonathan@jeantechnologies.com) about closed-beta access.
</Warning>

You need an API key from the team and a domain name agreed with us (`dating`, `hiring`, etc.). After that, three endpoints get you a working integration.

## Authenticate

<CodeGroup>
  ```bash macOS / Linux theme={"dark"}
  export JEAN_API_KEY=sk_live_...
  ```

  ```powershell Windows theme={"dark"}
  $env:JEAN_API_KEY = "sk_live_..."
  ```
</CodeGroup>

Every request takes `Authorization: Bearer $JEAN_API_KEY`.

## 1. Add a user

Send raw text and let the platform extract structure, or send `fields` directly if you already have it.

<CodeGroup>
  ```bash curl theme={"dark"}
  curl https://api.jeantechnologies.com/v1/users \
    -H "Authorization: Bearer $JEAN_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "user_id": "u_alice",
      "domain": "dating",
      "context": "32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian."
    }'
  ```

  ```python Python theme={"dark"}
  import os, requests

  requests.post(
      "https://api.jeantechnologies.com/v1/users",
      headers={"Authorization": f"Bearer {os.environ['JEAN_API_KEY']}"},
      json={
          "user_id": "u_alice",
          "domain": "dating",
          "context": "32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian.",
      },
  )
  ```

  ```ts TypeScript theme={"dark"}
  await fetch("https://api.jeantechnologies.com/v1/users", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.JEAN_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      user_id: "u_alice",
      domain: "dating",
      context:
        "32, NYC, looking for someone serious. Reads a lot, runs in the park, vegetarian.",
    }),
  });
  ```
</CodeGroup>

## 2. Find matches

<CodeGroup>
  ```bash curl theme={"dark"}
  curl https://api.jeantechnologies.com/v1/match \
    -H "Authorization: Bearer $JEAN_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "user_id": "u_alice",
      "domain": "dating",
      "limit": 10
    }'
  ```

  ```python Python theme={"dark"}
  matches = requests.post(
      "https://api.jeantechnologies.com/v1/match",
      headers={"Authorization": f"Bearer {os.environ['JEAN_API_KEY']}"},
      json={"user_id": "u_alice", "domain": "dating", "limit": 10},
  ).json()
  ```

  ```ts TypeScript theme={"dark"}
  const res = await fetch("https://api.jeantechnologies.com/v1/match", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.JEAN_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ user_id: "u_alice", domain: "dating", limit: 10 }),
  });
  const { matches } = await res.json();
  ```
</CodeGroup>

Add `"filters": { "location_within_km": 50 }` to apply hard constraints. Stages can be tuned via `"stages": { "llm_judge": true }` (off by default for latency).

## 3. Send feedback

<CodeGroup>
  ```bash curl theme={"dark"}
  curl https://api.jeantechnologies.com/v1/feedback \
    -H "Authorization: Bearer $JEAN_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "domain": "dating",
      "items": [
        { "seeker_id": "u_alice", "candidate_id": "u_bob",  "outcome": "accepted" },
        { "seeker_id": "u_alice", "candidate_id": "u_carl", "outcome": "rejected" }
      ]
    }'
  ```

  ```python Python theme={"dark"}
  requests.post(
      "https://api.jeantechnologies.com/v1/feedback",
      headers={"Authorization": f"Bearer {os.environ['JEAN_API_KEY']}"},
      json={
          "domain": "dating",
          "items": [
              {"seeker_id": "u_alice", "candidate_id": "u_bob",  "outcome": "accepted"},
              {"seeker_id": "u_alice", "candidate_id": "u_carl", "outcome": "rejected"},
          ],
      },
  )
  ```

  ```ts TypeScript theme={"dark"}
  await fetch("https://api.jeantechnologies.com/v1/feedback", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${process.env.JEAN_API_KEY}`,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      domain: "dating",
      items: [
        { seeker_id: "u_alice", candidate_id: "u_bob",  outcome: "accepted" },
        { seeker_id: "u_alice", candidate_id: "u_carl", outcome: "rejected" },
      ],
    }),
  });
  ```
</CodeGroup>

Outcomes accumulate. Past a per-domain threshold the ranker auto-fine-tunes; force it manually with `POST /train`.

## Next

<CardGroup cols={2}>
  <Card title="Concepts" icon="compass" href="/concepts">
    Users, schemas, matches, feedback.
  </Card>

  <Card title="API Reference" icon="code" href="/api-reference/users/upsert-user">
    Live playground.
  </Card>
</CardGroup>
