Reference

REST API reference

Tracking, artifacts, model registry, serving, prompts, and lineage endpoints.

Two surfaces — pick the one that fits:

SurfacePrefixUse 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

MethodPathDescription
POST/api/2.0/mlflow/experiments/createCreate 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/listList active
POST/api/2.0/mlflow/experiments/deleteSoft-delete
POST/api/2.0/mlflow/runs/createStart a run
GET/api/2.0/mlflow/runs/get?run_id=…Fetch run
POST/api/2.0/mlflow/runs/updateStatus / cost / tokens
POST/api/2.0/mlflow/runs/log-metricSingle metric point
POST/api/2.0/mlflow/runs/log-batchBatch metrics + params + tags
POST/api/2.0/mlflow/runs/log-parameterSingle param (set-once)
POST/api/2.0/mlflow/runs/set-tagMutable tag
GET/api/2.0/mlflow/metrics/get-history?run_id=…&metric_key=…Full step series
POST/api/2.0/mlflow/runs/searchList/filter runs
GET/api/v2.1/geneflow/runs/:run_id/cost{ cost_usd, tokens_used, duration_ms }

Artifacts

MethodPathDescription
POST/api/v2.1/geneflow/artifacts/:run_id/sign-uploadGet 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-uploadManifest write
DELETE/api/v2.1/geneflow/artifacts/:run_id/:pathRemove
GET/api/2.0/mlflow/artifacts/list?run_id=…List manifest
PUT/api/2.0/mlflow-artifacts/artifacts/:run_id/:pathLocal-mode upload
GET/api/2.0/mlflow-artifacts/artifacts/:run_id/:pathLocal-mode download

Model Registry

MethodPathDescription
POST/api/2.0/mlflow/registered-models/createRegister model
GET/api/2.0/mlflow/registered-models/get?name=…Fetch
POST/api/2.0/mlflow/model-versions/createNew version (snapshots metrics + cost)
POST/api/2.0/mlflow/model-versions/transition-stageMove 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

MethodPathDescription
POST/api/v2.1/geneflow/endpointsDeploy a model version
GET/api/v2.1/geneflow/endpointsList
GET/api/v2.1/geneflow/endpoints/:idOrNameFetch
PATCH/api/v2.1/geneflow/endpoints/:idOrNameRolling update (version, scale, drift policy)
DELETE/api/v2.1/geneflow/endpoints/:idOrNameTear down
GET/api/v2.1/geneflow/endpoints/:idOrName/revisionsDeploy history
GET/api/v2.1/geneflow/endpoints/:idOrName/metrics?window_minutes=NQPS, 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=NRun PSI
GET/api/v2.1/geneflow/endpoints/:idOrName/drift/alerts?only_open=trueList alerts
POST/api/v2.1/geneflow/drift/alerts/:id/ackAcknowledge
POST/api/v2.1/geneflow/models/:name/versions/:v/drift-baselinesSave training-time histograms
GET/api/v2.1/geneflow/models/:name/versions/:v/drift-baselinesFetch 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

MethodPathDescription
POST/api/v2.1/geneflow/promptsRegister or bump version
GET/api/v2.1/geneflow/promptsList prompts
GET/api/v2.1/geneflow/prompts/:name/versionsVersion list
GET/api/v2.1/geneflow/prompts/:name/versions/:versionFetch one version
POST/api/v2.1/geneflow/prompts/:name/versions/:version/transitionStage change (hash-chained audit)
POST/api/v2.1/geneflow/prompts/search-similarpgvector semantic search
POST/api/v2.1/geneflow/prompts/:name/collab/joinJoin Y.js collab session
POST/api/v2.1/geneflow/prompts/collab/:session_id/draftPersist intermediate draft
POST/api/v2.1/geneflow/prompts/collab/:session_id/leaveLeave session
GET/api/v2.1/geneflow/prompts/collab/activeActive sessions in tenant

Eval

MethodPathDescription
POST/api/v2.1/geneflow/eval-setsCreate eval set
GET/api/v2.1/geneflow/eval-setsList
POST/api/v2.1/geneflow/eval-runsRun an eval (judge_method: exact / bleu / llm_as_judge / custom)
GET/api/v2.1/geneflow/eval-runs/:idStatus + results

Lineage

MethodPathDescription
POST/api/v2.1/geneflow/runs/:run_id/lineageDeclare upstream (feature_group / dataset / model_version)
GET/api/v2.1/geneflow/runs/:run_id/upstreamWhat this run consumed
GET/api/v2.1/geneflow/lineage/downstream?kind=…&id=…What was trained from this asset

Projects (MLflow Projects compat)

MethodPathDescription
POST/api/2.0/mlflow/projects/runDispatch a project (LOCAL / DOCKER / K8S_JOB modes)
POST/api/v2.1/geneflow/projects/parseServer-side MLproject YAML validation

MLflow Importer

MethodPathDescription
POST/api/v2.1/geneflow/import-mlflowStart an import job
GET/api/v2.1/geneflow/import-mlflowList jobs in tenant
GET/api/v2.1/geneflow/import-mlflow/:idLive 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.