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

# Inference history and feedback endpoints on Pioneer

> List Pioneer inference history, filter by model or project, retrieve individual results, and submit corrections to improve your model via Adaptive Inference.

Pioneer stores every inference call and lets you retrieve results by ID or in bulk. You can also submit correction feedback on individual inferences — this feedback signals what the model got wrong and powers Adaptive Inference, which automatically retrains your model on corrected examples from live traffic.

## Endpoints

| Method | Path                       | Description           |
| ------ | -------------------------- | --------------------- |
| `GET`  | `/inferences`              | List past inferences  |
| `GET`  | `/inferences/:id`          | Get inference details |
| `POST` | `/inferences/:id/feedback` | Submit feedback       |
| `GET`  | `/inferences/:id/feedback` | Get stored feedback   |

## List past inferences

`GET /inferences` returns a paginated list of past inference calls. Use the query parameters below to filter results.

### Query parameters

<ParamField query="limit" type="number">
  Maximum number of results to return per page.
</ParamField>

<ParamField query="offset" type="number">
  Number of results to skip before returning. Use with `limit` to paginate through results.
</ParamField>

<ParamField query="model_id" type="string">
  Filter by model ID. Accepts a training job ID or a base model ID.
</ParamField>

<ParamField query="task" type="string">
  Filter by task type (e.g. `ner`, `classification`, `generate`).
</ParamField>

<ParamField query="project_id" type="string">
  Filter by project ID to see only inferences scoped to a specific project.
</ParamField>

<ParamField query="training_job_id" type="string">
  Filter by training job ID to see only inferences run against a specific fine-tuned model.
</ParamField>

<ParamField query="latency_min" type="number">
  Minimum end-to-end latency in milliseconds (inclusive). Must be >= 0.
</ParamField>

<ParamField query="latency_max" type="number">
  Maximum end-to-end latency in milliseconds (inclusive). Must be >= 0 and >= `latency_min` if both are set.
</ParamField>

<ParamField query="llmaj_score_min" type="number">
  Minimum LLM-as-Judge score (inclusive), in the range `0.0`–`1.0`.
</ParamField>

<ParamField query="llmaj_score_max" type="number">
  Maximum LLM-as-Judge score (inclusive), in the range `0.0`–`1.0`. Must be >= `llmaj_score_min` if both are set.
</ParamField>

<ParamField query="since" type="string">
  Inclusive lower bound on `created_at`, as an ISO 8601 UTC timestamp.
</ParamField>

<ParamField query="until" type="string">
  Exclusive upper bound on `created_at`, as an ISO 8601 UTC timestamp.
</ParamField>

<Note>
  `latency_min`/`latency_max` and `llmaj_score_min`/`llmaj_score_max` each return `422` if the `min` value is greater than the paired `max` value.
</Note>

### Example

<CodeGroup>
  ```bash cURL theme={null}
  curl "https://api.pioneer.ai/inferences?limit=20&offset=0&model_id=job_abc123" \
    -H "X-API-Key: YOUR_API_KEY"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.pioneer.ai/inferences",
      headers={"X-API-Key": "YOUR_API_KEY"},
      params={
          "limit": 20,
          "offset": 0,
          "model_id": "job_abc123"
      }
  )

  print(response.json())
  ```
</CodeGroup>

## Get inference details

`GET /inferences/:id` returns the full record for a single past inference, including the input text, schema, model response, and timestamp.

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.pioneer.ai/inferences/INFERENCE_ID \
    -H "X-API-Key: YOUR_API_KEY"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.pioneer.ai/inferences/INFERENCE_ID",
      headers={"X-API-Key": "YOUR_API_KEY"}
  )

  print(response.json())
  ```
</CodeGroup>

## Submit feedback

`POST /inferences/:id/feedback` lets you mark a past inference as correct or incorrect, optionally attaching the corrected output. Incorrect verdicts with a correction are used as labeled training examples for Adaptive Inference.

<Note>
  Feedback submitted here powers Adaptive Inference — Pioneer's continuous improvement loop that automatically retrains your model on corrections collected from live traffic. See the [Adaptive Inference guide](/guides/adaptive-inference) for details on how this works.
</Note>

### Request parameters

<ParamField body="verdict" type="string" required>
  Human judgment on the inference: `correct` or `incorrect`.
</ParamField>

<ParamField body="corrected_output" type="object">
  The expected output, in the same shape as the original inference's output (for example, a corrected `entities` list for an NER inference). **Required** when `verdict` is `incorrect`; must be omitted or `null` when `verdict` is `correct`. Sending an incorrect combination returns `422`.
</ParamField>

<ParamField body="notes" type="string">
  Optional free-text reviewer notes. Maximum 5000 characters.
</ParamField>

### Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST https://api.pioneer.ai/inferences/INFERENCE_ID/feedback \
    -H "X-API-Key: YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "verdict": "incorrect",
      "corrected_output": {
        "entities": [
          {"text": "Apple", "label": "organization", "start": 0, "end": 5},
          {"text": "iPhone", "label": "product", "start": 18, "end": 24}
        ]
      },
      "notes": "Missed the product entity."
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://api.pioneer.ai/inferences/INFERENCE_ID/feedback",
      headers={
          "X-API-Key": "YOUR_API_KEY",
          "Content-Type": "application/json"
      },
      json={
          "verdict": "incorrect",
          "corrected_output": {
              "entities": [
                  {"text": "Apple", "label": "organization", "start": 0, "end": 5},
                  {"text": "iPhone", "label": "product", "start": 18, "end": 24}
              ]
          },
          "notes": "Missed the product entity."
      }
  )

  print(response.json())
  ```
</CodeGroup>

**Response**

<ResponseField name="inference_id" type="string">
  The inference that was annotated.
</ResponseField>

<ResponseField name="human_verdict" type="string">
  The stored verdict.
</ResponseField>

<ResponseField name="human_feedback_at" type="string">
  ISO 8601 timestamp of when the feedback was submitted.
</ResponseField>

## Get feedback

`GET /inferences/:id/feedback` returns the feedback previously submitted for a specific inference. Returns `404` if no feedback has been submitted yet.

<CodeGroup>
  ```bash cURL theme={null}
  curl https://api.pioneer.ai/inferences/INFERENCE_ID/feedback \
    -H "X-API-Key: YOUR_API_KEY"
  ```

  ```python Python theme={null}
  import requests

  response = requests.get(
      "https://api.pioneer.ai/inferences/INFERENCE_ID/feedback",
      headers={"X-API-Key": "YOUR_API_KEY"}
  )

  print(response.json())
  ```
</CodeGroup>

**Response** — same shape as the [submit feedback](#submit-feedback) response above.

## Related

* [Pioneer native inference](/api-reference/inference/pioneer) — run new inferences
* [Adaptive Inference guide](/guides/adaptive-inference) — continuous model improvement from live traffic
