> ## 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.

# Submit feedback

> Report match outcomes. Feeds the training loop for your domain ranker.

The moat. Every outcome you submit accumulates into training triplets used to fine-tune your domain's ranker. Past a threshold, fine-tunes run automatically.

Send outcomes as soon as you have them. Noisy is fine; the loss function is tolerant. You can also batch.

<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" },
        { "seeker_id": "u_alice", "candidate_id": "u_dan",  "outcome": "converted", "weight": 2.0 }
      ]
    }'
  ```

  ```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"},
              {"seeker_id": "u_alice", "candidate_id": "u_dan",  "outcome": "converted", "weight": 2.0},
          ],
      },
  )
  ```

  ```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" },
        { seeker_id: "u_alice", candidate_id: "u_dan",  outcome: "converted", weight: 2.0 },
      ],
    }),
  });
  ```
</CodeGroup>

## Outcome labels

Built-in labels work everywhere:

* `accepted`: user signaled positive intent (like, swipe right, save).
* `rejected`: user signaled negative intent (skip, dismiss).
* `converted`: strongest positive (matched, hired, deal closed, second date).
* `expired`: no decision before timeout.

You can also register **tenant-specific labels** with us at onboarding (`super_like`, `interview_passed`, `paid_subscription`, etc.) and use them here directly.

## Weights

`weight` defaults to 1.0. Use it to express **how strong** an outcome is:

| Signal              | Suggested weight |
| ------------------- | ---------------- |
| Casual click / open | 0.25             |
| Like / swipe        | 1.0              |
| Conversion          | 2.0+             |
| Long-term retention | 5.0+             |

Higher-weighted triplets pull harder on the gradient.

## Example response

```json theme={"dark"}
{
  "accepted": 3,
  "triplets_generated": 6,
  "triplets_pending_train": 4218
}
```

When `triplets_pending_train` crosses your domain's threshold (negotiated at onboarding, typically 1K-10K), a fine-tune kicks off automatically. Force one manually with [`POST /train`](/api-reference/feedback/train).


## OpenAPI

````yaml POST /feedback
openapi: 3.1.0
info:
  title: Jean Technologies API
  version: 1.0.0
  description: >-
    Matching infrastructure for AI-era platforms. Ingest user context, retrieve
    compatible candidates, send outcomes back.
servers:
  - url: https://api.jeantechnologies.com/v1
    description: Production
security:
  - bearerAuth: []
paths:
  /feedback:
    post:
      tags:
        - Feedback & Training
      summary: Submit feedback
      description: >-
        Report match outcomes. Triplets accumulate and trigger auto fine-tuning
        past a threshold.
      operationId: submitFeedback
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FeedbackRequest'
      responses:
        '200':
          description: Feedback accepted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FeedbackResponse'
components:
  schemas:
    FeedbackRequest:
      type: object
      required:
        - domain
        - items
      properties:
        domain:
          type: string
          example: dating
        items:
          type: array
          items:
            $ref: '#/components/schemas/FeedbackItem'
    FeedbackResponse:
      type: object
      properties:
        accepted:
          type: integer
          example: 2
        triplets_generated:
          type: integer
          example: 4
        triplets_pending_train:
          type: integer
          example: 318
    FeedbackItem:
      type: object
      required:
        - seeker_id
        - candidate_id
        - outcome
      properties:
        seeker_id:
          type: string
          example: u_alice
        candidate_id:
          type: string
          example: u_bob
        outcome:
          type: string
          description: >-
            One of accepted, rejected, converted, expired, or a
            tenant-registered label.
          example: accepted
        weight:
          type: number
          description: Optional importance weight.
          default: 1
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: API key issued by Jean Technologies. Contact the team for access.

````