Tracking, artifacts, model registry, serving, prompts, and lineage endpoints.
Two surfaces — pick the one that fits:
| Surface | Prefix | Use when |
|---|
| MLflow-compatible | /api/2.0/mlflow/* | Existing mlflow clients, drop-in port |
| GeneFlow-native | /api/v2.1/geneflow/* | Prompts, cost, lineage, serving, drift, importer |
All endpoints require:
Authorization: Bearer <PAT> (GENEDATA_PAT env var)- Tenant resolved from JWT claim or
X-Tenant-Id header
Tracking
| Method | Path | Description |
|---|
| POST | /api/2.0/mlflow/experiments/create | Create experiment |
| GET | /api/2.0/mlflow/experiments/get-by-name?experiment_name=… | Lookup by name |
| GET | /api/2.0/mlflow/experiments/get?experiment_id=… | Lookup by ID |
| POST | /api/2.0/mlflow/experiments/list | List active |
| POST | /api/2.0/mlflow/experiments/delete | Soft-delete |
| POST | /api/2.0/mlflow/runs/create | Start a run |
| GET | /api/2.0/mlflow/runs/get?run_id=… | Fetch run |
| POST | /api/2.0/mlflow/runs/update | Status / cost / tokens |
| POST | /api/2.0/mlflow/runs/log-metric | Single metric point |
| POST | /api/2.0/mlflow/runs/log-batch | Batch metrics + params + tags |
| POST | /api/2.0/mlflow/runs/log-parameter | Single param (set-once) |
| POST | /api/2.0/mlflow/runs/set-tag | Mutable tag |
| GET | /api/2.0/mlflow/metrics/get-history?run_id=…&metric_key=… | Full step series |
| POST | /api/2.0/mlflow/runs/search | List/filter runs |
| GET | /api/v2.1/geneflow/runs/:run_id/cost | { cost_usd, tokens_used, duration_ms } |
Artifacts
| Method | Path | Description |
|---|
| POST | /api/v2.1/geneflow/artifacts/:run_id/sign-upload | Get presigned PUT URL (S3) |
| GET | /api/v2.1/geneflow/artifacts/:run_id/sign-download?path=… | Presigned GET URL |
| POST | /api/v2.1/geneflow/artifacts/:run_id/complete-upload | Manifest write |
| DELETE | /api/v2.1/geneflow/artifacts/:run_id/:path | Remove |
| GET | /api/2.0/mlflow/artifacts/list?run_id=… | List manifest |
| PUT | /api/2.0/mlflow-artifacts/artifacts/:run_id/:path | Local-mode upload |
| GET | /api/2.0/mlflow-artifacts/artifacts/:run_id/:path | Local-mode download |
Model Registry
| Method | Path | Description |
|---|
| POST | /api/2.0/mlflow/registered-models/create | Register model |
| GET | /api/2.0/mlflow/registered-models/get?name=… | Fetch |
| POST | /api/2.0/mlflow/model-versions/create | New version (snapshots metrics + cost) |
| POST | /api/2.0/mlflow/model-versions/transition-stage | Move to None/Staging/Production/Archived |
| GET | /api/v2.1/geneflow/models/:name/compare?a=N&b=M | { metricsDiff, costDiff } |
Production transitions require approval by default — set requireApproval=false on a version to bypass.
Model Serving
| Method | Path | Description |
|---|
| POST | /api/v2.1/geneflow/endpoints | Deploy a model version |
| GET | /api/v2.1/geneflow/endpoints | List |
| GET | /api/v2.1/geneflow/endpoints/:idOrName | Fetch |
| PATCH | /api/v2.1/geneflow/endpoints/:idOrName | Rolling update (version, scale, drift policy) |
| DELETE | /api/v2.1/geneflow/endpoints/:idOrName | Tear down |
| GET | /api/v2.1/geneflow/endpoints/:idOrName/revisions | Deploy history |
| GET | /api/v2.1/geneflow/endpoints/:idOrName/metrics?window_minutes=N | QPS, p50/p95/p99 ms, error %, cost |
| POST | /api/v2.1/geneflow/endpoints/:idOrName/log | (Sidecar) ingest inference batch |
| POST | /api/v2.1/geneflow/endpoints/:idOrName/drift/check?window_minutes=N | Run PSI |
| GET | /api/v2.1/geneflow/endpoints/:idOrName/drift/alerts?only_open=true | List alerts |
| POST | /api/v2.1/geneflow/drift/alerts/:id/ack | Acknowledge |
| POST | /api/v2.1/geneflow/models/:name/versions/:v/drift-baselines | Save training-time histograms |
| GET | /api/v2.1/geneflow/models/:name/versions/:v/drift-baselines | Fetch baselines |
Create endpoint body
{
"name": "fraud-prod",
"model_name": "fraud-detector",
"model_version": 3,
"instance_type": "cpu-large",
"replicas": 2,
"min_replicas": 1,
"max_replicas": 10,
"traffic_split_pct": 100,
"drift_check_enabled": true,
"drift_psi_threshold": 0.2
}
Endpoint metrics response
{
"endpointId": "ep_abc...",
"windowMinutes": 60,
"qps": 12.4,
"p50LatencyMs": 38,
"p95LatencyMs": 92,
"p99LatencyMs": 154,
"errorRatePct": 0.07,
"totalRequests": 44640,
"totalCostUsd": 0.86
}
Prompts
| Method | Path | Description |
|---|
| POST | /api/v2.1/geneflow/prompts | Register or bump version |
| GET | /api/v2.1/geneflow/prompts | List prompts |
| GET | /api/v2.1/geneflow/prompts/:name/versions | Version list |
| GET | /api/v2.1/geneflow/prompts/:name/versions/:version | Fetch one version |
| POST | /api/v2.1/geneflow/prompts/:name/versions/:version/transition | Stage change (hash-chained audit) |
| POST | /api/v2.1/geneflow/prompts/search-similar | pgvector semantic search |
| POST | /api/v2.1/geneflow/prompts/:name/collab/join | Join Y.js collab session |
| POST | /api/v2.1/geneflow/prompts/collab/:session_id/draft | Persist intermediate draft |
| POST | /api/v2.1/geneflow/prompts/collab/:session_id/leave | Leave session |
| GET | /api/v2.1/geneflow/prompts/collab/active | Active sessions in tenant |
Eval
| Method | Path | Description |
|---|
| POST | /api/v2.1/geneflow/eval-sets | Create eval set |
| GET | /api/v2.1/geneflow/eval-sets | List |
| POST | /api/v2.1/geneflow/eval-runs | Run an eval (judge_method: exact / bleu / llm_as_judge / custom) |
| GET | /api/v2.1/geneflow/eval-runs/:id | Status + results |
Lineage
| Method | Path | Description |
|---|
| POST | /api/v2.1/geneflow/runs/:run_id/lineage | Declare upstream (feature_group / dataset / model_version) |
| GET | /api/v2.1/geneflow/runs/:run_id/upstream | What this run consumed |
| GET | /api/v2.1/geneflow/lineage/downstream?kind=…&id=… | What was trained from this asset |
Projects (MLflow Projects compat)
| Method | Path | Description |
|---|
| POST | /api/2.0/mlflow/projects/run | Dispatch a project (LOCAL / DOCKER / K8S_JOB modes) |
| POST | /api/v2.1/geneflow/projects/parse | Server-side MLproject YAML validation |
MLflow Importer
| Method | Path | Description |
|---|
| POST | /api/v2.1/geneflow/import-mlflow | Start an import job |
| GET | /api/v2.1/geneflow/import-mlflow | List jobs in tenant |
| GET | /api/v2.1/geneflow/import-mlflow/:id | Live status (phase, counts, log tail) |
Import body
{
"source_uri": "https://mlflow.example.com",
"source_token": "...",
"experiment_names": ["fraud_v1", "fraud_v2"],
"registered_models": ["fraud-detector"],
"dry_run": false,
"experiment_prefix": "mlflow:",
"include_deleted": false,
"copy_artifacts": false
}
Error envelope
{ "error": "endpoint 'fraud-prod' already exists", "code": "conflict" }
code values: not_found, conflict, invalid, forbidden, approval_required.
Rate limits & quotas
Set per tenant in CustomerTenantSettings.geneflow — see docs/CUSTOMER_TENANT_SETTINGS.md. Defaults: 1000 runs/hr, 100 endpoints, 10 GiB artifact storage, 10 concurrent K8s Jobs.