Internalize / Docs
API reference

Read and list jobs

GET /v1/jobs/{id} and GET /v1/jobs — durable outcomes, usage, and settlement.

View as Markdown

Listing project jobs requires read. A key with inference or internalize can read individual jobs that it submitted under that scope. Other keys need read within the same selected tenant to inspect them. A job belongs to the project selected by the API key. Reading an unknown or another project's job returns not_found rather than disclosing cross-project state.

For customer-scoped jobs, repeat X-Internalize-Tenant on list and detail reads, or use a key restricted to that tenant. An omitted header on an unrestricted key selects only the project namespace. Responses include tenant_id (null for project memory); knowledge from another tenant is never returned. See Serve multiple customers.

Read a job

curl --fail-with-body "$INTERNALIZE_BASE_URL/v1/jobs/YOUR_JOB_ID" \
  -H "Authorization: Bearer $INTERNALIZE_API_KEY"

The response is the job object directly. This example is illustrative, with placeholder identifiers and usage:

{
  "id": "YOUR_JOB_ID",
  "subject_id": "support-policy",
  "kind": "inference",
  "status": "succeeded",
  "phase": "complete",
  "adapter_version": "YOUR_VERSION_ID",
  "usage": {
    "input_tokens": 120,
    "output_tokens": 80,
    "cached_input_tokens": 0,
    "training_tokens": 0
  },
  "billing": {
    "reserved_microusd": 25000,
    "charged_microusd": 3840,
    "settled": true,
    "pricing_version": "2026-09-27",
    "compute_microusd": 3840,
    "storage_microusd": 0
  },
  "result": { "text": "ILLUSTRATIVE_ANSWER", "finish_reason": "stop" },
  "error": null,
  "created_at": "2026-09-24T10:00:00.000Z",
  "updated_at": "2026-09-24T10:00:08.000Z"
}

Fields

FieldMeaning
idDurable job ID returned by admission
subject_idThe subject name supplied by the caller
kindinference or internalization
statusMachine-readable lifecycle state
phaseDiagnostic execution phase; do not treat it as a percentage
adapter_versionVersion resolved at admission, or base
usage.input_tokensRecorded inference input tokens
usage.output_tokensRecorded inference output tokens, including reasoning
billing.reserved_microusdOriginal reservation, retained for inspection
billing.charged_microusdSettled charge; inspect settled before treating it as final
billing.settledWhether the reservation has been settled
resultOperation-specific result, or null
errorJob error code and retryability, or null
created_at, updated_atISO UTC timestamps

For learning, adapter_version is the parent. The candidate appears under result.candidate.version_id. Validation uses passed, passed_count, and total_count; activation uses activated and activation_conflict.

Result objects can contain additional diagnostic fields. Read the known fields you need without assuming every operation has text or every unsuccessful job has a candidate. Do not expose an entire result object publicly without considering the model content it contains.

Status handling

StatusInterpretationNext step
queuedAdmitted, waiting for executionPoll
runningWorker executingPoll with backoff
succeededInference completedRead the answer and settlement
readyLearning candidate saved and validatedInspect activation outcome
rejectedLearning validation rejected the candidateReview source and evaluation
failedKnown terminal errorRead error and settled charge
reconciliation_requiredOutcome or usage remains ambiguousPreserve ID; request investigation

The public job error currently reports retryable: false. This is distinct from an HTTP error's retryability. Do not build a generic “retry all failures” button that resubmits paid work with a new key.

List jobs

curl --fail-with-body --get "$INTERNALIZE_BASE_URL/v1/jobs" \
  -H "Authorization: Bearer $INTERNALIZE_API_KEY" \
  --data-urlencode "limit=50"

List items contain only id, kind, status, phase, adapter_version, and created_at. Fetch the individual job for subject, answer, validation, usage, or billing details.

{ "data": [], "next_cursor": null }

Results are newest first. limit defaults to 50 and accepts integers from 1 to 100. When next_cursor is non-null, send it as the cursor query parameter using URL encoding. Continue until null. There are no public server-side kind, subject, date, or status filters in this endpoint.

Pagination is for discovery and history, not a replacement for saving admission receipts. Persist the job ID immediately and poll it directly. See Requests in the console for the corresponding inspection interface.

Price and usage details

usage.cached_input_tokens is a subset of input tokens. usage.training_tokens counts every billed training exposure. Learning input/output include teacher, scoring, and evaluation calls. billing.pricing_version is fixed at admission; compute_microusd and storage_microusd break down the settled charge. Missing or inconsistent provider receipts leave the request in reconciliation.

On this page