Foundation models
Pretrained forecasting models — browse what's available, deploy zero-shot, or fine-tune an adapter on your data. One API for every model, predictfm included.
Foundation models are pretrained time-series models hosted by the platform. They've already learned general temporal patterns from large corpora, so you can use them two ways:
- Zero-shot — deploy a model directly and start inferring. No training run, no credits spent on compute.
- Fine-tuned — train a small adapter on your segment. The model's weights stay frozen; the adapter captures what's specific about your data.
Every foundation model is identified the same way: a family (which
model line it belongs to — predictfm, chronos_bolt, timesfm,
moirai, …) and a slug (which size or version within that family —
chronos-bolt-base, predictfm-f-v0.1, …). predictfm is the
platform's first-party family; it works exactly like the open-source
ones.
All routes live under /v1/models/foundation. Foundation models also
show up in the
public model catalog
as kind: "foundation_backbone" rows.
List foundation models
Every model in the list is ready to use — you can deploy it zero-shot or fine-tune it right away:
curl "$API_BASE/v1/models/foundation" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Workspace-Id: $WORKSPACE_ID"from predictai import PredictAI
client = PredictAI(token="pa_live_…", workspace_id="ws_…")
data = client.foundation.get_models_foundation()
import { PredictAI } from "@predictai/sdk";
const client = new PredictAI({ token: "pa_live_…", workspaceId: "ws_…" });
const data = await client.foundation.getModelsFoundation();
{
"data": {
"models": [
{
"family": "chronos_bolt",
"slug": "chronos-bolt-base",
"vendor": "Amazon",
"license": "Apache-2.0",
"params": "205M",
"recommended": true,
"deprecated": false,
"downloads": 342,
"supports": { "tasks": ["forecast"], "max_context": 2048, "max_horizon": 64 },
…
},
{
"family": "predictfm",
"slug": "predictfm-f-v0.1",
"vendor": "predictAI",
"license": "proprietary",
"license_commercial_ok": true,
"recommended": true,
…
}
],
"count": 2
}
}Query parameters
| Parameter | Meaning |
|---|---|
family optional | Only one family: predictfm, chronos_bolt, timesfm, moirai, … |
task optional | Only models supporting a task: forecast, embed, impute, classify, anomaly, multivariate. |
include_deprecated optional | Include retired models. Defaults to false. |
Recommended models sort first, then by downloads.
Response fields
| Field | Meaning |
|---|---|
family / slug | The model's identity — what you reference everywhere else. |
vendor / license / license_commercial_ok | Who built it and what you're allowed to do with it. |
params | Model size. |
recommended | The platform's suggested pick within a family. |
deprecated | true when retired — keeps serving existing deployments, no new ones. |
supports | Capability caps: tasks, max_context (lookback cap), max_horizon. |
Fetch one with GET /v1/models/foundation/{family}/{slug} — 404 with
"Foundation model chronos_bolt/chronos-bolt-tiny is not available" if
the platform doesn't host it.
Check license_commercial_ok before building on a model — some
open-source models are research-only.
Deploy zero-shot
POST /v1/models/deploy-foundation creates a live deployment of a
foundation model directly — no model row, no pipeline, no training.
Reference the model by family + slug, or by its catalog
blueprint_uid:
curl -X POST "$API_BASE/v1/models/deploy-foundation" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Workspace-Id: $WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"family": "chronos_bolt",
"slug": "chronos-bolt-base",
"horizon": 64
}'from predictai import PredictAI
client = PredictAI(token="pa_live_…", workspace_id="ws_…")
data = client.models.post_models_deploy_foundation(json={
"family": "chronos_bolt",
"slug": "chronos-bolt-base",
"horizon": 64,
})
import { PredictAI } from "@predictai/sdk";
const client = new PredictAI({ token: "pa_live_…", workspaceId: "ws_…" });
const data = await client.models.postModelsDeployFoundation({
json: {
family: "chronos_bolt",
slug: "chronos-bolt-base",
horizon: 64,
},
});
{
"data": {
"promotion_id": "3f8a1c02-…",
"deployment_type": "foundation",
"status": "deployed",
"ready": true,
"message": "Model is deployed and ready for inference."
}
}Request body
| Field | Meaning |
|---|---|
family required | The model family. Send family + slug — or blueprint_uid instead of both. |
slug required | The model within the family. |
blueprint_uid optional | The catalog ID (pfm__… / extfm__…) as an alternative to family + slug. |
horizon optional | Default forecast horizon for this deployment. Defaults to 128. |
reason optional | Free-text note stored on the deployment. |
Zero-shot deployments run on always-on shared serving — a 201 with
"status": "deployed" means you can call
inference immediately. If the serving pool is
still warming, status starts at "deploying" and flips to "deployed"
when it's ready; watch it in Deployments.
Errors
| Status | Why | Example message |
|---|---|---|
400 | Neither a catalog blueprint_uid nor family + slug given | "Provide either 'blueprint_uid' (foundation prefix) or 'family' + 'slug'" |
404 | The model doesn't exist / isn't available | "Foundation model chronos_bolt/chronos-bolt-tiny is not available" |
409 | You already deployed this model in this workspace | "This foundation model is already deployed." |
503 | Shared foundation serving isn't provisioned in this region | error.code SERVING_UNAVAILABLE |
The 409 and 503 bodies are returned bare (no data envelope):
error.code ALREADY_DEPLOYED (with error.details.promotion_id) — the
promotion_id points at your existing deployment.
Fine-tune a foundation model
An adapter is what fine-tuning produces: a compact set of weights trained on your segment, applied on top of the frozen foundation model at inference time. Adapters are cheap to train, cheap to store, and swappable.
To fine-tune, create a model with kind: "foundation" and train it
with a pipeline:
curl -X POST "$API_BASE/v1/models" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Workspace-Id: $WORKSPACE_ID" \
-H "Content-Type: application/json" \
-d '{
"kind": "foundation",
"name": "Chronos tuned for daily sales",
"purpose": "Fine-tune chronos-bolt-base on retail data",
"description": "Adapter over chronos_bolt/chronos-bolt-base",
"visibility": "private",
"categories": ["retail"],
"tags": ["forecast"],
"metadata": {},
"family": "chronos_bolt",
"slug": "chronos-bolt-base",
"intensity": "adapt",
"lookback": 2048,
"horizon": 64
}'from predictai import PredictAI
client = PredictAI(token="pa_live_…", workspace_id="ws_…")
data = client.models.post_models(json={
"kind": "foundation",
"name": "Chronos tuned for daily sales",
"purpose": "Fine-tune chronos-bolt-base on retail data",
"description": "Adapter over chronos_bolt/chronos-bolt-base",
"visibility": "private",
"categories": ["retail"],
"tags": ["forecast"],
"metadata": {},
"family": "chronos_bolt",
"slug": "chronos-bolt-base",
"intensity": "adapt",
"lookback": 2048,
"horizon": 64,
})
import { PredictAI } from "@predictai/sdk";
const client = new PredictAI({ token: "pa_live_…", workspaceId: "ws_…" });
const data = await client.models.postModels({
json: {
kind: "foundation",
name: "Chronos tuned for daily sales",
purpose: "Fine-tune chronos-bolt-base on retail data",
description: "Adapter over chronos_bolt/chronos-bolt-base",
visibility: "private",
categories: ["retail"],
tags: ["forecast"],
metadata: {},
family: "chronos_bolt",
slug: "chronos-bolt-base",
intensity: "adapt",
lookback: 2048,
horizon: 64,
},
});
{
"data": {
"uid": "d3f81c56-…",
"message": "Model created successfully"
}
}The kind-specific fields (on top of the shared catalog fields):
| Field | Meaning |
|---|---|
family required | Any available family — predictfm, chronos_bolt, … |
slug required | Which model of that family. For predictfm, defaults from task. |
task optional | forecast (default), embed, impute, classify, anomaly, multivariate. |
intensity optional | How much fine-tuning to do: adapt (default), specialize, or forge. Deeper costs more. |
lookback optional | Context window per sample. Defaults to 2048, capped by the family's max_context. |
horizon optional | Forecast horizon. Defaults to 128, capped by the family's max_horizon. |
Exceeding a family cap returns 400, e.g. "foundation 'horizon' for family 'chronos_bolt' is capped at 64; got 128". Only available
families are accepted. Fine-tuning charges credits upfront by
intensity — see Billing.
You can also skip creating a model document entirely: pass the
foundation model straight into a
pipeline's models array
({"family": "chronos_bolt", "slug": "chronos-bolt-base"}) — on its
own, or in a pool racing your own models — and the platform
synthesizes the training recipe for you.
Browse adapters
Adapters produced by fine-tuning — across every family — share one list:
curl "$API_BASE/v1/models/foundation/adapters?family=chronos_bolt&visibility=all" \
-H "Authorization: Bearer $TOKEN" \
-H "X-Workspace-Id: $WORKSPACE_ID"from predictai import PredictAI
client = PredictAI(token="pa_live_…", workspace_id="ws_…")
data = client.foundation.get_models_foundation_adapters(params={"family": "chronos_bolt", "visibility": "all"})
import { PredictAI } from "@predictai/sdk";
const client = new PredictAI({ token: "pa_live_…", workspaceId: "ws_…" });
const data = await client.foundation.getModelsFoundationAdapters({ params: { family: "chronos_bolt", visibility: "all" } });
{
"data": {
"adapters": [
{
"adapter_id": "adp_5T1MW8KQ2Z7X4CJ9NB0RHV",
"family": "chronos_bolt",
"backbone_slug": "chronos-bolt-base",
"task": "forecast",
"visibility": "private",
…
}
],
"count": 1
}
}Query parameters
| Parameter | Meaning |
|---|---|
family optional | Only adapters over one family. |
slug optional | Only adapters over one foundation model. |
task optional | Only one task. |
owner optional | Only one owner's adapters. |
visibility optional | public (default), private (only yours), or all (public plus yours). Other owners' private adapters are never returned. |
GET /v1/models/foundation/adapters/{adapter_id} fetches one (404
"Adapter 'adp_…' not found" — also returned for private adapters you
don't own).
Which foundation models are available (and when an old one is
retired) is managed by the platform — you'll occasionally see a model
marked deprecated: true in listings. Deprecated models keep serving
existing deployments; they just stop being offered for new ones.

