API docs
API reference

Platform

Account limits, long-running operations, webhooks and the health probe.

These routes are the plumbing around every integration rather than any single resource: discover the limits and features of your account, follow long-running work to completion, and monitor the service itself.

Several routes in the API respond 202 Accepted and hand back an operation id instead of a finished result. Poll an operation is the single way to follow all of them, and Register a webhook replaces polling with callbacks for work that runs for hours.

Get capabilities

GET/v1/capabilitiesscope: read

Returns the limits and feature flags for the calling account: the largest batch and sequence sizes the API accepts from you, the features enabled on your account and the base models you can train and serve.

Check it at startup instead of hardcoding limits, since values differ between accounts. For full metadata on each model, see List base models.

curl https://api.nucleus-ai.io/v1/capabilities \
  -H "Authorization: Bearer $NUCLEUS_API_KEY"
200 OK
{
  "max_batch_size": 256,
  "max_sequence_length": 1048576,
  "features": [
    "lora",
    "dpo",
    "vision",
    "embedding",
    "reranking",
    "image-generation",
    "video-generation",
    "audio"
  ],
  "supported_models": [
    "nvidia/Nemotron-3.5-Lightning",
    "openai/gpt-oss-20b",
    "nvidia/Nemotron-3-Nano-30B-A3B",
    "Qwen/Qwen3-8B",
    "Qwen/Qwen3.8-27B-A3B",
    "Qwen/Qwen3.6-35B-A3B",
    "zai-org/GLM-5.3-Flash",
    "openai/gpt-oss-120b",
    "MiniMaxAI/MiniMax-M3",
    "mistralai/Mistral-Medium-3.5",
    "deepseek-ai/DeepSeek-V4-Flash-0731",
    "deepseek-ai/DeepSeek-V4-Flash",
    "meta-llama/Llama-3.3-70B",
    "deepseek-ai/DeepSeek-V3.2",
    "deepseek-ai/DeepSeek-V3.1",
    "zai-org/GLM-5.2",
    "moonshotai/Kimi-K2.6",
    "zai-org/GLM-5.3",
    "nvidia/Nemotron-3-Ultra-550B-A55B",
    "deepseek-ai/DeepSeek-V4-Pro",
    "moonshotai/Kimi-K3",
    "google/gemma-4-E4B",
    "Qwen/Qwen3-VL-30B-A3B-Instruct",
    "Qwen/Qwen3-VL-8B-Instruct",
    "Qwen/Qwen3.5-9B",
    "google/gemma-4-31B",
    "Qwen/Qwen3-VL-235B-A22B-Instruct",
    "Qwen/Qwen3.5-397B-A17B",
    "google/embeddinggemma-300m",
    "BAAI/bge-reranker-v2-m3",
    "BAAI/bge-en-icl",
    "Qwen/Qwen3-Embedding-8B",
    "nomic-ai/nomic-embed-code",
    "Qwen/Qwen3-Reranker-8B",
    "black-forest-labs/FLUX.2-klein",
    "stabilityai/stable-diffusion-3.5-large",
    "Qwen/Qwen-Image",
    "black-forest-labs/FLUX.2-dev",
    "tencent/HunyuanVideo-1.5",
    "Lightricks/LTX-2",
    "Wan-AI/Wan2.2-T2V-A14B",
    "openai/whisper-large-v3-turbo",
    "nvidia/parakeet-tdt-1.1b",
    "nvidia/diar_sortformer_4spk-v1",
    "nvidia/Nemotron-3.5-ASR-Multilingual",
    "Qwen/Qwen3-TTS-1.7B",
    "openai/whisper-large-v3",
    "canopylabs/orpheus-3b-0.1-ft",
    "mistralai/Voxtral-4B-TTS-2603"
  ]
}

Poll an operation

GET/v1/operations/{operation_id}scope: read

Every route that returns 202 Accepted, such as weight exports, evaluations, benchmark generation, outcome source refreshes and large checkpoint writes, responds with an operation id. Poll this route with that id until the work completes; every async route shares this one status shape.

result is shaped by the work that produced it: an export gives a download URL and its expiry, a generation gives the benchmark it wrote, an evaluation gives the evaluation id whose results are then read from Retrieve an evaluation.

While the operation runs, the response carries its current status. When it finishes, result holds the outcome; for an export, that is a download URL and its expiry. If you would rather not poll, register a webhook and be called back instead.

Path parameters

operation_idstringrequired

ID of the operation, from the 202 Accepted response that started it.

curl https://api.nucleus-ai.io/v1/operations/op_91c4 \
  -H "Authorization: Bearer $NUCLEUS_API_KEY"
200 OK
{
  "id": "op_91c4",
  "status": "succeeded",
  "result": {
    "url": "https://storage.nucleus-ai.io/...",
    "expires_at": "2026-07-27T11:00:00Z"
  }
}

Register a webhook

POST/v1/webhooksscope: admin

Fine-tuning jobs run for hours, and polling for that long is wasteful and fragile. Register a webhook instead: Nucleus calls your endpoint whenever one of the events you subscribe to fires.

Body parameters

urlstringrequired

The HTTPS endpoint to deliver events to. Plain http URLs are rejected.

eventsstring[]

The event types to subscribe to, for example ["job.succeeded", "job.failed"].

secretstring

Used to sign each delivery, so your handler can verify the request came from Nucleus.

curl https://api.nucleus-ai.io/v1/webhooks \
  -H "Authorization: Bearer $NUCLEUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://customer.example/hooks/nucleus",
    "events": ["job.succeeded", "job.failed"],
    "secret": "a-long-random-signing-secret"
  }'
201 Created
{
  "id": "wh_5Qa",
  "url": "https://customer.example/hooks/nucleus",
  "events": ["job.succeeded", "job.failed"],
  "status": "active"
}

Service health

GET/v1/healthno auth

Reports service status. This is the only route that requires no authentication, so uptime monitors and status pages can measure availability without holding a key.

status is the overall roll-up; training and inference report each subsystem separately, so a degraded inference plane does not mask a healthy training plane, or the reverse.

curl https://api.nucleus-ai.io/v1/health
200 OK
{
  "status": "ok",
  "training": "ok",
  "inference": "degraded"
}
Platform | Nucleus AI API