Skip to main content
Reference for /v1/training_jobs/*. All endpoints require Bearer token auth (Authorization: Bearer vk_...) unless flagged worker-only.

Endpoints

Worker-only endpoints (used by the runner agent, authenticated via per-job callback_token): POST /status, POST /presigned-upload, POST /logs/presigned-upload. Documented in the worker-callbacks appendix at the bottom.

POST /v1/training_jobs

Create a job. Returns immediately with status queued. Request schema (TrainingJobCreate):
Required: base_model, dataset_id, output_name, gpu. Required for method=grpo and grpo_harness: reward_source (or reward_sources, or environments). dataset_id also accepts dataset stream references: a stream’s name or id with @latest or @snap-N (for example acme-feedback@latest). The job resolves and stores the pinned snapshot as dataset_snapshot_id in its response, so later appends never change what the job trains on. Reward fields: reward_source is the Python source text of a TRL-signature reward function. For multiple weighted rewards, pass reward_sources (a list) plus optional reward_weights (same length). reward_source/reward_sources and environments are mutually exclusive. Limits: at most 8 sources, 256 KiB each, and each source must define a function; violations are HTTP 400 at submit. See Reward functions. Validation rules:
  • method=grpo or grpo_harness → reward required (reward_source, reward_sources, or environments). grpo_agentic is being rebuilt and is not currently available.
  • method=sft_text, dpo, sft_video_gen, or custom_script → reward fields must be omitted (these learn from the dataset)
  • gpu.gpu_type must be one of: A100-80GB, H100-80GB, L4-24GB, A10G-24GB
  • gpu.gpu_count in [1, 8]
Errors:
  • 400 Bad Request: invalid reward source (too many, too large, or doesn’t define a function)
  • 402 Payment Required — credit balance too low for the requested resources (see Billing)
  • 404 Not Founddataset_id doesn’t exist or belongs to another user
  • 422 Unprocessable Entity — schema validation failed
Response (TrainingJobResponse, 201):

GET /v1/training_jobs

List your jobs. Filter by status (queued / provisioning / running / completed / failed / cancelled) or method (grpo / grpo_harness / sft_text / dpo / sft_video_gen).
Response is PaginatedList[TrainingJobResponse] with data + has_more.

GET /v1/training_jobs/

Single job. Same shape as the create response, but with timestamps populated as the job progresses.

GET /v1/training_jobs//metrics

Sampled training metrics for charting. Server-side stride downsampling if you ask for more than max_points. Query params:
  • keys — comma-separated metric names (e.g. loss,reward_mean,kl_div). Omit for all available.
  • from_step, to_step — inclusive bounds
  • max_points — cap result size, default 500, max 5000
Response:

GET /v1/training_jobs//events

Job lifecycle audit trail. Each event has timestamp, level (info / warn / error), event_type, and metadata.

GET /v1/training_jobs//logs

Tail of recent stdout from the worker. Returns chunked plain text. Falls back to the cached log_tail if the worker hasn’t streamed anything fresh. For the full log after a job completes, use /logs/full instead.

GET /v1/training_jobs//logs/full

Returns the complete stdout as plain text from S3 (uploaded ~30s during the run + a final flush at exit). Returns 206 Partial Content if the upload hasn’t happened yet (early-stage jobs); 404 if neither full log nor tail exists.

POST /v1/training_jobs//cancel

Cancel a non-terminal job. The worker terminates at the next checkpoint boundary, not instantly — status may stay running for a few seconds before flipping to cancelled.

DELETE /v1/training_jobs/

Hard-delete the job row + cascading metrics + events + S3 artifacts (logs, status files, checkpoints). Constraints:
  • Job must be in a terminal state (completed, failed, cancelled)
  • No active deployments may reference this job (source="training_job", source_job_id=this_id)
If a deployment still uses the checkpoint, you get 400 Bad Request — delete the deployment first.

GET /v1/training_jobs//model

Presigned S3 download URL for the final HF-format checkpoint. Only available after status=completed.
URL expires in 1 hour; re-call to get a fresh one.

Hyperparameter schemas

GRPOHyperparameters (method=grpo)

See GRPO algorithm for the full walkthrough. Schema fields with defaults:
LoRA and QLoRA are supported on GRPO — see GRPO algorithm.

AgenticGRPOHyperparameters (method=grpo_agentic)

Inherits all GRPO fields plus:
This method is being rebuilt and is not currently available. For environment-based RL today, use a custom script.

SFTVideoGenHyperparameters (method=sft_video_gen)

GPU config schema

Supported gpu_type values: A100-80GB, H100-80GB, L4-24GB, A10G-24GB. AMD MI300X-192GB is coming soon. On AWS, A100-80GB and H100-80GB launch as 8-GPU nodes; L4-24GB and A10G-24GB are the single-GPU shapes. On vast, A100-80GB and H100-80GB rent as flexible 1-8 GPU chunks; on digitalocean, H100-80GB comes in fixed 1x and 8x droplets. Run veri gpu list to see current availability and pricing for every shape.

Checkpoint destination schema

For s3, gs, az, you’ll need credentials configured via account integrations (or pass them inline — schema accepts a credentials field).

Worker callbacks (appendix)

These exist for the runner agent and are NOT for users to call directly. Auth is per-job callback_token (a 32-byte random secret stored in the DB on job creation), not your API key.
  • POST /v1/training_jobs/{id}/status — worker reports progress, metrics, terminal state
  • POST /v1/training_jobs/{id}/presigned-upload — worker requests a presigned S3 PUT URL for checkpoint files
  • POST /v1/training_jobs/{id}/logs/presigned-upload — worker requests a presigned S3 PUT URL for the full stdout
These are documented for completeness; the worker SDK handles them.

Datasets

dataset_id setup before submitting.

Reward functions

Writing and attaching reward_source.

Billing

Billing states and balance checks.

Quickstart

Full SDK + CLI walkthrough.