API referenceAgents APISelf-hosted runnersRegister a runner

Register a runner

⚠️
Preview — this feature is being built; the design below is the spec.
POST https://app.syntic.ai/v1/environments/{environment_id}/runners

Register a machine you operate as a runner for a self-hosted environment. The response holds the runner token (srt_...) that the runner process uses to claim work; it is shown only once. Only environments created with hosting: self_hosted accept runners.

For how this fits into a full workflow, see Self-hosted runners.

Headers

HeaderRequiredValue
AuthorizationYesBearer <key>: a private inference key (sk_live_...). See Authentication.
syntic-betaYes, while in previewagents-2026-11-01. Without it the call fails with 400 beta_required. See Versioning.
Content-TypeYesapplication/json
Idempotency-KeyNoUp to 255 characters. Retrying with the same key within 24 hours returns the first result instead of acting twice. See Idempotency.

Path parameters

ParameterTypeDescription
environment_idstringThe environment id, starting with env_.

Body parameters

ParameterTypeRequiredNotes
namestringYes1 to 64 characters, unique within the environment.
labelsarray of stringsNoUp to 10 labels, each up to 32 characters.
max_concurrent_sessionsintegerNoDefault 1, up to 64.

Response

201 Created, Content-Type: application/json

{
  "id": "rnr_01JCD0B2D4F6H8K0M2P4",
  "type": "runner",
  "environment_id": "env_01JC5B2D4F6H8K0M2P4R",
  "name": "dc1-build-01",
  "labels": [
    "gpu",
    "eu"
  ],
  "max_concurrent_sessions": 4,
  "status": "offline",
  "version": null,
  "active_sessions": 0,
  "last_seen_at": null,
  "created_at": "2026-11-01T08:00:00Z",
  "token": "srt_live_4Hc9…redacted"
}
FieldTypeDescription
idstringStarts with rnr_.
labelsarrayFree-form tags. Sessions can require labels through runner_selector on the environment.
max_concurrent_sessionsintegerHow many sessions the runner accepts at once, 1 to 64.
statusstringonline (heartbeat within 60 s), offline or draining.
versionstringThe runner software version it reported.
last_seen_atstring or nullTime of the last claim or heartbeat.
tokenstringThe runner’s credential. Returned only by this call. Store it on the runner host only.

Examples

curl -sS "https://app.syntic.ai/v1/environments/env_01JC5B2D4F6H8K0M2P4R/runners" \
  -H "Authorization: Bearer $SYNTIC_API_KEY" \
  -H "syntic-beta: agents-2026-11-01" \
  -H "Idempotency-Key: 8d6f0c1e-4b2a-4a57-9f0e-2f1d3c4b5a69" \
  -H "Content-Type: application/json" \
  -d '{
      "name": "dc1-build-01",
      "labels": [
        "gpu",
        "eu"
      ],
      "max_concurrent_sessions": 4
    }'

Errors

Errors use the error envelope and carry a request_id. Codes specific to this operation:

StatustypecodeWhen
400invalid_request_errorbeta_requiredThe syntic-beta header is missing.
400invalid_request_errorenvironment_not_self_hostedThe environment is hosted by Syntic.
409conflict_errorrunner_name_takenAnother runner in the environment has this name.
404not_found_errorenvironment_not_foundNo environment with this id in the key’s workspace.
401authentication_errorinvalid_api_keyThe key is missing, unknown, revoked or expired.
429rate_limit_errorrate_limitedToo many requests; wait for Retry-After. See Rate-limit headers.
Was this page helpful?