Download OpenAPI specification:Download
Public REST API for the NeoSpace platform (inference, chat, and platform management).
List audit logs across all spaces. space_id is an optional filter from the query string.
| limit | integer Limit |
| after | string After |
| action | Array of strings Action |
| resource_type | Array of strings Resource type |
| resource_id | Array of strings Resource ID |
| space_id | Array of strings Space ID (optional filter) |
| status_code | Array of integers Status code |
| start_time | string Start time (RFC3339 or YYYY-MM-DD) |
| end_time | string End time (RFC3339 or YYYY-MM-DD) |
curl -X GET "https://tenant.api.neospace.ai/v1/admin/audits" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "action": "example",
- "api_key": "REDACTED",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_api_key": false,
- "metadata": { },
- "resource_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "resource_type": "example",
- "space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "status_code": 1,
- "timestamp": "2026-01-15T10:30:00Z",
- "user_email": "someone@example.com",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "user_name": "churn-propensity-v3"
}
], - "has_more": false
}Distinct values available for each audit filter, across every space.
curl -X GET "https://tenant.api.neospace.ai/v1/admin/audits/facets" \ -H "x-api-key: $API_KEY"
{- "actions": [
- "example"
], - "resource_types": [
- "example"
]
}Get any audit log entry regardless of space.
| id required | string Audit ID |
curl -X GET "https://tenant.api.neospace.ai/v1/admin/audits/{id}" \ -H "x-api-key: $API_KEY"
{- "action": "example",
- "api_key": "REDACTED",
- "id": "aud_1a2b3c4d5e6f708192a3b4c5",
- "is_api_key": false,
- "metadata": { },
- "resource_id": "aud_1a2b3c4d5e6f708192a3b4c5",
- "resource_type": "example",
- "space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "status_code": 1,
- "timestamp": "2026-01-15T10:30:00Z",
- "user_email": "someone@example.com",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "user_name": "churn-propensity-v3"
}Read the current org-wide MFA enforcement policy from the auth-service
curl -X GET "https://tenant.api.neospace.ai/v1/admin/mfa-policy" \ -H "x-api-key: $API_KEY"
{- "org_wide": false,
- "required_groups": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z"
}Replace the org-wide MFA enforcement policy. required_groups must name existing seats.
Desired MFA policy
| org_wide | boolean |
| required_groups | Array of strings |
{- "org_wide": true,
- "required_groups": [
- "string"
]
}{- "org_wide": false,
- "required_groups": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z"
}curl -X GET "https://tenant.api.neospace.ai/v1/admin/users" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "email": "someone@example.com",
- "external_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "first_name": "churn-propensity-v3",
- "id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "last_name": "churn-propensity-v3",
- "lifecycle_state": "PENDING",
- "login_type": "email",
- "role": "designer",
- "seats": [
- "example"
], - "spaces": [
- "example"
]
}
], - "has_more": false
}Blocks the account (reversible). Proxied to the auth-service.
| id required | string User ID |
curl -X POST "https://tenant.api.neospace.ai/v1/admin/users/{id}/suspend" \ -H "x-api-key: $API_KEY"
{- "message": "Example message"
}curl -X GET "https://tenant.api.neospace.ai/v1/admin/oidc/providers" \ -H "x-api-key: $API_KEY"
[- {
- "client_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "display_name": "Churn propensity",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "issuer": "example",
- "scim_managed": false,
- "scopes": "example",
- "slug": "example",
- "updated_at": "2026-01-15T10:30:00Z"
}
]Creates a new OIDC provider with KMS-encrypted client_secret
Provider configuration
| client_id required | string |
| client_secret required | string |
| display_name | string |
| issuer required | string |
| scim_managed | boolean ScimManaged marks the provider as SCIM-governed. It changes two things at once: the auth-service stops JIT-creating unknown SSO users (SCIM must provision them first), and seats become IdP-owned — the tenant's groups are then the authority on which seats exist, and the manual seat-assignment paths are refused. |
| scopes | string |
| slug required | string |
{- "client_id": "string",
- "client_secret": "string",
- "display_name": "string",
- "issuer": "string",
- "scim_managed": true,
- "scopes": "string",
- "slug": "string"
}{- "client_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "display_name": "Churn propensity",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "issuer": "example",
- "scim_managed": false,
- "scopes": "example",
- "slug": "example",
- "updated_at": "2026-01-15T10:30:00Z"
}Returns a single OIDC provider by slug for admin management
| slug required | string Provider slug |
curl -X GET "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}" \ -H "x-api-key: $API_KEY"
{- "client_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "display_name": "Churn propensity",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "issuer": "example",
- "scim_managed": false,
- "scopes": "example",
- "slug": "example",
- "updated_at": "2026-01-15T10:30:00Z"
}Updates fields of an existing OIDC provider (partial update)
| slug required | string Provider slug |
Fields to update
| client_id | string |
| client_secret | string |
| display_name | string |
| issuer | string |
| scim_managed | boolean |
| scopes | string |
{- "client_id": "string",
- "client_secret": "string",
- "display_name": "string",
- "issuer": "string",
- "scim_managed": true,
- "scopes": "string"
}{- "client_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "display_name": "Churn propensity",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "issuer": "example",
- "scim_managed": false,
- "scopes": "example",
- "slug": "example",
- "updated_at": "2026-01-15T10:30:00Z"
}curl -X GET "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens" \ -H "x-api-key: $API_KEY"
[- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "expires_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_used": "example",
- "revoked_at": "2026-01-15T10:30:00Z",
- "revoked_by": "example",
- "status": "PENDING"
}
]Mints a SCIM provisioning bearer token; the plaintext is returned only in this response
| slug required | string Provider slug |
| ttl | string Token lifetime (7d | 1m | 2m | 3m | never); defaults to 7d |
curl -X POST "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "expires_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_used": "example",
- "revoked_at": "2026-01-15T10:30:00Z",
- "revoked_by": "example",
- "status": "PENDING",
- "token": "REDACTED"
}Revokes the provider's current SCIM token and mints a new one; the old token stops working immediately and the new plaintext is returned only in this response
| slug required | string Provider slug |
| ttl | string Token lifetime (7d | 1m | 2m | 3m | never); defaults to 7d |
curl -X POST "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens/regenerate" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "expires_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_used": "example",
- "revoked_at": "2026-01-15T10:30:00Z",
- "revoked_by": "example",
- "status": "PENDING",
- "token": "REDACTED"
}Revokes a SCIM token immediately. SCIM provisioning stops until a new token is generated.
| id required | string Token id |
curl -X DELETE "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens/{id}" \ -H "x-api-key: $API_KEY"
Get a paginated list of API keys for the current user
| limit | integer Default: 10 Limit |
| after | string Default: "\"\"" After |
| spaces | Array of strings Filter by space IDs (can be multiple) |
| start_date | string Filter by start date (RFC3339 format, e.g., 2024-01-01T00:00:00Z) |
| end_date | string Filter by end date (RFC3339 format, e.g., 2024-12-31T23:59:59Z) |
| created_by | string Filter by creator ID or email |
| name | string Filter by API key name |
curl -X GET "https://tenant.api.neospace.ai/v1/api-keys" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "deleted_at": "2026-01-15T10:30:00Z",
- "deleted_by": "example",
- "grant": { },
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "key": "REDACTED",
- "last_used": "example",
- "name": "churn-propensity-v3",
- "permissions": [
- { }
], - "spaces": [
- { }
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}
], - "has_more": false
}Create a new API key
API key creation request
| created_by | string CreatedBy is set server-side (the acting user's external id) before the request is federated to the auth-service; any client value is overwritten. |
object Grant is the authorization, with the two axes stated separately. When it is set, Permissions/Spaces are filled from it server-side before the request is federated — the auth-service still stores the flat pair. | |
| name required | string |
| permissions | Array of strings (permissions.ApiKeyPermission) Items Enum: "architectures:list" "*" "benchmarks:create" "benchmarks:delete" "benchmarks:get" "benchmarks:list" "benchmarks:update" "clusters:list" "evaluations:create" "leaderboards:list" "inference-servers:create" "inference-servers:delete" "inference-servers:get" "inference-servers:list" "inference-servers:update" "trainings:create" "trainings:cancel" "trainings:delete" "trainings:get" "trainings:list" "trainings:update" "data-models:create" "data-models:delete" "data-models:get" "data-models:list" "data-models:update" "data-enhancements:create" "data-enhancements:delete" "data-enhancements:get" "data-enhancements:list" "data-enhancements:update" Permissions loses its Deprecated: use Grant. |
| spaces | Array of strings Spaces is not Deprecated: use Grant. |
{- "created_by": "string",
- "grant": {
- "admin": true,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": true,
- "ids": [
- "string"
], - "permissions": [
- "audits:get"
]
}
}, - "name": "string",
- "permissions": [
- "architectures:list"
], - "spaces": [
- "string"
]
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "deleted_at": "2026-01-15T10:30:00Z",
- "deleted_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "key": "REDACTED",
- "last_used": "example",
- "name": "churn-propensity-v3",
- "permissions": [
- "architectures:list"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}curl -X GET "https://tenant.api.neospace.ai/v1/api-keys/{id}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "deleted_at": "2026-01-15T10:30:00Z",
- "deleted_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "key": "REDACTED",
- "last_used": "example",
- "name": "churn-propensity-v3",
- "permissions": [
- "architectures:list"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Update an API key by ID
| id required | string API key ID |
API key update request
object Grant replaces the key's authorization wholesale when present, and leaves it untouched when absent — no field-by-field merge against stored values. | |
| name | string |
| permissions | Array of strings (permissions.ApiKeyPermission) Items Enum: "architectures:list" "*" "benchmarks:create" "benchmarks:delete" "benchmarks:get" "benchmarks:list" "benchmarks:update" "clusters:list" "evaluations:create" "leaderboards:list" "inference-servers:create" "inference-servers:delete" "inference-servers:get" "inference-servers:list" "inference-servers:update" "trainings:create" "trainings:cancel" "trainings:delete" "trainings:get" "trainings:list" "trainings:update" "data-models:create" "data-models:delete" "data-models:get" "data-models:list" "data-models:update" "data-enhancements:create" "data-enhancements:delete" "data-enhancements:get" "data-enhancements:list" "data-enhancements:update" Deprecated: use Grant. Merged against the stored key, as before. |
| spaces | Array of strings Deprecated: use Grant. Merged against the stored key, as before. |
| updated_by | string UpdatedBy is set server-side before federating to the auth-service. |
{- "grant": {
- "admin": true,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": true,
- "ids": [
- "string"
], - "permissions": [
- "audits:get"
]
}
}, - "name": "string",
- "permissions": [
- "architectures:list"
], - "spaces": [
- "string"
], - "updated_by": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "deleted_at": "2026-01-15T10:30:00Z",
- "deleted_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "key": "REDACTED",
- "last_used": "example",
- "name": "churn-propensity-v3",
- "permissions": [
- "architectures:list"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Handles the callback from OIDC provider after user authentication
| code required | string Authorization code |
| state required | string State parameter |
curl -X GET "https://tenant.api.neospace.ai/v1/auth/oidc/callback?code=CODE&state=STATE" \ -H "x-api-key: $API_KEY"
"example"Starts the OIDC authentication flow for the requested provider (optional when only one IdP is configured)
Login options
| provider | string |
{- "provider": "string"
}{
}curl -X GET "https://tenant.api.neospace.ai/v1/auth/oidc/providers" \ -H "x-api-key: $API_KEY"
[- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}
]curl -X GET "https://tenant.api.neospace.ai/v1/clusters" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "inference": { },
- "ingress": { },
- "nodes": [
- { }
], - "resources": { }
}
], - "has_more": false
}Create a new cluster
Cluster creation request
| description | string |
| name | string |
{- "description": "string",
- "name": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "nodes": [
- "example"
], - "spaces": [
- "example"
], - "stats": {
- "avg_disk_percent": 0.5,
- "avg_gpu_percent": 0.5,
- "avg_memory_percent": 0.5,
- "completed_jobs": 1,
- "failed_jobs": 1,
- "network_rx_bytes": 1,
- "network_tx_bytes": 1,
- "pending_jobs": 1,
- "running_jobs": 1,
- "total_nodes": 2
}, - "status": "HEALTHY",
- "updated_at": "2026-01-15T10:30:00Z"
}List the cluster's neocore Endpoints (stable service identities — headless DNS or balanced Envoy VIP) with their runtime backends + load balancer
| cluster required | string Cluster ID |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/endpoints" \ -H "x-api-key: $API_KEY"
{- "items": [
- {
- "metadata": { },
- "revision": 1,
- "runtime": { },
- "spec": { },
- "status": { }
}
], - "revision": 1
}Create a neocore Endpoint (a stable service identity — headless DNS or balanced Envoy VIP — selecting backing tasks by label). The cluster label is stamped server-side.
| cluster required | string Cluster ID |
Endpoint create request
object (request.NeocoreV2Metadata) | |
object (request.NeocoreV2EndpointSpec) |
{- "metadata": {
- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "string"
}, - "spec": {
- "health_check_path": "string",
- "mode": "headless",
- "port": 0,
- "protocol": "string",
- "proxy": {
- "allowed_methods": [
- "string"
], - "allowed_paths": [
- "string"
], - "enabled": true,
- "max_body_bytes": 0,
- "timeout_ms": 0
}, - "route_timeout_seconds": 0,
- "selector": {
- "property1": "string",
- "property2": "string"
}, - "stream_idle_timeout_seconds": 0,
- "target_port": 0,
- "wake_targets": [
- "string"
]
}
}{- "metadata": {
- "labels": { },
- "name": "churn-propensity-v3"
}, - "revision": 1,
- "runtime": {
- "address": "example",
- "backends": [
- { }
], - "external_host": "example",
- "lb_status": "PENDING",
- "listen_port": 1,
- "ready_backends": 1,
- "total_backends": 1,
- "updated_at": "2026-01-15T10:30:00Z"
}, - "spec": {
- "health_check_path": "/datasets/transactions",
- "mode": "headless",
- "port": 1,
- "protocol": "example",
- "proxy": {
- "allowed_methods": [
- "example"
], - "allowed_paths": [
- "/datasets/transactions"
], - "enabled": true,
- "max_body_bytes": 4,
- "timeout_ms": 1
}, - "route_timeout_seconds": 1,
- "selector": { },
- "stream_idle_timeout_seconds": 1,
- "target_port": 1,
- "wake_targets": [
- "example"
]
}, - "status": {
- "created_at": "2026-01-15T10:30:00Z",
- "reason": "Example message",
- "state": "PENDING",
- "updated_at": "2026-01-15T10:30:00Z"
}
}Delete a neocore Endpoint by name. Clients dialing its address stop resolving; the backing tasks are untouched.
| cluster required | string Cluster ID |
| endpoint required | string Endpoint name |
curl -X DELETE "https://tenant.api.neospace.ai/v1/clusters/{cluster}/endpoints/{endpoint}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}Fetch a single neocore Endpoint (spec + status + runtime backends/LB), scoped to the cluster
| cluster required | string Cluster ID |
| endpoint required | string Endpoint name |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/endpoints/{endpoint}" \ -H "x-api-key: $API_KEY"
{- "metadata": {
- "labels": { },
- "name": "churn-propensity-v3"
}, - "revision": 1,
- "runtime": {
- "address": "example",
- "backends": [
- { }
], - "external_host": "example",
- "lb_status": "PENDING",
- "listen_port": 1,
- "ready_backends": 1,
- "total_backends": 1,
- "updated_at": "2026-01-15T10:30:00Z"
}, - "spec": {
- "health_check_path": "/datasets/transactions",
- "mode": "headless",
- "port": 1,
- "protocol": "example",
- "proxy": {
- "allowed_methods": [
- "example"
], - "allowed_paths": [
- "/datasets/transactions"
], - "enabled": true,
- "max_body_bytes": 4,
- "timeout_ms": 1
}, - "route_timeout_seconds": 1,
- "selector": { },
- "stream_idle_timeout_seconds": 1,
- "target_port": 1,
- "wake_targets": [
- "example"
]
}, - "status": {
- "created_at": "2026-01-15T10:30:00Z",
- "reason": "Example message",
- "state": "PENDING",
- "updated_at": "2026-01-15T10:30:00Z"
}
}List all jobs enriched with task details, node info, and CPU/GPU utilization, optionally filtered by state
| cluster required | string Cluster ID |
| state | string Filter by job state (Pending, Running, Completed, Failed, Canceled) |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/jobs" \ -H "x-api-key: $API_KEY"
{- "completed_jobs": 1,
- "failed_jobs": 1,
- "items": [
- {
- "cpu_utilization": 0.5,
- "gpu_utilization": 0.5,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "example",
- "name": "churn-propensity-v3",
- "node": { },
- "status": "PENDING",
- "submitted_at": "2026-01-15T10:30:00Z",
- "tasks": [
- { }
]
}
], - "running_jobs": 1,
- "total_jobs": 1
}List all jobs currently in pending/queued state
| cluster required | string Cluster ID |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/jobs/queue" \ -H "x-api-key: $API_KEY"
{- "items": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "example",
- "name": "churn-propensity-v3",
- "node": { },
- "status": "PENDING",
- "submitted_at": "2026-01-15T10:30:00Z"
}
], - "total_jobs": 1
}Recreate a job from its own stored spec (delete + create with identical metadata and spec). Takes no request body — the job contract cannot be supplied by the client.
| cluster required | string Cluster ID |
| job required | string Job name |
curl -X POST "https://tenant.api.neospace.ai/v1/clusters/{cluster}/jobs/{job}/rerun" \ -H "x-api-key: $API_KEY"
{ }Returns aggregated KPIs, per-node utilization, IO history, network traffic, disk and network usage for the cluster overview dashboard
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/metrics" \ -H "x-api-key: $API_KEY"
{- "disk_usage": {
- "avg_utilization_percent": 0.5,
- "disks": [
- { }
], - "max_utilization_node_id": "nod_1a2b3c4d5e6f708192a3b4c5",
- "max_utilization_node_name": "churn-propensity-v3",
- "max_utilization_percent": 0.5,
- "storage_total_tb": 0.5,
- "storage_used_tb": 0.5
}, - "io_history": [
- {
- "label": "example",
- "read": 0.5,
- "write": 0.5
}
], - "kpis": {
- "avg_queue_time_min": 0.5,
- "avg_success_rate_percent": 0.5,
- "avg_usage_percent": 0.5,
- "failed_jobs_count": 8,
- "jobs_in_queue": 1,
- "jobs_running": 1,
- "queue_time_change_min": 0.5,
- "status": "HEALTHY"
}, - "network_traffic": [
- {
- "cpu_percent": 0.5,
- "gpu_percent": 0.5,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "node": "example"
}
], - "network_usage": {
- "details": {
- "active_connections": 1,
- "current_bandwidth_gbps": 0.5,
- "current_throughput_gbps": 0.5,
- "latency_ms": 0.5,
- "packet_loss_percent": 0.5
}, - "interfaces": [
- { }
], - "throughput_history": [
- { }
]
}, - "nodes": [
- {
- "cpu_percent": 0.5,
- "gpu_percent": 0.5,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}
]
}List all nodes with aggregated CPU, GPU, memory and disk metrics, plus cluster-level averages
| cluster required | string Cluster ID |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/summary" \ -H "x-api-key: $API_KEY"
{- "average_cpu": 0.5,
- "average_disk": 0.5,
- "average_gpu": 0.5,
- "average_memory": 0.5,
- "average_utilization": 0.5,
- "items": [
- {
- "cpu_usage": 0.5,
- "created_at": "2026-01-15T10:30:00Z",
- "disk_usage": 0.5,
- "gpu_details": [
- { }
], - "gpu_usage": 0.5,
- "has_rdma": false,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "imex_status": "PENDING",
- "ip": "example",
- "memory_usage": 0.5,
- "node_name": "churn-propensity-v3",
- "nvlink": { },
- "status": "CONNECTED"
}
]
}List the cluster's neocore ScalingGroups (engine + online-server tiers) with their autoscale runtime (desired/current replicas, members, load balancer)
| cluster required | string Cluster ID |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/scaling-groups" \ -H "x-api-key: $API_KEY"
{- "items": [
- {
- "metadata": { },
- "revision": 1,
- "runtime": { },
- "spec": { },
- "status": { }
}
], - "revision": 1
}Delete a neocore ScalingGroup by name. Its member jobs are torn down; a deploy that owns it will recreate it.
| cluster required | string Cluster ID |
| sg required | string Scaling group name |
curl -X DELETE "https://tenant.api.neospace.ai/v1/clusters/{cluster}/scaling-groups/{sg}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}Fetch a single neocore ScalingGroup (scaling spec + autoscale runtime: desired/current/ready replicas, members, load balancer), scoped to the cluster
| cluster required | string Cluster ID |
| sg required | string Scaling group name |
curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/scaling-groups/{sg}" \ -H "x-api-key: $API_KEY"
{- "metadata": {
- "labels": { },
- "name": "churn-propensity-v3"
}, - "revision": 1,
- "runtime": {
- "conditions": [
- { }
], - "current_replicas": 1,
- "desired_replicas": 1,
- "last_decision": "example",
- "last_scale_down_time": "example",
- "last_scale_time": "example",
- "last_scale_up_time": "example",
- "load_balancer": {
- "active_backends": 1,
- "external_host": "example",
- "listen_port": 1,
- "status": "PENDING"
}, - "members": [
- { }
], - "metric_stale": false,
- "observed_metric": 0.5,
- "ready_replicas": 1
}, - "spec": {
- "load_balancer": {
- "algorithm": "round_robin",
- "drain_seconds": 1,
- "enabled": true,
- "external_port": 1,
- "fail_timeout_seconds": 1,
- "health_check_path": "/datasets/transactions",
- "max_fails": 4,
- "protocol": "tcp",
- "route_timeout_seconds": 1,
- "stream_idle_timeout_seconds": 1,
- "target_port": 1
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "scale_down_rules": [
- { }
], - "scale_to_zero": { },
- "scale_up_rules": [
- { }
], - "target": { }
}, - "template": {
- "output_volumes": [
- { }
], - "policy": "Gang",
- "task_template": { }
}
}, - "status": {
- "created_at": "2026-01-15T10:30:00Z",
- "reason": "Example message",
- "state": "PENDING",
- "updated_at": "2026-01-15T10:30:00Z"
}
}Change a scaling group's min/max replicas (and cooldown) in place; the existing autoscale rules/target are preserved. The level-triggered reconciler converges the live fleet.
| cluster required | string Cluster ID |
| sg required | string Scaling group name |
New min/max (cooldown optional)
| cooldown_seconds | integer |
| max | integer |
| min | integer |
Array of objects (request.NeocoreV2ScalingRule) | |
object ScaleToZero tunes idle-to-zero behavior; only consulted by neocore when Min==0. | |
Array of objects (request.NeocoreV2ScalingRule) | |
object (request.NeocoreV2SGMetricTarget) |
{- "cooldown_seconds": 0,
- "max": 0,
- "min": 0,
- "scale_down_rules": [
- {
- "aggregation": "string",
- "metric_name": "string",
- "operator": "string",
- "threshold": 0
}
], - "scale_to_zero": {
- "activation_replicas": 0,
- "idle_grace_seconds": 0
}, - "scale_up_rules": [
- {
- "aggregation": "string",
- "metric_name": "string",
- "operator": "string",
- "threshold": 0
}
], - "target": {
- "aggregation": "string",
- "metric_name": "string",
- "target": 0
}
}{- "metadata": {
- "labels": { },
- "name": "churn-propensity-v3"
}, - "revision": 1,
- "runtime": {
- "conditions": [
- { }
], - "current_replicas": 1,
- "desired_replicas": 1,
- "last_decision": "example",
- "last_scale_down_time": "example",
- "last_scale_time": "example",
- "last_scale_up_time": "example",
- "load_balancer": {
- "active_backends": 1,
- "external_host": "example",
- "listen_port": 1,
- "status": "PENDING"
}, - "members": [
- { }
], - "metric_stale": false,
- "observed_metric": 0.5,
- "ready_replicas": 1
}, - "spec": {
- "load_balancer": {
- "algorithm": "round_robin",
- "drain_seconds": 1,
- "enabled": true,
- "external_port": 1,
- "fail_timeout_seconds": 1,
- "health_check_path": "/datasets/transactions",
- "max_fails": 4,
- "protocol": "tcp",
- "route_timeout_seconds": 1,
- "stream_idle_timeout_seconds": 1,
- "target_port": 1
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "scale_down_rules": [
- { }
], - "scale_to_zero": { },
- "scale_up_rules": [
- { }
], - "target": { }
}, - "template": {
- "output_volumes": [
- { }
], - "policy": "Gang",
- "task_template": { }
}
}, - "status": {
- "created_at": "2026-01-15T10:30:00Z",
- "reason": "Example message",
- "state": "PENDING",
- "updated_at": "2026-01-15T10:30:00Z"
}
}curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/settings" \ -H "x-api-key: $API_KEY"
{- "available_devices": [
- "local"
], - "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_device": "local"
}| cluster required | string Cluster ID |
settings
| datavolume_device | string DataVolumeDevice is "local" or "shared". Not required: empty is a meaningful choice -- the default -- and rejecting it would make "go back to local" unexpressible. |
{- "datavolume_device": "string"
}{- "available_devices": [
- "local"
], - "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_device": "local"
}Assign one or more spaces to the given cluster (each space's cluster pointer is set).
| cluster required | string Cluster ID |
Spaces to assign
| space_ids required | Array of strings non-empty |
{- "space_ids": [
- "string"
]
}{- "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "space_ids": [
- "spa_1a2b3c4d5e6f708192a3b4c5",
- "spa_1a2b3c4d5e6f708192a3b4d6"
]
}curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "cluster": "example",
- "enroll_token": "REDACTED",
- "enroll_token_expires_at": "2026-01-15T10:30:00Z",
- "id": "nod_1a2b3c4d5e6f708192a3b4c5",
- "job_labels": [
- { }
], - "labels": { },
- "name": "churn-propensity-v3",
- "node_cidr": "example",
- "spire_join_token": "REDACTED",
- "spire_server_address": "example",
- "spire_trust_domain": "example",
- "status": "CONNECTED",
- "token": "REDACTED"
}
], - "has_more": false
}Create a new node
Node creation request
object | |
| name | string |
{- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "string"
}{- "cluster": "example",
- "enroll_token": "REDACTED",
- "enroll_token_expires_at": "2026-01-15T10:30:00Z",
- "id": "nod_1a2b3c4d5e6f708192a3b4c5",
- "job_labels": [
- "data"
], - "labels": { },
- "name": "churn-propensity-v3",
- "node_cidr": "example",
- "spire_join_token": "REDACTED",
- "spire_server_address": "example",
- "spire_trust_domain": "example",
- "status": "CONNECTED",
- "token": "REDACTED"
}Set the job-routing label set on a node. Removing a currently-applied label triggers cordon-by-matchLabel followed by drain-by-matchLabel on neocore, using the requested drain strategy. Enabling train or inference on a node without GPUs is rejected.
| cluster required | string Cluster ID |
| id required | string Node ID |
Labels and drain options
| drain_strategy required | string Enum: "graceful" "hard" |
| grace_period_seconds | integer [ 0 .. 300 ] |
| labels required | Array of strings |
{- "drain_strategy": "graceful",
- "grace_period_seconds": 300,
- "labels": [
- "string"
]
}{- "added": [
- "example"
], - "drained_tasks": 1,
- "labels": [
- "example"
], - "node_id": "nod_1a2b3c4d5e6f708192a3b4c5",
- "removed": [
- "example"
]
}Reassign a node from its current cluster to a target cluster. Hard-drains every running workload off the node first (cordon + force drain), then flips the node's cluster selector label on neocore, updates both clusters' membership, and uncordons the node so it lands schedulable in the target cluster.
| cluster required | string Source cluster ID |
| id required | string Node ID |
Target cluster and drain options
| grace_period_seconds | integer [ 0 .. 300 ] |
| targetClusterId required | string |
{- "grace_period_seconds": 300,
- "targetClusterId": "string"
}{- "cluster": "example",
- "enroll_token": "REDACTED",
- "enroll_token_expires_at": "2026-01-15T10:30:00Z",
- "id": "nod_1a2b3c4d5e6f708192a3b4c5",
- "job_labels": [
- "data"
], - "labels": { },
- "name": "churn-propensity-v3",
- "node_cidr": "example",
- "spire_join_token": "REDACTED",
- "spire_server_address": "example",
- "spire_trust_domain": "example",
- "status": "CONNECTED",
- "token": "REDACTED"
}Generate a fresh enroll token + setup command for an existing node
| cluster required | string Cluster ID |
| id required | string Node ID |
curl -X POST "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}/re-enroll" \ -H "x-api-key: $API_KEY"
{- "cluster": "example",
- "enroll_token": "REDACTED",
- "enroll_token_expires_at": "2026-01-15T10:30:00Z",
- "id": "nod_1a2b3c4d5e6f708192a3b4c5",
- "job_labels": [
- "data"
], - "labels": { },
- "name": "churn-propensity-v3",
- "node_cidr": "example",
- "spire_join_token": "REDACTED",
- "spire_server_address": "example",
- "spire_trust_domain": "example",
- "status": "CONNECTED",
- "token": "REDACTED"
}Force-runs the on-connect label reconciliation for a node. Bootstraps hardware-derived labels (CPU cores, GPU count) from neocore metrics when the node has no labels yet, then pushes the resulting label set to neocore. Use this to backfill nodes that connected before the node.metrics_ready webhook was deployed.
| cluster required | string Cluster ID |
| id required | string Node ID |
curl -X PATCH "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}/reconcile-labels" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}curl -X POST "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}/token" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "token": "REDACTED"
}Retrieve a list of external secrets
| limit | integer Default: 10 Max items to return |
| after | string Cursor for pagination |
| name | string Case-insensitive substring match on the secret name |
| backend_type | string Enum: "AWSSecretsManager" "Vault" "OCIVault" Filter by backend type |
| sync_state | string Enum: "Pending" "Synced" "Error" Filter by sync state |
curl -X GET "https://tenant.api.neospace.ai/v1/external-secrets" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "labels": { },
- "name": "churn-propensity-v3",
- "spec": { },
- "sync_status": { }
}
], - "has_more": false
}Create a new external secret
External secret creation request
object | |
| name required | string |
required | object (request.ExternalSecretSpec) |
{- "labels": {
- "property1": "string",
- "property2": "string"
}, - "name": "string",
- "spec": {
- "aws": {
- "access_key_id": "string",
- "external_id": "string",
- "region": "string",
- "role_arn": "string",
- "secret_access_key": "string",
- "secret_name": "string"
}, - "backend_type": "AWSSecretsManager",
- "data": [
- {
- "file_name": "string",
- "key": "string"
}
], - "oci": {
- "fingerprint": "string",
- "private_key": "string",
- "private_key_passphrase": "string",
- "region": "string",
- "secret_ocid": "string",
- "tenancy_ocid": "string",
- "user_ocid": "string"
}, - "output_file": "string",
- "target_path": "string",
- "vault": {
- "addr": "string",
- "path": "string",
- "role": "string",
- "token": "string"
}
}
}{- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "labels": { },
- "name": "churn-propensity-v3",
- "spec": {
- "aws": {
- "access_key_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "external_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "region": "example",
- "role_arn": "example",
- "secret_access_key": "REDACTED",
- "secret_name": "churn-propensity-v3"
}, - "backend_type": "AWSSecretsManager",
- "data": [
- { }
], - "oci": {
- "fingerprint": "example",
- "private_key": "REDACTED",
- "private_key_passphrase": "REDACTED",
- "region": "example",
- "secret_ocid": "sec_1a2b3c4d5e6f708192a3b4c5",
- "tenancy_ocid": "obj_1a2b3c4d5e6f708192a3b4c5",
- "user_ocid": "usr_1a2b3c4d5e6f708192a3b4c5"
}, - "output_file": "example",
- "target_path": "/datasets/transactions",
- "vault": {
- "addr": "example",
- "path": "/datasets/transactions",
- "role": "example",
- "token": "REDACTED"
}
}, - "sync_status": {
- "message": "Example message",
- "state": "PENDING",
- "synced_at": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}
}Delete an external secret by ID
| id required | string External secret ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/external-secrets/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}Get an external secret by ID
| id required | string External secret ID |
curl -X GET "https://tenant.api.neospace.ai/v1/external-secrets/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "labels": { },
- "name": "churn-propensity-v3",
- "spec": {
- "aws": {
- "access_key_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "external_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "region": "example",
- "role_arn": "example",
- "secret_access_key": "REDACTED",
- "secret_name": "churn-propensity-v3"
}, - "backend_type": "AWSSecretsManager",
- "data": [
- { }
], - "oci": {
- "fingerprint": "example",
- "private_key": "REDACTED",
- "private_key_passphrase": "REDACTED",
- "region": "example",
- "secret_ocid": "sec_1a2b3c4d5e6f708192a3b4c5",
- "tenancy_ocid": "obj_1a2b3c4d5e6f708192a3b4c5",
- "user_ocid": "usr_1a2b3c4d5e6f708192a3b4c5"
}, - "output_file": "example",
- "target_path": "/datasets/transactions",
- "vault": {
- "addr": "example",
- "path": "/datasets/transactions",
- "role": "example",
- "token": "REDACTED"
}
}, - "sync_status": {
- "message": "Example message",
- "state": "PENDING",
- "synced_at": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}
}Trigger a resync for an external secret
| id required | string External secret ID |
curl -X POST "https://tenant.api.neospace.ai/v1/external-secrets/{id}/resync" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}curl -X GET "https://tenant.api.neospace.ai/v1/me" \ -H "x-api-key: $API_KEY"
{- "email": "someone@example.com",
- "external_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "first_name": "churn-propensity-v3",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_admin": false,
- "language": "example",
- "last_name": "churn-propensity-v3",
- "login_type": "email",
- "role": "designer",
- "seats": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "grant": { },
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "permissions": [
- { }
], - "spaces": [
- { }
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}
], - "theme": "example"
}Update user
Update user request
| first_name | string |
| last_name | string |
| role | string (model.UserRole) Enum: "designer" "developer" |
{- "first_name": "string",
- "last_name": "string",
- "role": "designer"
}{- "email": "someone@example.com",
- "external_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "first_name": "churn-propensity-v3",
- "id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "last_name": "churn-propensity-v3",
- "lifecycle_state": "PENDING",
- "login_type": "email",
- "role": "designer",
- "seats": [
- "example"
], - "spaces": [
- "example"
]
}curl -X GET "https://tenant.api.neospace.ai/v1/users/panel" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "language": "example",
- "notification_toasts_enabled": true,
- "pinned_space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "role": "example",
- "theme": "example",
- "updated_at": "2026-01-15T10:30:00Z",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5"
}Create user panel settings with language and theme preferences
Create user panel request
| language required | string |
| notification_toasts_enabled | boolean NotificationToastsEnabled toggles the new-notification toast; nil = on. |
| pinned_space_id | string |
| role | string |
| theme required | string |
{- "language": "string",
- "notification_toasts_enabled": true,
- "pinned_space_id": "string",
- "role": "string",
- "theme": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "language": "example",
- "notification_toasts_enabled": true,
- "pinned_space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "role": "example",
- "theme": "example",
- "updated_at": "2026-01-15T10:30:00Z",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5"
}Update user panel settings (language and/or theme) for the authenticated user
Update user panel request
| language | string |
| notification_toasts_enabled | boolean |
| pinned_space_id | string |
| role | string |
| theme | string |
{- "language": "string",
- "notification_toasts_enabled": true,
- "pinned_space_id": "string",
- "role": "string",
- "theme": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "language": "example",
- "notification_toasts_enabled": true,
- "pinned_space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "role": "example",
- "theme": "example",
- "updated_at": "2026-01-15T10:30:00Z",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5"
}Current value of every series the platform publishes, in Prometheus exposition format. This is the pull surface for an external collector — an OpenTelemetry Collector's prometheus receiver, vmagent, or Prometheus itself — and takes no parameters: the metric families are fixed (node_*, task_*, app_*, scalinggroup_*). Unlike /v1/metrics/query it needs no PromQL.
| Authorization required | string Default: Bearer <Add access token here> Insert your access token |
curl -X GET "https://tenant.api.neospace.ai/v1/metrics" \ -H "x-api-key: $API_KEY"
Label names known to the metrics backend, optionally restricted by a series selector.
| match | string Series selector (singular, no brackets) |
curl -X GET "https://tenant.api.neospace.ai/v1/metrics/labels" \ -H "x-api-key: $API_KEY"
{- "data": [
- "example"
], - "isPartial": false,
- "status": "PENDING",
- "warnings": [
- "example"
]
}Values of a single label, optionally restricted by a series selector.
| label required | string Label name |
| match | string Series selector (singular, no brackets) |
curl -X GET "https://tenant.api.neospace.ai/v1/metrics/labels/{label}/values" \ -H "x-api-key: $API_KEY"
{- "data": [
- "example"
], - "isPartial": false,
- "status": "PENDING",
- "warnings": [
- "example"
]
}Prometheus instant query against the platform's metrics backend.
| query required | string PromQL expression |
| time | string Evaluation instant (unix seconds or RFC3339); defaults to now |
curl -X GET "https://tenant.api.neospace.ai/v1/metrics/query?query=QUERY" \ -H "x-api-key: $API_KEY"
{- "data": {
- "result": [
- { }
], - "resultType": "example"
}, - "isPartial": false,
- "status": "PENDING",
- "warnings": [
- "example"
]
}Prometheus range query against the platform's metrics backend. start/end/step are optional and default to the last hour at a 30s step.
| query required | string PromQL expression |
| start | string Range start (unix seconds or RFC3339) |
| end | string Range end (unix seconds or RFC3339) |
| step | string Resolution (e.g. 30s) |
curl -X GET "https://tenant.api.neospace.ai/v1/metrics/query_range?query=QUERY" \ -H "x-api-key: $API_KEY"
{- "data": {
- "result": [
- { }
], - "resultType": "example"
}, - "isPartial": false,
- "status": "PENDING",
- "warnings": [
- "example"
]
}Lists seats on whichever axis owns them. While a provider is SCIM-governed the IdP owns which seats exist, so the rows are directory groups carrying seat_id (nil when the group has no permission binding yet), after is a numeric offset, and unmapped_seats reports local rows the directory does not know. Otherwise the rows are seats and after is a seat id. scim_governed says which.
| limit | integer Default: 10 limit |
| after | string Cursor: a seat id, or a numeric offset while SCIM-governed |
curl -X GET "https://tenant.api.neospace.ai/v1/seats" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "external_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "grant": { },
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "member_count": 8,
- "name": "churn-propensity-v3",
- "permissions": [
- { }
], - "seat_id": "sea_1a2b3c4d5e6f708192a3b4c5",
- "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}
], - "has_more": false,
- "scim_governed": false,
- "unmapped_seats": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "external_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "grant": { },
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "member_count": 8,
- "name": "churn-propensity-v3",
- "permissions": [
- { }
], - "seat_id": "sea_1a2b3c4d5e6f708192a3b4c5",
- "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}
]
}Create a new seat
Seat creation request
object Grant is the authorization, with the two axes stated separately. Optional at creation: the UI creates a bare seat and configures the grant afterwards via the seat editor. | |
| group_id | string |
| name | string Name asks the platform to create the group and own its name. GroupID binds to a group the identity provider already provisioned. Exactly one is given: which one decides who owns the group, so they cannot be merged. |
| permissions | Array of strings (permissions.Permission) Items Enum: "audits:get" "audits:list" "api-keys:create" "api-keys:delete" "api-keys:get" "api-keys:list" "api-keys:update" "architectures:list" "benchmarks:create" "benchmarks:delete" "benchmarks:get" "benchmarks:list" "benchmarks:update" "checkpoints:list" "checkpoints:update" "clusters:create" "clusters:delete" "clusters:get-stats" "clusters:list" "connectors:create" "connectors:files:compare" "connectors:delete" "connectors:files" "connectors:get" "connectors:list" "data-models:create" "data-models:delete" "data-models:get" "data-models:list" "data-models:update" "data-enhancements:create" "data-enhancements:delete" "data-enhancements:get" "data-enhancements:list" "data-enhancements:update" "data-profiles:create" "data-profiles:archive" "data-profiles:delete" "data-profiles:get" "data-profiles:stats" "data-profiles:list" "data-profiles:update" "drift-policies:create" "drift-policies:delete" "drift-policies:get" "drift-policies:list" "drift-policies:update" "favorites:create" "favorites:delete" "folders:create" "folders:delete" "folders:get" "folders:list" "folders:move" "folders:update" "data-preprocesses:create" "data-preprocesses:archive" "data-preprocesses:delete" "data-preprocesses:get" "data-preprocesses:columns" "data-preprocesses:list" "data-preprocesses:update" "data-extractions:create" "data-extractions:delete" "data-extractions:get" "data-extractions:list" "data-extractions:update" "model-designs:create" "model-designs:get" "model-designs:list" "model-designs:update" "model-designs:publish" "model-designs:archive" "model-designs:delete" "evaluations:create" "inference-servers:create" "inference-servers:delete" "inference-servers:get" "inference-servers:list" "inference-servers:update" "served-models:list" "served-models:create" "model-endpoints:create" "model-endpoints:get" "model-endpoints:list" "model-endpoints:delete" "leaderboards:list" "neocore:read" "neocore:write" "metrics:read" "spaces:create" "spaces:delete" "spaces:get" "spaces:list" "spaces:get-members" "spaces:invite" "spaces:assign-cluster" "spaces:update" "trainings:create" "trainings:cancel" "trainings:delete" "trainings:get" "trainings:get-metrics" "trainings:get-logs" "trainings:list" "trainings:update" "seats:create" "seats:delete" "seats:get" "seats:list" "seats:update" "admin:users:list" "admin:users:update" "admin:users:delete" "admin:oidc:manage" "admin:audits:list" "admin:audits:get" "admin:metrics:read" "admin:mfa-policy:get" "admin:mfa-policy:update" "notifications:list" "notifications:update" "nodes:list" "nodes:create" "nodes:delete" "nodes:update" "nodes:move" "nodes:token:generate" "external-secrets:create" "external-secrets:delete" "external-secrets:get" "external-secrets:list" "external-secrets:resync" "*" Deprecated: use Grant. |
| spaces | Array of strings Spaces and Permissions are the deprecated flat pair, kept for clients that have not moved to Grant. Sending both shapes in one request is a 400 — there is no sane way to merge two statements of the same thing. Deprecated: use Grant. |
{- "grant": {
- "admin": true,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": true,
- "ids": [
- "string"
], - "permissions": [
- "audits:get"
]
}
}, - "group_id": "string",
- "name": "string",
- "permissions": [
- "audits:get"
], - "spaces": [
- "string"
]
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "sea_1a2b3c4d5e6f708192a3b4c5",
- "name": "Data scientist",
- "permissions": [
- "audits:get"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Return the set of permission keys that can be assigned to a seat. Derived from the same enum the backend uses to authorize requests.
curl -X GET "https://tenant.api.neospace.ai/v1/seats/permissions" \ -H "x-api-key: $API_KEY"
{- "permissions": [
- {
- "category": "example",
- "key": "audits:get",
- "scope": "example",
- "subcategory": "example"
}
]
}Deletes every seat row together with its Redis permission hash. Run when a tenant hands seat ownership to an IdP: a seat that is merely hidden keeps a live permission hash, and a later SCIM group whose name normalizes the same way would silently inherit it. Irreversible — the permissions and spaces configured on those seats are gone.
curl -X POST "https://tenant.api.neospace.ai/v1/seats/purge" \ -H "x-api-key: $API_KEY"
{- "purged": 1
}curl -X GET "https://tenant.api.neospace.ai/v1/seats/{id}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "sea_1a2b3c4d5e6f708192a3b4c5",
- "name": "Data scientist",
- "permissions": [
- "audits:get"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Update a seat by ID
| id required | string Seat ID |
Seat update request
object Grant replaces the seat's authorization wholesale when present, and leaves it untouched when absent. It is deliberately not merged field by field: the grant is one coherent statement, and merging halves of it against stored values is what made a coherent edit look incoherent — dropping the last space-scoped permission was judged against the Spaces it was replacing. | |
| name | string |
| permissions | Array of strings (permissions.Permission) Items Enum: "audits:get" "audits:list" "api-keys:create" "api-keys:delete" "api-keys:get" "api-keys:list" "api-keys:update" "architectures:list" "benchmarks:create" "benchmarks:delete" "benchmarks:get" "benchmarks:list" "benchmarks:update" "checkpoints:list" "checkpoints:update" "clusters:create" "clusters:delete" "clusters:get-stats" "clusters:list" "connectors:create" "connectors:files:compare" "connectors:delete" "connectors:files" "connectors:get" "connectors:list" "data-models:create" "data-models:delete" "data-models:get" "data-models:list" "data-models:update" "data-enhancements:create" "data-enhancements:delete" "data-enhancements:get" "data-enhancements:list" "data-enhancements:update" "data-profiles:create" "data-profiles:archive" "data-profiles:delete" "data-profiles:get" "data-profiles:stats" "data-profiles:list" "data-profiles:update" "drift-policies:create" "drift-policies:delete" "drift-policies:get" "drift-policies:list" "drift-policies:update" "favorites:create" "favorites:delete" "folders:create" "folders:delete" "folders:get" "folders:list" "folders:move" "folders:update" "data-preprocesses:create" "data-preprocesses:archive" "data-preprocesses:delete" "data-preprocesses:get" "data-preprocesses:columns" "data-preprocesses:list" "data-preprocesses:update" "data-extractions:create" "data-extractions:delete" "data-extractions:get" "data-extractions:list" "data-extractions:update" "model-designs:create" "model-designs:get" "model-designs:list" "model-designs:update" "model-designs:publish" "model-designs:archive" "model-designs:delete" "evaluations:create" "inference-servers:create" "inference-servers:delete" "inference-servers:get" "inference-servers:list" "inference-servers:update" "served-models:list" "served-models:create" "model-endpoints:create" "model-endpoints:get" "model-endpoints:list" "model-endpoints:delete" "leaderboards:list" "neocore:read" "neocore:write" "metrics:read" "spaces:create" "spaces:delete" "spaces:get" "spaces:list" "spaces:get-members" "spaces:invite" "spaces:assign-cluster" "spaces:update" "trainings:create" "trainings:cancel" "trainings:delete" "trainings:get" "trainings:get-metrics" "trainings:get-logs" "trainings:list" "trainings:update" "seats:create" "seats:delete" "seats:get" "seats:list" "seats:update" "admin:users:list" "admin:users:update" "admin:users:delete" "admin:oidc:manage" "admin:audits:list" "admin:audits:get" "admin:metrics:read" "admin:mfa-policy:get" "admin:mfa-policy:update" "notifications:list" "notifications:update" "nodes:list" "nodes:create" "nodes:delete" "nodes:update" "nodes:move" "nodes:token:generate" "external-secrets:create" "external-secrets:delete" "external-secrets:get" "external-secrets:list" "external-secrets:resync" "*" Deprecated: use Grant. Merged against the stored grant, as before. |
| spaces | Array of strings Deprecated: use Grant. Merged against the stored grant, as before. |
{- "grant": {
- "admin": true,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": true,
- "ids": [
- "string"
], - "permissions": [
- "audits:get"
]
}
}, - "name": "string",
- "permissions": [
- "audits:get"
], - "spaces": [
- "string"
]
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "sea_1a2b3c4d5e6f708192a3b4c5",
- "name": "Data scientist",
- "permissions": [
- "audits:get"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Assign an existing user to a seat (federated to the auth-service)
| id required | string Seat ID |
User to assign
| user_id required | string |
{- "user_id": "string"
}{- "message": "Example message"
}Place a list of emails in the seat — known emails are added, unknown ones invited
| id required | string Seat ID |
Emails to add
| emails required | Array of strings non-empty |
{- "emails": [
- "string"
]
}{- "added": [
- "example"
], - "failed": [
- {
- "email": "someone@example.com",
- "reason": "Example message"
}
], - "invited": [
- "example"
], - "skipped": [
- {
- "email": "someone@example.com",
- "reason": "Example message"
}
]
}Revoke a user's seat membership (federated to the auth-service)
| id required | string Seat ID |
| userId required | string User ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/seats/{id}/members/{userId}" \ -H "x-api-key: $API_KEY"
{- "message": "Example message"
}Add a space to a specific seat
| id required | string Seat ID |
Add space to seat request
| space_id required | string |
{- "space_id": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "grant": {
- "admin": false,
- "global_permissions": [
- "audits:get"
], - "space": {
- "admin": false,
- "ids": [
- "obj_1a2b3c4d5e6f708192a3b4c5",
- "obj_1a2b3c4d5e6f708192a3b4d6"
], - "permissions": [
- { }
]
}
}, - "id": "sea_1a2b3c4d5e6f708192a3b4c5",
- "name": "Data scientist",
- "permissions": [
- "audits:get"
], - "spaces": [
- "example"
], - "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Retrieve all spaces
| limit | integer Default: 10 Limit |
| after | string Default: "\"\"" After |
| name | string Filter by space name |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": { },
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": { }
}
], - "has_more": false
}Create a new space
Space creation request
| description required | string |
| name required | string |
| seat_id | string |
{- "description": "string",
- "name": "string",
- "seat_id": "string"
}{- "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "description": "Scores the active customer base every morning.",
- "id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk",
- "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}" \ -H "x-api-key: $API_KEY"
{- "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "description": "Scores the active customer base every morning.",
- "id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk",
- "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Update a space by ID
| spaceId required | string Space ID |
Space update request
| description | string |
| name | string |
{- "description": "string",
- "name": "string"
}{- "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "description": "Scores the active customer base every morning.",
- "id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk",
- "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Invite one or more people by email. Provisions the account (if new) and emails a set-password link via the auth-service.
| spaceId required | string Space ID |
Invite request
| emails required | Array of strings non-empty |
| seat_id required | string |
{- "emails": [
- "string"
], - "seat_id": "string"
}{- "invites": [
- "example"
]
}List members of a space with cursor pagination and optional email substring filter
| spaceId required | string Space ID |
| limit | integer Default: 10 Limit |
| after | string Cursor — user ID of the last item from the previous page |
string Email substring filter (case-insensitive) | |
| seatType | string Seat type filter |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/members" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "email": "someone@example.com",
- "external_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "first_name": "churn-propensity-v3",
- "id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "last_name": "churn-propensity-v3",
- "lifecycle_state": "PENDING",
- "login_type": "email",
- "role": "designer",
- "seats": [
- "example"
], - "spaces": [
- "example"
]
}
], - "has_more": false
}curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/restore" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}List audits
| limit | integer Limit |
| after | string After |
| action | string Action |
| resource_type | string Resource type |
| resource_id | string Resource ID |
| user_id | string User ID |
| user_email | string User email |
| user_name | string User name |
| space_id | string Space ID |
| status_code | integer Status code |
| start_time | string Start time (RFC3339 format, e.g. 2024-01-15T10:00:00Z or date only 2024-01-15) |
| end_time | string End time (RFC3339 format, e.g. 2024-01-15T18:00:00Z or date only 2024-01-15) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/audits" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "action": "example",
- "api_key": "REDACTED",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_api_key": false,
- "metadata": { },
- "resource_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "resource_type": "example",
- "space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "status_code": 1,
- "timestamp": "2026-01-15T10:30:00Z",
- "user_email": "someone@example.com",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "user_name": "churn-propensity-v3"
}
], - "has_more": false
}The distinct action and resource_type values present in this space's audit log, so the activity-log filters are driven by the data rather than a hard-coded list.
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/audits/facets" \ -H "x-api-key: $API_KEY"
{- "actions": [
- "example"
], - "resource_types": [
- "example"
]
}Get audit by ID with all details including metadata
| id required | string Audit ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/audits/{id}" \ -H "x-api-key: $API_KEY"
{- "action": "example",
- "api_key": "REDACTED",
- "id": "aud_1a2b3c4d5e6f708192a3b4c5",
- "is_api_key": false,
- "metadata": { },
- "resource_id": "aud_1a2b3c4d5e6f708192a3b4c5",
- "resource_type": "example",
- "space_id": "spa_1a2b3c4d5e6f708192a3b4c5",
- "status_code": 1,
- "timestamp": "2026-01-15T10:30:00Z",
- "user_email": "someone@example.com",
- "user_id": "usr_1a2b3c4d5e6f708192a3b4c5",
- "user_name": "churn-propensity-v3"
}| limit | integer Default: 10 Page size |
| after | string Cursor from the previous page |
| status | string Comma-separated run statuses to keep |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "cache_dir": "/datasets/transactions",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "finished_at": "2026-01-15T10:30:00Z",
- "flags": { },
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "inference_version": "1.0.0",
- "output_destination": { },
- "output_dir": "/datasets/transactions",
- "output_summary": { },
- "pool": { },
- "progress": { },
- "publish": { },
- "recipe_yaml": "example",
- "shards": 1,
- "space": "example",
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "time_range": { },
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Body (checkpoint_id required)
object AnchorSource scores each client at the positions named by a dataset/file instead of at a
single date (cortex | |
| checkpoint_id | string CheckpointID scores with a checkpoint directly — no inference server, nothing deployed. Ignored when the route already carries a server id. |
| event_dataset_ids | Array of strings EventDatasetIDs are the registered datasets feeding the model input views. It may be empty when every view is instead fed by a local dataset below; full per-view coverage (registered OR local) is enforced in the service, so there is no min=1 binding here. |
object EventDatasetShifts optionally overrides the per-dataset temporal shift, keyed by
the dataset id (registered) or the local dataset_key. Absent keys inherit the
shift the dataset was trained with; a present key wins, and an explicit empty
string clears it (score with no offset). Same string encoding as the training
shift ("1h" or " | |
Array of objects (request.CreateBatchInferenceLocalDataset) EventDatasetsLocal are event datasets fed by absolute path or neocore DataVolume rather than a registered dataset id. Each covers the model input view named by its dataset_key, so a run can be driven entirely from local paths; a run with none stays byte-identical. Appended to the id-resolved event datasets. | |
object (request.CreateBatchInferenceFlagsBody) | |
| inference_version | string <= 128 characters InferenceVersion pins the TAG of the cortex-infer image this run uses (e.g. "v0.0.9"): the carrier init container injects that image's engines/ into the ranks, and the publish step runs its binary. Empty = the architecture's tag. It does NOT change the model image — the ranks run the cortex image the checkpoint was trained with, chosen by the checkpoint and never by an operator here. |
object Output optionally sets where this run's writer publishes predictions. ConnectorID set → an output connector (aws-s3 / aws-s3-instance-profile / oracle_s3 / oracle_instance_principal / local) at Path; empty ConnectorID + non-empty Path → a raw shared-filesystem path; both empty → the auto-derived run output dir (current behavior). Mirrors the deploy-time output-destination shape. | |
object Parallelism fans the run out into N independent data shards (bucket-shard i/N), each a driver + its own output writer, mirroring the hand-run sharded batch. Nil or shards<=1 runs the single-driver path (byte-identical to before). | |
object (request.CreateBatchInferencePool) | |
| recipe_yaml | string RecipeYaml, when set, is a full user-edited cortex-batch-infer recipe document used as the run's recipe instead of the field-derived one — the advanced "YAML" mode. The field-derived recipe knobs are ignored (the YAML wins for non-managed keys), but the datasets/pool/output are still resolved the normal way to drive the job wiring (managed fields + volumes). The platform re-injects its managed fields over it at submit so the user can't break the wiring. Malformed YAML → 400. Empty = the field-derived recipe (byte-identical to the stepper path). |
required | object (request.CreateBatchInferenceTimeRange) |
{- "anchor_source": {
- "dataset_ids": [
- "string"
], - "datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "extend_to_cover": true,
- "ts_col": "string"
}, - "checkpoint_id": "string",
- "event_dataset_ids": [
- "string"
], - "event_dataset_shifts": {
- "property1": "string",
- "property2": "string"
}, - "event_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "flags": {
- "eos_inference_mode": "string",
- "include_all_probs": true,
- "infer_every_event": true,
- "infer_target_date": "string",
- "logits_only": true,
- "omit_predictions_json": true,
- "save_logits": true,
- "use_context": true
}, - "inference_version": "string",
- "output": {
- "connector_id": "string",
- "path": "string"
}, - "parallelism": {
- "concurrency": 1,
- "group_workers": 1,
- "shard_workers": 1,
- "shards": 1
}, - "pool": {
- "file_source": {
- "as_of_last_event": true,
- "connector_id": "string",
- "path": "string"
}, - "filter_dataset_ids": [
- "string"
], - "filter_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "reference_dataset_ids": [
- "string"
], - "reference_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
]
}, - "recipe_yaml": "string",
- "time_range": {
- "end": "string",
- "start": "string"
}
}{- "cache_dir": "/datasets/transactions",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "finished_at": "2026-01-15T10:30:00Z",
- "flags": {
- "eos_inference_mode": "example",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "inference_version": "1.0.0",
- "output_destination": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "path": "/datasets/transactions"
}, - "output_dir": "/datasets/transactions",
- "output_summary": {
- "duration_sec": 1,
- "n_files": 1,
- "n_rows": 1,
- "output_dir": "/datasets/transactions",
- "written_by": "example"
}, - "pool": {
- "as_of": "example",
- "enabled": true,
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "file_ts_col": "example",
- "reference_count": 8,
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "scored": 1,
- "size": 1,
- "source": "example"
}, - "progress": {
- "batches_processed": 1,
- "cache_buckets_total": 1,
- "cache_shards_done": 1,
- "cache_shards_total": 1,
- "cache_state": "PENDING",
- "chunks_done": 1,
- "chunks_per_second": 0.5,
- "chunks_total": 1,
- "elapsed_seconds": 0.5,
- "eta_seconds": 0.5,
- "events_done": 1,
- "events_per_second": 0.5,
- "events_per_second_instant": 0.5,
- "events_per_second_scoring": 0.5,
- "events_total": 1,
- "files_processed": 1,
- "files_total": 1,
- "latency_max_ms": 0.5,
- "latency_mean_ms": 0.5,
- "mem_peak_mb": 0.5,
- "mem_rss_mb": 0.5,
- "mem_vms_mb": 0.5,
- "message": "Example message",
- "percent": 0.5,
- "phase": "example",
- "phase_history": [
- { }
], - "rows_per_second": 0.5,
- "rows_processed": 1,
- "updated_at": "2026-01-15T10:30:00Z",
- "users_done": 1,
- "users_inflight": 1,
- "users_per_second": 0.5,
- "users_per_second_instant": 0.5,
- "users_per_second_scoring": 0.5,
- "users_total": 1,
- "writer_acked_total": 1,
- "writer_addr": "example",
- "writer_errors_total": 1,
- "writer_rows_buffered_total": 1,
- "writer_rows_flushed_total": 1,
- "writer_submitted_total": 1
}, - "publish": {
- "job_name": "churn-propensity-v3",
- "reason": "Example message",
- "status": "PENDING",
- "submitted_at": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}, - "recipe_yaml": "example",
- "shards": 1,
- "space": "example",
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "time_range": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/recipe-preview" \ -H "x-api-key: $API_KEY"
{- "recipe_yaml": "example"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}" \ -H "x-api-key: $API_KEY"
{- "cache_dir": "/datasets/transactions",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "finished_at": "2026-01-15T10:30:00Z",
- "flags": {
- "eos_inference_mode": "example",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "inference_version": "1.0.0",
- "output_destination": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "path": "/datasets/transactions"
}, - "output_dir": "/datasets/transactions",
- "output_summary": {
- "duration_sec": 1,
- "n_files": 1,
- "n_rows": 1,
- "output_dir": "/datasets/transactions",
- "written_by": "example"
}, - "pool": {
- "as_of": "example",
- "enabled": true,
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "file_ts_col": "example",
- "reference_count": 8,
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "scored": 1,
- "size": 1,
- "source": "example"
}, - "progress": {
- "batches_processed": 1,
- "cache_buckets_total": 1,
- "cache_shards_done": 1,
- "cache_shards_total": 1,
- "cache_state": "PENDING",
- "chunks_done": 1,
- "chunks_per_second": 0.5,
- "chunks_total": 1,
- "elapsed_seconds": 0.5,
- "eta_seconds": 0.5,
- "events_done": 1,
- "events_per_second": 0.5,
- "events_per_second_instant": 0.5,
- "events_per_second_scoring": 0.5,
- "events_total": 1,
- "files_processed": 1,
- "files_total": 1,
- "latency_max_ms": 0.5,
- "latency_mean_ms": 0.5,
- "mem_peak_mb": 0.5,
- "mem_rss_mb": 0.5,
- "mem_vms_mb": 0.5,
- "message": "Example message",
- "percent": 0.5,
- "phase": "example",
- "phase_history": [
- { }
], - "rows_per_second": 0.5,
- "rows_processed": 1,
- "updated_at": "2026-01-15T10:30:00Z",
- "users_done": 1,
- "users_inflight": 1,
- "users_per_second": 0.5,
- "users_per_second_instant": 0.5,
- "users_per_second_scoring": 0.5,
- "users_total": 1,
- "writer_acked_total": 1,
- "writer_addr": "example",
- "writer_errors_total": 1,
- "writer_rows_buffered_total": 1,
- "writer_rows_flushed_total": 1,
- "writer_submitted_total": 1
}, - "publish": {
- "job_name": "churn-propensity-v3",
- "reason": "Example message",
- "status": "PENDING",
- "submitted_at": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}, - "recipe_yaml": "example",
- "shards": 1,
- "space": "example",
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "time_range": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}Stop a queued or running batch run. Output already written is kept.
| id required | string Batch inference run ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}/cancel" \ -H "x-api-key: $API_KEY"
{- "cache_dir": "/datasets/transactions",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "finished_at": "2026-01-15T10:30:00Z",
- "flags": {
- "eos_inference_mode": "example",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "inference_version": "1.0.0",
- "output_destination": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "path": "/datasets/transactions"
}, - "output_dir": "/datasets/transactions",
- "output_summary": {
- "duration_sec": 1,
- "n_files": 1,
- "n_rows": 1,
- "output_dir": "/datasets/transactions",
- "written_by": "example"
}, - "pool": {
- "as_of": "example",
- "enabled": true,
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "file_ts_col": "example",
- "reference_count": 8,
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "scored": 1,
- "size": 1,
- "source": "example"
}, - "progress": {
- "batches_processed": 1,
- "cache_buckets_total": 1,
- "cache_shards_done": 1,
- "cache_shards_total": 1,
- "cache_state": "PENDING",
- "chunks_done": 1,
- "chunks_per_second": 0.5,
- "chunks_total": 1,
- "elapsed_seconds": 0.5,
- "eta_seconds": 0.5,
- "events_done": 1,
- "events_per_second": 0.5,
- "events_per_second_instant": 0.5,
- "events_per_second_scoring": 0.5,
- "events_total": 1,
- "files_processed": 1,
- "files_total": 1,
- "latency_max_ms": 0.5,
- "latency_mean_ms": 0.5,
- "mem_peak_mb": 0.5,
- "mem_rss_mb": 0.5,
- "mem_vms_mb": 0.5,
- "message": "Example message",
- "percent": 0.5,
- "phase": "example",
- "phase_history": [
- { }
], - "rows_per_second": 0.5,
- "rows_processed": 1,
- "updated_at": "2026-01-15T10:30:00Z",
- "users_done": 1,
- "users_inflight": 1,
- "users_per_second": 0.5,
- "users_per_second_instant": 0.5,
- "users_per_second_scoring": 0.5,
- "users_total": 1,
- "writer_acked_total": 1,
- "writer_addr": "example",
- "writer_errors_total": 1,
- "writer_rows_buffered_total": 1,
- "writer_rows_flushed_total": 1,
- "writer_submitted_total": 1
}, - "publish": {
- "job_name": "churn-propensity-v3",
- "reason": "Example message",
- "status": "PENDING",
- "submitted_at": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}, - "recipe_yaml": "example",
- "shards": 1,
- "space": "example",
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "time_range": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}Throughput, shard progress and resource use for a run over a rolling window.
| id required | string Batch inference run ID |
| window | string Default: "10m" Metrics window as a Go duration (e.g. 10m, 1h) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}/metrics" \ -H "x-api-key: $API_KEY"
{- "batch_p50_ms": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "batch_p95_ms": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "chunks_per_second": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "inflight": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "memory_rss_mb": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "throughput": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "users_per_second": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "window": "example",
- "writer_errors": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
], - "writer_rows": [
- {
- "timestamp": "2026-01-15T10:30:00Z",
- "value": 0.5
}
]
}Status, failure reason, nodes, live progress and writer status for each shard of a data-parallel run — on failure, which shard broke and why.
| id required | string Batch inference run ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}/shards" \ -H "x-api-key: $API_KEY"
{- "shards": [
- {
- "code": "example",
- "driver_job": "example",
- "exit_code": 1,
- "index": 1,
- "log_tail": "example",
- "nodes": [
- "example"
], - "oom_killed": false,
- "progress": { },
- "reason": "Example message",
- "status": "PENDING",
- "writer_job": "example",
- "writer_status": "PENDING"
}
]
}| id required | string Checkpoint ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints/{id}/batch-model" \ -H "x-api-key: $API_KEY"
{- "info": {
- "backbone_dim": 1,
- "checkpoint": "example",
- "engine_params": 1,
- "input_keys": [
- "REDACTED"
], - "kind": "example",
- "target_keys": [
- "REDACTED"
], - "total_params": 1
}, - "input_views": [
- {
- "cat_cols": [
- "example"
], - "client_id_col": "example",
- "event_ts_col": "example",
- "key": "REDACTED",
- "label": "example",
- "n_cat": 1,
- "n_num": 1,
- "n_str": 1,
- "n_ts": 1,
- "num_cols": [
- "example"
], - "real_id_cols": [
- "example"
], - "role": "example",
- "str_cols": [
- "example"
], - "ts_cols": [
- "example"
], - "use_real_id_as_feature": false,
- "vocab_samples": [
- [
- "example"
]
], - "vocab_sizes": [
- 1
]
}
], - "target_views": [
- {
- "cat_cols": [
- "example"
], - "client_id_col": "example",
- "event_ts_col": "example",
- "key": "REDACTED",
- "label": "example",
- "n_cat": 1,
- "n_num": 1,
- "n_str": 1,
- "n_ts": 1,
- "num_cols": [
- "example"
], - "real_id_cols": [
- "example"
], - "role": "example",
- "str_cols": [
- "example"
], - "ts_cols": [
- "example"
], - "use_real_id_as_feature": false,
- "vocab_samples": [
- [
- "example"
]
], - "vocab_sizes": [
- 1
]
}
]
}| id required | string Inference server ID |
| limit | integer Default: 10 Page size |
| after | string Cursor for pagination |
| status | string Comma-separated status filter |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/batch-runs" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "cache_dir": "/datasets/transactions",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "finished_at": "2026-01-15T10:30:00Z",
- "flags": { },
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "inference_version": "1.0.0",
- "output_destination": { },
- "output_dir": "/datasets/transactions",
- "output_summary": { },
- "pool": { },
- "progress": { },
- "publish": { },
- "recipe_yaml": "example",
- "shards": 1,
- "space": "example",
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "time_range": { },
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Score a population offline against the model this server serves.
| id required | string Inference server ID |
Batch run configuration
object AnchorSource scores each client at the positions named by a dataset/file instead of at a
single date (cortex | |
| checkpoint_id | string CheckpointID scores with a checkpoint directly — no inference server, nothing deployed. Ignored when the route already carries a server id. |
| event_dataset_ids | Array of strings EventDatasetIDs are the registered datasets feeding the model input views. It may be empty when every view is instead fed by a local dataset below; full per-view coverage (registered OR local) is enforced in the service, so there is no min=1 binding here. |
object EventDatasetShifts optionally overrides the per-dataset temporal shift, keyed by
the dataset id (registered) or the local dataset_key. Absent keys inherit the
shift the dataset was trained with; a present key wins, and an explicit empty
string clears it (score with no offset). Same string encoding as the training
shift ("1h" or " | |
Array of objects (request.CreateBatchInferenceLocalDataset) EventDatasetsLocal are event datasets fed by absolute path or neocore DataVolume rather than a registered dataset id. Each covers the model input view named by its dataset_key, so a run can be driven entirely from local paths; a run with none stays byte-identical. Appended to the id-resolved event datasets. | |
object (request.CreateBatchInferenceFlagsBody) | |
| inference_version | string <= 128 characters InferenceVersion pins the TAG of the cortex-infer image this run uses (e.g. "v0.0.9"): the carrier init container injects that image's engines/ into the ranks, and the publish step runs its binary. Empty = the architecture's tag. It does NOT change the model image — the ranks run the cortex image the checkpoint was trained with, chosen by the checkpoint and never by an operator here. |
object Output optionally sets where this run's writer publishes predictions. ConnectorID set → an output connector (aws-s3 / aws-s3-instance-profile / oracle_s3 / oracle_instance_principal / local) at Path; empty ConnectorID + non-empty Path → a raw shared-filesystem path; both empty → the auto-derived run output dir (current behavior). Mirrors the deploy-time output-destination shape. | |
object Parallelism fans the run out into N independent data shards (bucket-shard i/N), each a driver + its own output writer, mirroring the hand-run sharded batch. Nil or shards<=1 runs the single-driver path (byte-identical to before). | |
object (request.CreateBatchInferencePool) | |
| recipe_yaml | string RecipeYaml, when set, is a full user-edited cortex-batch-infer recipe document used as the run's recipe instead of the field-derived one — the advanced "YAML" mode. The field-derived recipe knobs are ignored (the YAML wins for non-managed keys), but the datasets/pool/output are still resolved the normal way to drive the job wiring (managed fields + volumes). The platform re-injects its managed fields over it at submit so the user can't break the wiring. Malformed YAML → 400. Empty = the field-derived recipe (byte-identical to the stepper path). |
required | object (request.CreateBatchInferenceTimeRange) |
{- "anchor_source": {
- "dataset_ids": [
- "string"
], - "datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "extend_to_cover": true,
- "ts_col": "string"
}, - "checkpoint_id": "string",
- "event_dataset_ids": [
- "string"
], - "event_dataset_shifts": {
- "property1": "string",
- "property2": "string"
}, - "event_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "flags": {
- "eos_inference_mode": "string",
- "include_all_probs": true,
- "infer_every_event": true,
- "infer_target_date": "string",
- "logits_only": true,
- "omit_predictions_json": true,
- "save_logits": true,
- "use_context": true
}, - "inference_version": "string",
- "output": {
- "connector_id": "string",
- "path": "string"
}, - "parallelism": {
- "concurrency": 1,
- "group_workers": 1,
- "shard_workers": 1,
- "shards": 1
}, - "pool": {
- "file_source": {
- "as_of_last_event": true,
- "connector_id": "string",
- "path": "string"
}, - "filter_dataset_ids": [
- "string"
], - "filter_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "reference_dataset_ids": [
- "string"
], - "reference_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
]
}, - "recipe_yaml": "string",
- "time_range": {
- "end": "string",
- "start": "string"
}
}{- "cache_dir": "/datasets/transactions",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "finished_at": "2026-01-15T10:30:00Z",
- "flags": {
- "eos_inference_mode": "example",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "inference_version": "1.0.0",
- "output_destination": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "path": "/datasets/transactions"
}, - "output_dir": "/datasets/transactions",
- "output_summary": {
- "duration_sec": 1,
- "n_files": 1,
- "n_rows": 1,
- "output_dir": "/datasets/transactions",
- "written_by": "example"
}, - "pool": {
- "as_of": "example",
- "enabled": true,
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "file_ts_col": "example",
- "reference_count": 8,
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "scored": 1,
- "size": 1,
- "source": "example"
}, - "progress": {
- "batches_processed": 1,
- "cache_buckets_total": 1,
- "cache_shards_done": 1,
- "cache_shards_total": 1,
- "cache_state": "PENDING",
- "chunks_done": 1,
- "chunks_per_second": 0.5,
- "chunks_total": 1,
- "elapsed_seconds": 0.5,
- "eta_seconds": 0.5,
- "events_done": 1,
- "events_per_second": 0.5,
- "events_per_second_instant": 0.5,
- "events_per_second_scoring": 0.5,
- "events_total": 1,
- "files_processed": 1,
- "files_total": 1,
- "latency_max_ms": 0.5,
- "latency_mean_ms": 0.5,
- "mem_peak_mb": 0.5,
- "mem_rss_mb": 0.5,
- "mem_vms_mb": 0.5,
- "message": "Example message",
- "percent": 0.5,
- "phase": "example",
- "phase_history": [
- { }
], - "rows_per_second": 0.5,
- "rows_processed": 1,
- "updated_at": "2026-01-15T10:30:00Z",
- "users_done": 1,
- "users_inflight": 1,
- "users_per_second": 0.5,
- "users_per_second_instant": 0.5,
- "users_per_second_scoring": 0.5,
- "users_total": 1,
- "writer_acked_total": 1,
- "writer_addr": "example",
- "writer_errors_total": 1,
- "writer_rows_buffered_total": 1,
- "writer_rows_flushed_total": 1,
- "writer_submitted_total": 1
}, - "publish": {
- "job_name": "churn-propensity-v3",
- "reason": "Example message",
- "status": "PENDING",
- "submitted_at": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}, - "recipe_yaml": "example",
- "shards": 1,
- "space": "example",
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "time_range": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}Aggregate KPIs across the server's batch runs over a rolling window.
| id required | string Inference server ID |
| window | string Default: "24h" KPIs window as a Go duration (e.g. 24h) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/batch-runs/kpis" \ -H "x-api-key: $API_KEY"
{- "avg_duration_sec": 0.5,
- "avg_rows_per_second": 0.5,
- "completed_runs": 1,
- "failed_runs": 1,
- "running_runs": 1,
- "success_rate": 0.5,
- "total_rows": 1,
- "total_runs": 1,
- "window_hours": 1
}List checkpoints by ID
| limit | integer Default: 10 Limit |
| after | string Default: "\"\"" After |
| query | string Case-insensitive substring match on checkpoint name |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "epoch": 1,
- "id": "che_1a2b3c4d5e6f708192a3b4c5",
- "metrics": { },
- "name": "churn-propensity-v3-step-4000",
- "path": "/datasets/transactions",
- "target_metrics": [
- { }
], - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "training_kind": "PRETRAIN",
- "training_name": "churn-propensity-v3"
}
], - "has_more": false
}Get a single checkpoint by id
| id required | string Checkpoint ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints/{id}" \ -H "x-api-key: $API_KEY"
{- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "epoch": 1,
- "id": "che_1a2b3c4d5e6f708192a3b4c5",
- "metrics": { },
- "name": "churn-propensity-v3-step-4000",
- "path": "/datasets/transactions",
- "target_metrics": [
- {
- "dataset": "example",
- "dataset_name": "transactions-daily",
- "name": "churn-propensity-v3",
- "type": "example",
- "values": { }
}
], - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "training_kind": "PRETRAIN",
- "training_name": "churn-propensity-v3"
}Update the display name of a checkpoint
| id required | string Checkpoint ID |
Body
| name required | string [ 1 .. 128 ] characters |
{- "name": "string"
}{- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "epoch": 1,
- "id": "che_1a2b3c4d5e6f708192a3b4c5",
- "metrics": { },
- "name": "churn-propensity-v3-step-4000",
- "path": "/datasets/transactions",
- "target_metrics": [
- {
- "dataset": "example",
- "dataset_name": "transactions-daily",
- "name": "churn-propensity-v3",
- "type": "example",
- "values": { }
}
], - "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "training_kind": "PRETRAIN",
- "training_name": "churn-propensity-v3"
}Resolve the images + tunables an inference server built from this checkpoint would deploy with (checkpoint → training → architecture).
| id required | string Checkpoint ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints/{id}/inference-config" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "image_go": "registry.example.com/image:tag",
- "max_seqlen": 4,
- "memory_margin": 0.5,
- "node_fraction": 0.5,
- "token_budget": 1
}Retrieve a list of connectors with pagination
| limit | integer Default: 10 limit |
| after | string after |
| name | string case-insensitive regular expression matched against the connector name |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "external_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "extraction_id": "act_1a2b3c4d5e6f708192a3b4c5",
- "id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "name": "warehouse-transactions",
- "namespace": "Risk",
- "paths": [
- "/datasets/transactions"
], - "prefix": "example",
- "provider": "aws-s3",
- "region": "example",
- "volume_name": "shared-datasets",
- "volume_root": "example"
}
], - "has_more": false
}Create a new connector
Connector creation request
| external_secret_id | string |
| index_interval_seconds | integer >= 0 IndexIntervalSeconds: how often the catalog re-scans this connector for new/changed data; forwarded to the neocore datasource spec. Nil/0 disables automatic re-indexing. The UI defaults to 300 (5 min). |
object (request.LocalConfig) | |
| name required | string |
object (request.OracleDefaultConfigReq) | |
object (request.OracleInstancePrincipalConfig) | |
object (request.OracleS3Config) | |
object (request.S3Config) | |
object (request.S3InstanceProfileConfig) | |
| type required | string Enum: "aws-s3" "aws-s3-instance-profile" "oracle_s3" "oracle_instance_principal" "oracle" "local" |
{- "external_secret_id": "string",
- "index_interval_seconds": 0,
- "local": {
- "paths": [
- "string"
], - "placement": {
- "mount": "string",
- "node": "string",
- "node_scope": "shared",
- "sub_path": "string"
}
}, - "name": "string",
- "oracle": {
- "bucket": "string",
- "fingerprint": "string",
- "namespace": "string",
- "passphrase": "string",
- "prefix": "string",
- "private_key": "string",
- "region": "string",
- "tenancy_ocid": "string",
- "user_ocid": "string"
}, - "oracle_instance_principal": {
- "bucket": "string",
- "namespace": "string",
- "prefix": "string",
- "region": "string"
}, - "oracle_s3": {
- "access_key_id": "string",
- "bucket": "string",
- "endpoint": "string",
- "prefix": "string",
- "region": "string",
- "secret_access_key": "string"
}, - "s3": {
- "access_key_id": "string",
- "bucket": "string",
- "prefix": "string",
- "region": "string",
- "secret_access_key": "string"
}, - "s3_instance_profile": {
- "bucket": "string",
- "prefix": "string",
- "region": "string"
}, - "type": "aws-s3"
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "external_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "extraction_id": "act_1a2b3c4d5e6f708192a3b4c5",
- "id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "name": "warehouse-transactions",
- "namespace": "Risk",
- "paths": [
- "/datasets/transactions"
], - "prefix": "example",
- "provider": "aws-s3",
- "region": "example",
- "volume_name": "shared-datasets",
- "volume_root": "example"
}Compare connector files by ID
Compare connector files request
required | Array of objects (request.CompareConnector) | ||||
Array
| |||||
{- "compare": [
- {
- "files": [
- "string"
], - "id": "string"
}
]
}{- "schema_groups": [
- {
- "files": [
- { }
], - "size": 1,
- "total_features": 1,
- "total_files": 1
}
]
}Delete a connector by ID
| id required | string Connector ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}Retrieve a connector by ID
| id required | string Connector ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "external_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "extraction_id": "act_1a2b3c4d5e6f708192a3b4c5",
- "id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "name": "warehouse-transactions",
- "namespace": "Risk",
- "paths": [
- "/datasets/transactions"
], - "prefix": "example",
- "provider": "aws-s3",
- "region": "example",
- "volume_name": "shared-datasets",
- "volume_root": "example"
}List files for a connector by ID (currently supports S3 connectors)
| id required | string Connector ID |
| prefix | string File prefix filter |
| limit | integer Maximum number of files to return |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}/files" \ -H "x-api-key: $API_KEY"
[- [
- {
- "dir": false,
- "files": "example",
- "modified_at": "2026-01-15T10:30:00Z",
- "path": "/datasets/transactions",
- "size": 1
}
]
]Returns the live status (latest/active runs, schema count) for a connector by proxying neocore.
| id required | string Connector ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}/status" \ -H "x-api-key: $API_KEY"
{- "active_index_run": {
- "duration_ms": 1,
- "error_message": "Example message",
- "file_count": 8,
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "index_hash": "example",
- "node_name": "churn-propensity-v3",
- "parquet_count": 8,
- "progress": 1,
- "schema_count": 8,
- "started_at": "2026-01-15T10:30:00Z",
- "state": "Pending",
- "total": 1,
- "total_size_bytes": 1,
- "triggered_by": "example"
}, - "active_parquet_scan": {
- "duration_ms": 1,
- "engine": "example",
- "error_message": "Example message",
- "fail_count": 8,
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "index_hash_ref": "example",
- "job_name": "churn-propensity-v3",
- "progress": 1,
- "scan_hash": "example",
- "schema_count": 8,
- "started_at": "2026-01-15T10:30:00Z",
- "state": "PENDING",
- "total": 1,
- "triggered_by": "example"
}, - "index_status": "PENDING",
- "is_indexing": false,
- "is_profiling": false,
- "latest_index_run": {
- "duration_ms": 1,
- "error_message": "Example message",
- "file_count": 8,
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "index_hash": "example",
- "node_name": "churn-propensity-v3",
- "parquet_count": 8,
- "progress": 1,
- "schema_count": 8,
- "started_at": "2026-01-15T10:30:00Z",
- "state": "Pending",
- "total": 1,
- "total_size_bytes": 1,
- "triggered_by": "example"
}, - "latest_parquet_scan": {
- "duration_ms": 1,
- "engine": "example",
- "error_message": "Example message",
- "fail_count": 8,
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "index_hash_ref": "example",
- "job_name": "churn-propensity-v3",
- "progress": 1,
- "scan_hash": "example",
- "schema_count": 8,
- "started_at": "2026-01-15T10:30:00Z",
- "state": "PENDING",
- "total": 1,
- "triggered_by": "example"
}, - "profile_status": "PENDING",
- "schema_count": 8
}Paginated list of data enhancement workspaces in the current space
| limit | integer Default: 10 Page size |
| after | string Cursor |
| name | string Filter by name (substring) |
| status | string Filter by status |
| Space required | string Space ID (spa_*) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-enhancements" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "description": "Scores the active customer base every morning.",
- "facts_count": 8,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_updated": "example",
- "name": "churn-propensity-v3",
- "predictions_count": 8,
- "raw_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "status": "DRAFT",
- "transformations_count": 8
}
], - "has_more": false
}Create a new data enhancement workspace scoped to the Space header (source datasets, status, audit). Requires JWT or API key and data-enhancements:create.
| Space required | string Space ID (spa_*) |
Create request
| description | string |
| name required | string |
| raw_dataset_ids | Array of strings |
| status | string Enum: "DRAFT" "PROCESSING" "READY" "FAILED" |
{- "description": "string",
- "name": "string",
- "raw_dataset_ids": [
- "string"
], - "status": "DRAFT"
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "description": "Scores the active customer base every morning.",
- "facts_count": 8,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_updated": "example",
- "name": "churn-propensity-v3",
- "predictions_count": 8,
- "raw_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "status": "DRAFT",
- "transformations_count": 8
}Delete a data enhancement workspace by ID in the current space
| id required | string Data enhancement ID (enh_*) |
| Space required | string Space ID (spa_*) |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-enhancements/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}Get a data enhancement workspace by ID in the current space
| id required | string Data enhancement ID (enh_*) |
| Space required | string Space ID (spa_*) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-enhancements/{id}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "description": "Scores the active customer base every morning.",
- "facts_count": 8,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_updated": "example",
- "name": "churn-propensity-v3",
- "predictions_count": 8,
- "raw_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "status": "DRAFT",
- "transformations_count": 8
}Partial update of a data enhancement workspace in the current space
| id required | string Data enhancement ID (enh_*) |
| Space required | string Space ID (spa_*) |
Update body
| description | string |
| name | string |
| raw_dataset_ids | Array of strings |
| status | string Enum: "DRAFT" "PROCESSING" "READY" "FAILED" |
{- "description": "string",
- "name": "string",
- "raw_dataset_ids": [
- "string"
], - "status": "DRAFT"
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "description": "Scores the active customer base every morning.",
- "facts_count": 8,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "last_updated": "example",
- "name": "churn-propensity-v3",
- "predictions_count": 8,
- "raw_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "status": "DRAFT",
- "transformations_count": 8
}Returns the data extractions in the current space. Deleted
| limit | integer Default: 10 limit |
| after | string after |
| status | string comma-separated statuses |
| include_deleted | boolean include soft-deleted extractions |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-extractions" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "deleted": false,
- "deleted_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "output_dir": "/datasets/transactions",
- "source": { },
- "status": "PENDING",
- "status_reason": "Example message",
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Submit a new extraction job. Returns the extraction in PENDING status.
Data extraction creation request
| description | string |
| name required | string |
required | object (request.ExtractionSource) |
{- "description": "string",
- "name": "string",
- "source": {
- "jdbc": {
- "fetchsize": 0,
- "preset": "string",
- "table": "string",
- "url": "string"
}, - "type": "jdbc",
- "unload": {
- "copybook": "string",
- "data": "string"
}
}
}{- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "deleted": false,
- "deleted_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "output_dir": "/datasets/transactions",
- "source": {
- "type": "jdbc",
- "unload": {
- "copybook": "example",
- "data": "example"
}
}, - "status": "PENDING",
- "status_reason": "Example message",
- "updated_at": "2026-01-15T10:30:00Z"
}Soft-delete a data extraction. The underlying neocore job is
| id required | string Data extraction ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-extractions/{id}" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Retrieve a data extraction by ID.
| id required | string Data extraction ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-extractions/{id}" \ -H "x-api-key: $API_KEY"
{- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "deleted": false,
- "deleted_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "output_dir": "/datasets/transactions",
- "source": {
- "type": "jdbc",
- "unload": {
- "copybook": "example",
- "data": "example"
}
}, - "status": "PENDING",
- "status_reason": "Example message",
- "updated_at": "2026-01-15T10:30:00Z"
}Update name and/or description. Source config is immutable.
| id required | string Data extraction ID |
Update body
| description | string |
| name | string |
{- "description": "string",
- "name": "string"
}{- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "deleted": false,
- "deleted_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "output_dir": "/datasets/transactions",
- "source": {
- "type": "jdbc",
- "unload": {
- "copybook": "example",
- "data": "example"
}
}, - "status": "PENDING",
- "status_reason": "Example message",
- "updated_at": "2026-01-15T10:30:00Z"
}Retrieve a list of data models with pagination
| limit | integer Default: 10 limit |
| after | string after |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-models" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "name": "churn-propensity-v3",
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Create a new data model
Data model creation request
| description | string |
| kind required | string Enum: "PRETRAIN" "POST_TRAINING" |
| name required | string |
{- "description": "string",
- "kind": "PRETRAIN",
- "name": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "name": "churn-propensity-v3",
- "updated_at": "2026-01-15T10:30:00Z"
}curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-models/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-models/{id}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "name": "churn-propensity-v3",
- "updated_at": "2026-01-15T10:30:00Z"
}Update a data model by ID
| id required | string Data model ID |
Data model update request
| description | string |
| name | string |
{- "description": "string",
- "name": "string"
}{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "name": "churn-propensity-v3",
- "updated_at": "2026-01-15T10:30:00Z"
}| profile_id | string filter by parent profile |
| status | string comma-separated statuses (include ARCHIVED to pull archived rows) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "created_at": "2026-01-15T10:30:00Z",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "feature_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_event_ts": "example",
- "min_event_ts": "example",
- "n_cols": 1,
- "n_rows": 1,
- "name": "churn-propensity-v3",
- "number_of_nodes": 2,
- "outdated": false,
- "processed_output": "example",
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_latest_version": 1,
- "profile_lineage_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_name": "transactions-profile",
- "profile_version": 1,
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "target_columns": [
- "event_ts",
- "customer_id"
], - "target_metric_columns": [
- "event_ts",
- "customer_id"
], - "timestamp_column": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Create a preprocess from a parent profile. Send EITHER
Preprocess creation
| excluded_columns | Array of strings |
| feature_columns required | Array of strings non-empty FeatureColumns are the primary-key columns that uniquely identify each row
— required (at least one). TimestampColumn is the row's event-time column —
required and non-empty ( |
| included_columns | Array of strings |
| lineage_id required | string LineageID is the parent profile's lineage id. The backend always builds the preprocess from the latest version of that lineage (and rejects a stale, non-latest version id). Send the lineage_id from the profile. |
| name required | string |
object Options is the optional advanced-settings block. Any field left nil falls back to the server-side default in mapper.DefaultPreprocessDatasetConfig. | |
| target_columns | Array of strings |
| timestamp_column required | string non-empty |
{- "excluded_columns": [
- "string"
], - "feature_columns": [
- "string"
], - "included_columns": [
- "string"
], - "lineage_id": "string",
- "name": "string",
- "options": {
- "invalid_ts_rows_limit": 0,
- "node_fraction": 0,
- "number_of_nodes": 0,
- "save_invalid_ts_rows": true
}, - "target_columns": [
- "string"
], - "timestamp_column": "string"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "created_at": "2026-01-15T10:30:00Z",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "feature_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_event_ts": "example",
- "min_event_ts": "example",
- "n_cols": 1,
- "n_rows": 1,
- "name": "churn-propensity-v3",
- "number_of_nodes": 2,
- "outdated": false,
- "processed_output": "example",
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_latest_version": 1,
- "profile_lineage_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_name": "transactions-profile",
- "profile_version": 1,
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "target_columns": [
- "event_ts",
- "customer_id"
], - "target_metric_columns": [
- "event_ts",
- "customer_id"
], - "timestamp_column": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}Hard-delete a data preprocess. Only FAILED preprocesses can be
| id required | string Data preprocess ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}" \ -H "x-api-key: $API_KEY"
{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "created_at": "2026-01-15T10:30:00Z",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "feature_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_event_ts": "example",
- "min_event_ts": "example",
- "n_cols": 1,
- "n_rows": 1,
- "name": "churn-propensity-v3",
- "number_of_nodes": 2,
- "outdated": false,
- "processed_output": "example",
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_latest_version": 1,
- "profile_lineage_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_name": "transactions-profile",
- "profile_version": 1,
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "target_columns": [
- "event_ts",
- "customer_id"
], - "target_metric_columns": [
- "event_ts",
- "customer_id"
], - "timestamp_column": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}| id required | string Data preprocess ID |
Update body
| name | string |
{- "name": "string"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "created_at": "2026-01-15T10:30:00Z",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "feature_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_event_ts": "example",
- "min_event_ts": "example",
- "n_cols": 1,
- "n_rows": 1,
- "name": "churn-propensity-v3",
- "number_of_nodes": 2,
- "outdated": false,
- "processed_output": "example",
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_latest_version": 1,
- "profile_lineage_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_name": "transactions-profile",
- "profile_version": 1,
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "target_columns": [
- "event_ts",
- "customer_id"
], - "target_metric_columns": [
- "event_ts",
- "customer_id"
], - "timestamp_column": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}Mark a PROCESSED preprocess to auto-merge into a target profile version when that version is promoted drift-free.
| id required | string Data preprocess ID |
Target profile version
| target_profile_id required | string |
{- "target_profile_id": "string"
}{- "error": "example"
}curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/archive" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Returns the persisted column snapshot — the columns the user
| id required | string Data preprocess ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/columns" \ -H "x-api-key: $API_KEY"
{- "data": [
- {
- "categories": [
- "example"
], - "classes_counts": { },
- "data_quality": { },
- "distinct_count": "example",
- "distinct_count_exact": false,
- "issues": [
- "example"
], - "kind": "example",
- "max": { },
- "mean": 0.5,
- "min": { },
- "n_classes": "example",
- "name": "churn-propensity-v3",
- "nan_count": "example",
- "null_count": "example",
- "num_values": "example",
- "percentiles": { },
- "stddev": 0.5
}
]
}Clones a PROCESSED preprocess and its parent profile into
| id required | string Data preprocess ID |
Target space
| target_space required | string |
{- "target_space": "string"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "created_at": "2026-01-15T10:30:00Z",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "feature_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_event_ts": "example",
- "min_event_ts": "example",
- "n_cols": 1,
- "n_rows": 1,
- "name": "churn-propensity-v3",
- "number_of_nodes": 2,
- "outdated": false,
- "processed_output": "example",
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_latest_version": 1,
- "profile_lineage_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_name": "transactions-profile",
- "profile_version": 1,
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "target_columns": [
- "event_ts",
- "customer_id"
], - "target_metric_columns": [
- "event_ts",
- "customer_id"
], - "timestamp_column": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}(Re-)run a preprocess as an incremental append-merge against a target profile version (default: latest of its lineage). Manual counterpart to auto-merge — use to recover from a failed merge or to merge on demand.
| id required | string Data preprocess ID |
Target profile version (optional)
| number_of_nodes | integer NumberOfNodes optionally overrides the multi-node scaling for this run. nil reuses the value persisted on the preprocess (the last one used); a non-nil value both drives this run and becomes the new "last used". Validated >= 1 in the handler, mirroring PreprocessOptions.Validate. |
| target_profile_id | string |
{- "number_of_nodes": 0,
- "target_profile_id": "string"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "created_at": "2026-01-15T10:30:00Z",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "feature_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_event_ts": "example",
- "min_event_ts": "example",
- "n_cols": 1,
- "n_rows": 1,
- "name": "churn-propensity-v3",
- "number_of_nodes": 2,
- "outdated": false,
- "processed_output": "example",
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_latest_version": 1,
- "profile_lineage_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "profile_name": "transactions-profile",
- "profile_version": 1,
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "target_columns": [
- "event_ts",
- "customer_id"
], - "target_metric_columns": [
- "event_ts",
- "customer_id"
], - "timestamp_column": "2026-01-15T10:30:00Z",
- "updated_at": "2026-01-15T10:30:00Z"
}Clear the auto-merge target on a preprocess.
| id required | string Data preprocess ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/unapprove" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Restore an archived data preprocess to its active state.
| id required | string Data preprocess ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/unarchive" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Returns the data profiles in the current space. Archived
| limit | integer Default: 10 limit |
| after | string after |
| status | string comma-separated statuses (include ARCHIVED to pull archived rows) |
| structure | string comma-separated structures |
| pending_drift | boolean only lineages with a DRIFT_BLOCKED version awaiting review (not reachable via status: a blocked version is never the lineage head) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- { }
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": { },
- "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- { }
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": { },
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}
], - "has_more": false
}Submit a new profiling job. Returns the profile in PENDING status.
Data profile creation request
| description | string |
object Metrics optionally overrides the scan's drift policy (injected as the
top-level | |
required | Array of objects (request.DataProfileFile) non-empty |
| name required | string |
object Options is the optional advanced-settings block. Any field left nil falls back to the server-side default in mapper.DefaultProfileScanBaseConfig. | |
| structure required | string (model.DataProfileStructure) Enum: "EVENT_BASED" "FEATURE_BASED" "FILTER_BASED" |
{- "description": "string",
- "drift_metrics": {
- "categorical_psi": {
- "bands": {
- "critical": 0,
- "minor": 0,
- "moderate": 0,
- "significant": 0
}, - "block": true,
- "block_at": "string",
- "compute": true
}, - "null_ratio_jump": {
- "block": true,
- "block_above": 0,
- "compute": true
}, - "numeric_psi": {
- "bands": {
- "critical": 0,
- "minor": 0,
- "moderate": 0,
- "significant": 0
}, - "block": true,
- "block_at": "string",
- "compute": true
}
}, - "files": [
- {
- "id": "string",
- "paths": [
- "string"
]
}
], - "name": "string",
- "options": {
- "categorical_threshold": 0,
- "node_fraction": 0,
- "number_of_nodes": 0,
- "sample_fraction": 0,
- "sample_max_rows": 0,
- "sentinel_threshold": 0,
- "textual_threshold": 0
}, - "structure": "EVENT_BASED"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}Hard-delete a data profile. Only FAILED profiles can be deleted —
| id required | string Data profile ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Retrieve a data profile by ID.
| id required | string Data profile ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}" \ -H "x-api-key: $API_KEY"
{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}Update name and/or description. Files and structure are immutable.
| id required | string Data profile ID |
Update body
| description | string |
| name | string |
| structure | string (model.DataProfileStructure) Enum: "EVENT_BASED" "FEATURE_BASED" "FILTER_BASED" |
{- "description": "string",
- "name": "string",
- "structure": "EVENT_BASED"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}Accept the drift detected on a DRIFT_BLOCKED version. Submits the engine merge_info action to consume the staged batch and bump the version; the version returns to PENDING while the merge runs, and is promoted (drift-free) by the webhook on completion.
| id required | string Drift-blocked profile version ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/approve-drift" \ -H "x-api-key: $API_KEY"
{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}Soft-archive a data profile. Profiles are never hard-deleted —
| id required | string Data profile ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/archive" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Recast one or more columns of a profile lineage to a new type, producing a new incremental version. Source-type/transition validation is delegated to the engine; an illegal cast surfaces as a FAILED version.
| id required | string Data profile lineage ID |
Columns to recast
Array of objects (request.ApprovePreprocessTarget) ApprovePreprocesses optionally pre-approves already-PROCESSED datasets (built from this profile) to auto-merge into the new cast version once it is promoted — same mechanism as AppendDataProfileVersion, each carrying its own node count. Non-PROCESSED ids are ignored by the repository's status guard. | |
required | Array of objects (request.CastColumnSpec) non-empty |
object Options tunes the cast (re-scan) job — same knobs as AppendVersion, e.g. number_of_nodes to scale the recast across a multi-node Spark cluster. nil falls back to the server-side defaults. |
{- "approve_preprocesses": [
- {
- "id": "string",
- "number_of_nodes": 0
}
], - "columns": [
- {
- "column": "string",
- "target_type": "numeric"
}
], - "options": {
- "categorical_threshold": 0,
- "node_fraction": 0,
- "number_of_nodes": 0,
- "sample_fraction": 0,
- "sample_max_rows": 0,
- "sentinel_threshold": 0,
- "textual_threshold": 0
}
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}One page of a single column's value distribution (value, count,
| id required | string Data profile lineage ID |
| column required | string Column name (URL-encoded) |
| version | integer Profile version (default: latest) |
| search | string Case-insensitive substring filter on the value |
| limit | integer Page size (default 100, max 1000) |
| offset | integer Page offset |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/columns?column=COLUMN" \ -H "x-api-key: $API_KEY"
{- "data": {
- "categories": [
- "example"
], - "classes_counts": { },
- "data_quality": { },
- "distinct_count": "example",
- "distinct_count_exact": false,
- "issues": [
- "example"
], - "kind": "example",
- "max": { },
- "mean": 0.5,
- "min": { },
- "n_classes": "example",
- "name": "churn-propensity-v3",
- "nan_count": "example",
- "null_count": "example",
- "num_values": "example",
- "percentiles": { },
- "stddev": 0.5
}, - "has_more": false,
- "rows_count": 8,
- "total": 1,
- "values": [
- {
- "count": "example",
- "probability": 0.5,
- "value": "example"
}
]
}Full drift_result.json a drift-blocking scan produced for a DRIFT_BLOCKED (or DRIFT_REJECTED) version — verdict, per-column findings with inline detail, and the metric roll-up. Lets the frontend review the drift before approving or rejecting. Read live from neocore.
| id required | string Drift-blocked version ID |
| batch_id | string Staged batch id (defaults to the version's) |
| search | string Substring filter on a finding's column |
| regex | string Regex filter on a finding's column (takes precedence over search) |
| varType | Array of strings Filter findings by column kind (numeric/categorical) |
| limit | integer Page size (default 20) |
| offset | integer Page offset |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/drift" \ -H "x-api-key: $API_KEY"
{- "findings": [
- { }
], - "has_more": false,
- "metrics": [
- { }
], - "run": {
- "batch_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "incoming": {
- "n_rows": 1,
- "paths": [
- "/datasets/transactions"
]
}, - "reference": {
- "bin_edges_info_version": 1,
- "dir": "/datasets/transactions",
- "reference_info_version": 1
}, - "run_id": "bif_1a2b3c4d5e6f708192a3b4c5"
}, - "total": 1,
- "verdict": {
- "block_reason": "Example message",
- "n_findings": 1,
- "recommended_action": "example",
- "score": 0.5,
- "score_threshold": 0.5,
- "severity": "example",
- "status": "PENDING",
- "summary": "example"
}
}Per-version dataset-quality summary trend (ascending by version) for a lineage, cursor-paginated. Pass the last row's id as after for the next page.
| id required | string Data profile lineage ID |
| limit | integer Page size (default 20, max 100) |
| after | string Cursor: id of the previous page's last version (exclusive) |
| order | string Sort direction: 'asc' or 'desc' (default 'asc') |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/quality-history" \ -H "x-api-key: $API_KEY"
{- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "summary": { },
- "version": 1
}
], - "has_more": false
}Reject the drift detected on a DRIFT_BLOCKED version. The staged batch is abandoned (never merged), the lineage head is untouched, and the version is marked DRIFT_REJECTED with the supplied reason. Being terminal, it frees the lineage for a new append (after the source is fixed).
| id required | string Drift-blocked profile version ID |
Rejection reason
| reason required | string |
{- "reason": "string"
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}Live column statistics from neocore. Used for the
| id required | string Data profile lineage ID |
| version | integer Profile version (default: latest) |
| search | string Substring filter |
| regex | string Regex filter (takes precedence over search) |
| limit | integer Page size |
| offset | integer Page offset |
| sort | string Default: "name" Enum: "name" "null_count" Ranking key applied before pagination |
| order | string Default: "asc" Enum: "asc" "desc" Ranking direction |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/stats" \ -H "x-api-key: $API_KEY"
{- "after": "1a2b3c4d5e6f708192a3b4c5",
- "data": [
- {
- "categories": [
- "example"
], - "classes_counts": { },
- "data_quality": { },
- "distinct_count": "example",
- "distinct_count_exact": false,
- "issues": [
- "example"
], - "kind": "example",
- "max": { },
- "mean": 0.5,
- "min": { },
- "n_classes": "example",
- "name": "churn-propensity-v3",
- "nan_count": "example",
- "null_count": "example",
- "num_values": "example",
- "percentiles": { },
- "stddev": 0.5
}
], - "has_more": false,
- "rows_count": 8,
- "sampled_rows_count": 8,
- "total": 1
}The drill-down cell: the period's screen stats, histogram/class counts and drift row (entry, verbatim from the engine) plus the rulers they were measured over (hist for numeric, classes for categorical). Cells exist at the lineage's NATIVE granularity only — period must be a native-axis label; no period format is enforced, a period that was never measured is simply a 404.
| id required | string Data profile lineage ID |
| column required | string Column name |
| period required | string Period (e.g. 1991-01-07) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/cell?column=COLUMN&period=PERIOD" \ -H "x-api-key: $API_KEY"
{- "classes": { },
- "column": "event_ts",
- "entry": { },
- "granularity": "example",
- "hist": { },
- "kind": "example",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "period": "example",
- "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "state_version": 1
}The full series document for one column: all six metric arrays (psi/jsd/tvd and their _prev twins) parallel to the column's periods axis, plus verdict and flags. granularity selects which axis (default: finest available); start/end window it. The column is a query parameter because column names are free-form (a name may contain "/").
| id required | string Data profile lineage ID |
| column required | string Column name |
| granularity | string day|week|month (default: finest available) |
| start | string Window start period (inclusive) |
| end | string Window end period (inclusive) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/column?column=COLUMN" \ -H "x-api-key: $API_KEY"
{- "column": "event_ts",
- "flagged_by": {
- "moment": [
- "example"
], - "psi": [
- "example"
]
}, - "flagged_periods": [
- "example"
], - "granularity": "example",
- "jsd": [
- 0.5
], - "jsd_prev": [
- 0.5
], - "kind": "example",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "periods": [
- "example"
], - "psi": [
- 0.5
], - "psi_prev": [
- 0.5
], - "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "state_version": 1,
- "tvd": [
- 0.5
], - "tvd_prev": [
- 0.5
], - "verdict": "example"
}The column detail panel's feed: per-bucket volume/count/null arrays at the selected granularity plus the window's summary cards, with the class composition (categorical) or histogram (numeric) per bucket. Coarse buckets are exact read-time aggregations of the native per-period stats; drift metrics stay on /column and /heatmap (real per-granularity scores from the engine, never aggregated). start/end are inclusive bucket labels at the selected granularity.
| id required | string Data profile lineage ID |
| column required | string Column name |
| granularity | string day|week|month (default: finest available) |
| start | string Window start bucket (inclusive, YYYY-MM-DD) |
| end | string Window end bucket (inclusive, YYYY-MM-DD) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/column-profile?column=COLUMN" \ -H "x-api-key: $API_KEY"
{- "classes_series": {
- "counts": { },
- "top_classes": [
- "example"
]
}, - "column": "event_ts",
- "count": [
- 8
], - "granularity": "example",
- "hist": {
- "bins": [
- [
- 1
]
], - "edges": [
- 0.5
]
}, - "kind": "example",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "null_count": [
- 8
], - "periods": [
- "example"
], - "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "state_version": 1,
- "totals": {
- "distinct": 1,
- "entropy": 0.5,
- "max": 0.5,
- "mean": 0.5,
- "min": 0.5,
- "n_classes": 1,
- "null_count": 8,
- "null_rate": 0.5,
- "rows": 1,
- "stddev": 0.5,
- "zero_count": 8,
- "zero_rate": 0.5
}, - "volume": [
- 1
]
}The lineage's periods axis, volume and header plus each column's PSI series and flagged periods — the heatmap feed. granularity selects which axis (available_granularities lists the lineage's options; default = finest available). start/end (inclusive period strings) window the axis and every parallel array; n_periods/n_columns keep echoing the full-axis header. 404 until the first completed run pushes its view.
| id required | string Data profile lineage ID |
| granularity | string day|week|month (default: finest available) |
| start | string Window start period (inclusive, e.g. 1991-01-07) |
| end | string Window end period (inclusive) |
| columns_limit | integer Column page size, worst drift first (default 50, max 500; 0 = the axis only) |
| columns_offset | integer Column page offset |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/heatmap" \ -H "x-api-key: $API_KEY"
{- "available_granularities": [
- "example"
], - "columns": [
- {
- "column": "event_ts",
- "kind": "example",
- "psi": [
- 0.5
], - "psi_prev": [
- 0.5
], - "state_version": 1,
- "verdict": "example"
}
], - "columns_has_more": false,
- "drift": { },
- "event_ts_col": "example",
- "granularity": "example",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "n_columns": 1,
- "n_periods": 1,
- "periods": [
- "example"
], - "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "sampling": { },
- "scan_mode": "example",
- "state_version": 1,
- "volume": [
- 1
]
}The lineage's run history, newest first, cursor-paginated.
| id required | string Data profile lineage ID |
| after | string Cursor: id of the previous page's last run |
| limit | integer Page size (default 20, max 100) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/runs" \ -H "x-api-key: $API_KEY"
{- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "end_date": "example",
- "event_ts_col": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "rebuild": false,
- "sample_max_rows": 4,
- "scan_mode": "example",
- "start_date": "2026-01-01T00:00:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "update_ref_period": { },
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Submit a temporal quality job over the lineage head's files. The body is optional: an empty body folds whatever data is new into the accumulated state with the lineage's locked config. event_ts_col (+ scan_mode) is required when cold-starting (first run or rebuild); start_date/end_date bound the event-time window this run analyzes; update_ref_period sent alone re-scores drift from the saved state against a new reference (no data read), and sent with a cold start it seeds the fresh state's reference. Unknown body keys are rejected with a 400.
| id required | string Data profile lineage ID |
Run options: cold-start config (event_ts_col, scan_mode, sample_max_rows, rebuild), this run's event-time window (start_date, end_date) and/or the drift reference (update_ref_period)
| end_date | string |
| event_ts_col | string EventTSColumn names the event-time axis. Required on the FIRST run of a lineage only — a rule that needs the lineage's history, so the service (not a binding tag) enforces it; later runs reuse the stored column. |
| rebuild | boolean Rebuild discards the accumulated state and cold-starts the lineage with THIS request's EventTSColumn/ScanMode — the only way to change them. The engine drops the persisted drift reference with the state: send UpdateRefPeriod on the rebuild to keep a moved reference. |
| sample_max_rows | integer SampleMaxRows is the approximate row count a sample run reads (the engine derives the sampling fraction from it). Required — and only allowed — when ScanMode is "sample". Locked together with ScanMode. |
| scan_mode | string ScanMode is "full" or "sample". Like EventTSColumn it is lineage-locked engine-side: decided on the first run (empty = "full"), reused on later runs, changeable only via Rebuild. |
| start_date | string StartDate/EndDate bound the event-time window THIS run analyzes ("YYYY-MM-DD", inclusive at both ends; either side may be absent = unbounded). Unlike the fields above they are per-run intent: never lineage-locked, never inherited from a previous run — an empty side means unbounded, not "reuse the last run's window". The engine's batch ledger rejects a window overlapping data already folded from the same files. |
object UpdateRefPeriod moves the drift reference: the engine scores every period outside this range against the periods inside it, republishes every document, and persists the range in its state so later data runs keep scoring against it (until the next move). Two shapes:
|
{- "end_date": "string",
- "event_ts_col": "string",
- "rebuild": true,
- "sample_max_rows": 0,
- "scan_mode": "string",
- "start_date": "string",
- "update_ref_period": {
- "end": "string",
- "start": "string"
}
}{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "end_date": "example",
- "event_ts_col": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "rebuild": false,
- "sample_max_rows": 4,
- "scan_mode": "example",
- "start_date": "2026-01-01T00:00:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "update_ref_period": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "updated_at": "2026-01-15T10:30:00Z"
}| id required | string Data profile lineage ID |
| runId required | string Temporal quality run ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/runs/{runId}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "end_date": "example",
- "event_ts_col": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "rebuild": false,
- "sample_max_rows": 4,
- "scan_mode": "example",
- "start_date": "2026-01-01T00:00:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "update_ref_period": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "updated_at": "2026-01-15T10:30:00Z"
}Restore an archived data profile to its active state.
| id required | string Data profile ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/unarchive" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}Page of a logical profile's versions in chronological order (newest first by creation time), addressed by lineage ID (the lineage_id from any profile response). Includes non-READY attempts (FAILED / DRIFT_REJECTED / etc.) interleaved in time order. Cursor pagination by id: pass the last row's id as after.
| id required | string Data profile lineage ID |
| limit | integer Page size (default 20, max 100) |
| after | string Cursor: id of the previous page's last version (exclusive) |
| order | string Sort direction: 'asc' or 'desc' (default 'desc') |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/versions" \ -H "x-api-key: $API_KEY"
{- "data": [
- {
- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- { }
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": { },
- "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- { }
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": { },
- "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}
], - "has_more": false
}Append new connector paths to an existing profile lineage, producing a new incremental version. Optionally pre-approve PROCESSED preprocesses to auto-merge into it.
| id required | string Data profile lineage ID |
New paths (+ optional approvals)
Array of objects (request.ApprovePreprocessTarget) | |
object (request.ProfileOptions) |
{- "approve_preprocesses": [
- {
- "id": "string",
- "number_of_nodes": 0
}
], - "options": {
- "categorical_threshold": 0,
- "node_fraction": 0,
- "number_of_nodes": 0,
- "sample_fraction": 0,
- "sample_max_rows": 0,
- "sentinel_threshold": 0,
- "textual_threshold": 0
}
}{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}A single version of a logical profile, addressed by lineage ID + version number.
| id required | string Data profile lineage ID |
| version required | integer Version number |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/versions/{version}" \ -H "x-api-key: $API_KEY"
{- "archived": false,
- "archived_at": "2026-01-15T10:30:00Z",
- "cast_columns": [
- {
- "column": "event_ts",
- "target_type": "numeric"
}
], - "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "drift_approved_at": "2026-01-15T10:30:00Z",
- "drift_detected_at": "2026-01-15T10:30:00Z",
- "drift_mergeable": false,
- "drift_metrics": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "drift_reason_code": "Example message",
- "drift_rejected_at": "2026-01-15T10:30:00Z",
- "favorite": false,
- "files": [
- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "paths": [
- "/datasets/transactions"
]
}
], - "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "is_latest": false,
- "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "materializations_count": 8,
- "name": "churn-propensity-v3",
- "quality_summary": {
- "cols_with_nulls": 1,
- "computed_at": "2026-01-15T10:30:00Z",
- "constant_cols": 1,
- "empty_cols": 1,
- "kind_counts": { },
- "ncols": 1,
- "overall_null_pct": 0.5,
- "rows_count": 8,
- "sample_rows_count": 8,
- "total_categorical_classes": 1,
- "total_nulls": 1,
- "total_zeros": 1,
- "zero_rate": 0.5
}, - "status": "PENDING",
- "status_reason": "Example message",
- "structure": "EVENT_BASED",
- "updated_at": "2026-01-15T10:30:00Z",
- "version": 1
}The catalog an operator picks sources from: key, hive partition prefix, whether a preprocessed form exists, and the tolerated staleness. Served from the API rather than duplicated in the front-end so the screen and the pipeline have one place to agree.
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-bases" \ -H "x-api-key: $API_KEY"
{- "items": [
- {
- "group": "transacional",
- "key": "REDACTED",
- "max_lag_days": 4,
- "note": "example",
- "partition_prefix": "example",
- "preprocessable": false,
- "required": false,
- "title": "example"
}
]
}Runs newest first, with the status refreshed from the cluster for the ones still in flight. Progress figures come from the last detail read — the listing costs one cluster call regardless of how many runs are on the page.
| space_id | string Narrow to one space |
| status | string Comma-separated statuses |
| limit | integer Maximum rows |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-runs" \ -H "x-api-key: $API_KEY"
{- "items": [
- {
- "chunk_size": 1,
- "cluster": "example",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_ref": "example",
- "deadline": "example",
- "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
- "finished_at": "2026-01-15T10:30:00Z",
- "history_months": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "jobs": [
- { }
], - "name": "churn-propensity-v3",
- "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "output_path": "/datasets/transactions",
- "output_region": "example",
- "output_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "output_version": "1.0.0",
- "progress": { },
- "queue": { },
- "queue_in": { },
- "served_model_name": "churn-propensity",
- "shard_details": [
- { }
], - "shards": 1,
- "sources": [
- { }
], - "space": "example",
- "stages": [
- { }
], - "started_at": "2026-01-15T10:30:00Z",
- "status": "Pending",
- "status_reason": "Example message",
- "streaming": false,
- "work_root": "example"
}
]
}Submits the three roles of the chain (input, N inference shards, analysis) as separate neocore jobs. The sources are re-resolved server-side before anything is submitted, so a pre-flight that has gone stale is refused rather than run.
Run configuration
| chunk_size required | integer >= 1 |
| data_ref | string VAZIA = derivada da |
| deadline | string Deadline is advisory — it is recorded so the shard count has a stated reason. Format YYYY-MM-DD. Meaningless on a streaming run (there is no end to be late for), so it is refused together with it. |
| endpoint_id | string O servidor de modelo vem por UMA das duas formas, nunca pelas duas --
EndpointID: a plataforma resolve endereço e nome do modelo, e é a única
forma em que "rodar de novo" re-resolve o endereço quando a frota muda de
lugar. Por isso nenhum dos dois é |
| endpoint_url | string EndpointURL aponta um vLLM que não é endpoint desta plataforma. Aceita
CSV, como o |
| history_months required | integer [ 1 .. 120 ] |
| name required | string <= 63 characters Sem |
| output_connector_id | string OutputConnectorID names an S3 (or instance-profile) data integration to write the result to, DIRECTLY — no staging copy. It may be the same integration as the queue's or a different one. |
| output_path | string OutputPath is where the analysis role writes the consolidated parquet. Empty keeps it under the run's own work root. With OutputConnectorID it is the prefix inside that connector's bucket. |
| output_version required | string <= 63 characters |
required | object (request.DNAQueueInput) |
| served_model_name | string ServedModelName é obrigatório JUNTO de EndpointURL: |
| shards required | integer [ 1 .. 64 ] |
required | Array of objects (request.DNASourceInput) non-empty |
| streaming | boolean Streaming makes the run ETERNAL: the input role keeps watching the queue instead of doing a single pass, and the inference shards stop exiting when they drain the shelf. It is a CHOICE, not a default — a run that cannot end has no percent, no ETA and no deadline, so the screen shows a different set of numbers (rate and shelf depth) and the only way out is canceling it. |
{- "chunk_size": 1,
- "data_ref": "string",
- "deadline": "string",
- "endpoint_id": "string",
- "endpoint_url": "string",
- "history_months": 1,
- "name": "string",
- "output_connector_id": "string",
- "output_path": "string",
- "output_version": "string",
- "queue": {
- "connector_id": "string",
- "kind": "preprocessed",
- "path": "string",
- "ref": "string"
}, - "served_model_name": "string",
- "shards": 1,
- "sources": [
- {
- "base": "string",
- "connector_id": "string",
- "kind": "preprocessed",
- "path": "string",
- "ref": "string"
}
], - "streaming": true
}{- "chunk_size": 1,
- "cluster": "example",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_ref": "example",
- "deadline": "example",
- "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
- "finished_at": "2026-01-15T10:30:00Z",
- "history_months": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "jobs": [
- {
- "name": "churn-propensity-v3",
- "role": "example",
- "shard": 1
}
], - "name": "churn-propensity-v3",
- "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "output_path": "/datasets/transactions",
- "output_region": "example",
- "output_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "output_version": "1.0.0",
- "progress": {
- "chunks_ready": 1,
- "chunks_total": 1,
- "clients_ok": 1,
- "clients_per_second": 0.5,
- "clients_total": 1,
- "empty": 1,
- "errors": 1,
- "eta_seconds": 1,
- "input_tokens_avg": 0.5,
- "message": "Example message",
- "moments_per_client": 0.5,
- "percent": 0.5,
- "phase": "syncing",
- "sent_to_s3": 1,
- "shelf": 1,
- "truncated": 1
}, - "queue": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "dir": "/datasets/transactions",
- "kind": "preprocessed",
- "origin": "example",
- "path": "/datasets/transactions",
- "ref": "example",
- "region": "example",
- "secret_id": "sec_1a2b3c4d5e6f708192a3b4c5"
}, - "queue_in": {
- "downloaded": 1,
- "new_orders": 1,
- "reread": 1,
- "urgent": 1
}, - "served_model_name": "churn-propensity",
- "shard_details": [
- {
- "clients_ok": 1,
- "clients_per_second": 0.5,
- "failure_reason": "Example message",
- "index": 1,
- "job_name": "churn-propensity-v3",
- "phase": "syncing",
- "status": "Pending"
}
], - "shards": 1,
- "sources": [
- {
- "base": "example",
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "dir": "/datasets/transactions",
- "kind": "preprocessed",
- "partition_prefix": "example",
- "path": "/datasets/transactions",
- "ref": "example"
}
], - "space": "example",
- "stages": [
- {
- "chunk": "example",
- "chunk_since": "example",
- "job_names": [
- "churn-propensity-v3"
], - "job_state": "Pending",
- "message": "Example message",
- "role": "example",
- "seen_at": "2026-01-15T10:30:00Z",
- "step": "example"
}
], - "started_at": "2026-01-15T10:30:00Z",
- "status": "Pending",
- "status_reason": "Example message",
- "streaming": false,
- "work_root": "example"
}Resolves every source and the queue before any job exists, and separates BLOCKERS (which stop the submit) from WARNINGS (the operator's call). It exists because this pipeline's failures are silent: a base with no partition for the day returns a months-old snapshot, an empty queue processes zero clients without an error.
Configuration to resolve
| data_ref required | string |
| endpoint_id | string Opcional: o pré-flight resolve FONTE e FILA, não o modelo. Uma execução apontada para uma URL manual simplesmente não o manda. |
| history_months | integer |
required | object Sem |
required | Array of objects (request.DNASourceInput) non-empty |
{- "data_ref": "string",
- "endpoint_id": "string",
- "history_months": 0,
- "queue": {
- "connector_id": "string",
- "kind": "preprocessed",
- "path": "string",
- "ref": "string"
}, - "sources": [
- {
- "base": "string",
- "connector_id": "string",
- "kind": "preprocessed",
- "path": "string",
- "ref": "string"
}
]
}{- "blockers": [
- "example"
], - "queue": {
- "dir": "/datasets/transactions",
- "newest_request_at": "2026-01-15T10:30:00Z",
- "oldest_request_at": "2026-01-15T10:30:00Z",
- "origin": "example",
- "requests_total": 1,
- "resolved_at_run": false
}, - "sources": [
- {
- "base": "example",
- "dir": "/datasets/transactions",
- "first_event": "example",
- "kind": "preprocessed",
- "lag_days": 1,
- "last_event": "example",
- "missing": false,
- "partition_prefix": "example",
- "path": "/datasets/transactions",
- "ref": "example",
- "resolved_at_run": false,
- "rows": 1,
- "stale": false
}
], - "warnings": [
- "example"
]
}One run in depth: aggregate progress and per-shard state, read live from the jobs' own reports and persisted as they are observed — the final metrics live in the jobs' outputs, and the cluster eventually deletes the jobs.
| runId required | string Run ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-runs/{runId}" \ -H "x-api-key: $API_KEY"
{- "chunk_size": 1,
- "cluster": "example",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_ref": "example",
- "deadline": "example",
- "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
- "finished_at": "2026-01-15T10:30:00Z",
- "history_months": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "jobs": [
- {
- "name": "churn-propensity-v3",
- "role": "example",
- "shard": 1
}
], - "name": "churn-propensity-v3",
- "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "output_path": "/datasets/transactions",
- "output_region": "example",
- "output_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "output_version": "1.0.0",
- "progress": {
- "chunks_ready": 1,
- "chunks_total": 1,
- "clients_ok": 1,
- "clients_per_second": 0.5,
- "clients_total": 1,
- "empty": 1,
- "errors": 1,
- "eta_seconds": 1,
- "input_tokens_avg": 0.5,
- "message": "Example message",
- "moments_per_client": 0.5,
- "percent": 0.5,
- "phase": "syncing",
- "sent_to_s3": 1,
- "shelf": 1,
- "truncated": 1
}, - "queue": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "dir": "/datasets/transactions",
- "kind": "preprocessed",
- "origin": "example",
- "path": "/datasets/transactions",
- "ref": "example",
- "region": "example",
- "secret_id": "sec_1a2b3c4d5e6f708192a3b4c5"
}, - "queue_in": {
- "downloaded": 1,
- "new_orders": 1,
- "reread": 1,
- "urgent": 1
}, - "served_model_name": "churn-propensity",
- "shard_details": [
- {
- "clients_ok": 1,
- "clients_per_second": 0.5,
- "failure_reason": "Example message",
- "index": 1,
- "job_name": "churn-propensity-v3",
- "phase": "syncing",
- "status": "Pending"
}
], - "shards": 1,
- "sources": [
- {
- "base": "example",
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "dir": "/datasets/transactions",
- "kind": "preprocessed",
- "partition_prefix": "example",
- "path": "/datasets/transactions",
- "ref": "example"
}
], - "space": "example",
- "stages": [
- {
- "chunk": "example",
- "chunk_since": "example",
- "job_names": [
- "churn-propensity-v3"
], - "job_state": "Pending",
- "message": "Example message",
- "role": "example",
- "seen_at": "2026-01-15T10:30:00Z",
- "step": "example"
}
], - "started_at": "2026-01-15T10:30:00Z",
- "status": "Pending",
- "status_reason": "Example message",
- "streaming": false,
- "work_root": "example"
}Cancels the run's jobs. What was already written STAYS — the output is per chunk, so a later run resumes from where this one stopped.
| runId required | string Run ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-runs/{runId}/cancel" \ -H "x-api-key: $API_KEY"
{- "chunk_size": 1,
- "cluster": "example",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "data_ref": "example",
- "deadline": "example",
- "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
- "finished_at": "2026-01-15T10:30:00Z",
- "history_months": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "jobs": [
- {
- "name": "churn-propensity-v3",
- "role": "example",
- "shard": 1
}
], - "name": "churn-propensity-v3",
- "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "output_path": "/datasets/transactions",
- "output_region": "example",
- "output_secret_id": "sec_1a2b3c4d5e6f708192a3b4c5",
- "output_version": "1.0.0",
- "progress": {
- "chunks_ready": 1,
- "chunks_total": 1,
- "clients_ok": 1,
- "clients_per_second": 0.5,
- "clients_total": 1,
- "empty": 1,
- "errors": 1,
- "eta_seconds": 1,
- "input_tokens_avg": 0.5,
- "message": "Example message",
- "moments_per_client": 0.5,
- "percent": 0.5,
- "phase": "syncing",
- "sent_to_s3": 1,
- "shelf": 1,
- "truncated": 1
}, - "queue": {
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "dir": "/datasets/transactions",
- "kind": "preprocessed",
- "origin": "example",
- "path": "/datasets/transactions",
- "ref": "example",
- "region": "example",
- "secret_id": "sec_1a2b3c4d5e6f708192a3b4c5"
}, - "queue_in": {
- "downloaded": 1,
- "new_orders": 1,
- "reread": 1,
- "urgent": 1
}, - "served_model_name": "churn-propensity",
- "shard_details": [
- {
- "clients_ok": 1,
- "clients_per_second": 0.5,
- "failure_reason": "Example message",
- "index": 1,
- "job_name": "churn-propensity-v3",
- "phase": "syncing",
- "status": "Pending"
}
], - "shards": 1,
- "sources": [
- {
- "base": "example",
- "connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "dir": "/datasets/transactions",
- "kind": "preprocessed",
- "partition_prefix": "example",
- "path": "/datasets/transactions",
- "ref": "example"
}
], - "space": "example",
- "stages": [
- {
- "chunk": "example",
- "chunk_since": "example",
- "job_names": [
- "churn-propensity-v3"
], - "job_state": "Pending",
- "message": "Example message",
- "role": "example",
- "seen_at": "2026-01-15T10:30:00Z",
- "step": "example"
}
], - "started_at": "2026-01-15T10:30:00Z",
- "status": "Pending",
- "status_reason": "Example message",
- "streaming": false,
- "work_root": "example"
}Retrieve drift policies in the current space with pagination
| limit | integer Default: 10 limit |
| after | string after |
| name | string name filter |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/drift-policies" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "policy": { },
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Create a new drift policy in the current space
Drift policy creation request
| description | string |
| name required | string |
object (model.DriftMetrics) |
{- "description": "string",
- "name": "string",
- "policy": {
- "categorical_psi": {
- "bands": {
- "critical": 0,
- "minor": 0,
- "moderate": 0,
- "significant": 0
}, - "block": true,
- "block_at": "string",
- "compute": true
}, - "null_ratio_jump": {
- "block": true,
- "block_above": 0,
- "compute": true
}, - "numeric_psi": {
- "bands": {
- "critical": 0,
- "minor": 0,
- "moderate": 0,
- "significant": 0
}, - "block": true,
- "block_at": "string",
- "compute": true
}
}
}{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "policy": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "updated_at": "2026-01-15T10:30:00Z"
}Delete a drift policy by ID
| id required | string Drift policy ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/drift-policies/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}Retrieve a drift policy by ID
| id required | string Drift policy ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/drift-policies/{id}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "policy": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "updated_at": "2026-01-15T10:30:00Z"
}Update a drift policy by ID
| id required | string Drift policy ID |
Drift policy update request
| description | string |
| name | string |
object (model.DriftMetrics) |
{- "description": "string",
- "name": "string",
- "policy": {
- "categorical_psi": {
- "bands": {
- "critical": 0,
- "minor": 0,
- "moderate": 0,
- "significant": 0
}, - "block": true,
- "block_at": "string",
- "compute": true
}, - "null_ratio_jump": {
- "block": true,
- "block_above": 0,
- "compute": true
}, - "numeric_psi": {
- "bands": {
- "critical": 0,
- "minor": 0,
- "moderate": 0,
- "significant": 0
}, - "block": true,
- "block_at": "string",
- "compute": true
}
}
}{- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "policy": {
- "categorical_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}, - "null_ratio_jump": {
- "block": false,
- "block_above": 0.5,
- "compute": true
}, - "numeric_psi": {
- "bands": { },
- "block": false,
- "block_at": "2026-01-15T10:30:00Z",
- "compute": true
}
}, - "updated_at": "2026-01-15T10:30:00Z"
}Create a new evaluation
Evaluation creation request
| benchmark_id required | string |
| checkpoint_id required | string |
| gpu_count required | integer |
{- "benchmark_id": "string",
- "checkpoint_id": "string",
- "gpu_count": 0
}{- "benchmark_id": "ben_1a2b3c4d5e6f708192a3b4c5",
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "gpu_count": 8,
- "id": "eva_1a2b3c4d5e6f708192a3b4c5",
- "result": { },
- "updated_at": "2026-01-15T10:30:00Z",
- "updated_by": "example"
}Remove the current user's star. Idempotent — removing a star that is not there succeeds.
| itemId required | string Item ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/favorites/{itemId}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "favorited": false,
- "item_id": "fav_1a2b3c4d5e6f708192a3b4c5",
- "item_type": "example"
}Star an item for the current user. Idempotent — starring twice succeeds.
| itemId required | string Item ID |
curl -X PUT "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/favorites/{itemId}" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "favorited": false,
- "item_id": "fav_1a2b3c4d5e6f708192a3b4c5",
- "item_type": "example"
}Retrieve folders in the current space with pagination
| limit | integer Default: 10 limit |
| after | string after |
| name | string name filter |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "color": "#4F46E5",
- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk models",
- "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Create a new folder in the current space
Folder creation request
| color | string <= 40 characters Color is a design-token name (see model.Folder). Bounded so it cannot take
an arbitrary blob; the shape itself is still open, because there is no
palette to enumerate yet — a |
| description | string |
| name required | string <= 120 characters |
{- "color": "string",
- "description": "string",
- "name": "string"
}{- "color": "#4F46E5",
- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk models",
- "updated_at": "2026-01-15T10:30:00Z"
}File items into a folder, or unfile them by passing a null folder_id. Membership is exclusive, so the previous folder is simply replaced.
Items and destination folder
| folder_id | string |
| item_ids required | Array of strings [ 1 .. 200 ] items |
{- "folder_id": "string",
- "item_ids": [
- "string"
]
}{- "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "moved": 1
}Every folder with its item count, plus the unfiled and favorites buckets — the whole sidebar in one call. Counts are totals and do not follow the list filters.
| item_type | string Default: "data_profiles" Entity type to count |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders/summary" \ -H "x-api-key: $API_KEY"
{- "favorites_count": 8,
- "folders": [
- {
- "color": "#4F46E5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "item_count": 8,
- "name": "churn-propensity-v3"
}
], - "item_type": "example",
- "total": 1,
- "unfiled_count": 8
}Delete a folder by ID. Its contents are moved back to Unfiled, and the response reports how many.
| id required | string Folder ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "unfiled_count": 8
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders/{id}" \ -H "x-api-key: $API_KEY"
{- "color": "#4F46E5",
- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk models",
- "updated_at": "2026-01-15T10:30:00Z"
}Update a folder by ID
| id required | string Folder ID |
Folder update request
| color | string <= 40 characters |
| description | string |
| name | string <= 120 characters |
{- "color": "string",
- "description": "string",
- "name": "string"
}{- "color": "#4F46E5",
- "created_at": "2026-01-15T10:30:00Z",
- "description": "Scores the active customer base every morning.",
- "id": "fld_1a2b3c4d5e6f708192a3b4c5",
- "name": "Risk models",
- "updated_at": "2026-01-15T10:30:00Z"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "architecture": "example",
- "auto_batch_config": { },
- "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": { },
- "context_config": { },
- "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": { },
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": { },
- "endpoint": { },
- "engine_scaling": { },
- "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": { },
- "scaling": { },
- "schedule": { },
- "scheduled_batch": { },
- "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}
], - "has_more": false
}Body
| architecture | string <= 128 characters Architecture names which platform architecture the model was trained under, for a path/datavolume deploy that has NO checkpoint lineage. It supplies the inference config (rust image + tunables) AND the cortex image the GPU engines run in (always multi-version — the training cortex, never cortex-infer-gpu) — the provenance a lineage-free deploy otherwise lacks. Empty → the platform's current default architecture (the most recent cortex). Ignored for a checkpoint source (which resolves the architecture from the checkpoint's training lineage). |
object AutoBatchConfig is the batch-mode automation intent (input source + schedule
| |
| checkpoint_id | string |
| compile | boolean Compile is the torch.compile override for the backbone-bearing engine(s): the backbone (split) and fused roles. Tri-state (*bool) with a role-dependent default when omitted: the FUSED engine defaults ON, the split BACKBONE engine is opt-in (default eager — regional compile is a p99 tail on the online path). Send an explicit true/false to force on/off. The embedding engine stays eager regardless. Engine-only — it never reaches the context store. |
| compile_mode | string Enum: "regional" "max-autotune" CompileMode is the torch.compile mode used when Compile is on: "regional" (the default) or "max-autotune". "whole" is intentionally not offered (documented broken). |
object Connectors carries the server's optional input data integrations. It is no longer required — the output destination moved to the batch run — so a deploy that sends none (or only inputs) is accepted. | |
| cortex_image | string <= 512 characters CortexImage optionally overrides the GPU/training cortex image the engines run in (the multi-version main container) — a full image ref typed by hand for a path/datavolume deploy. Empty → the architecture's image. Ignored for a checkpoint source (which resolves the image from its training lineage). |
| data_model_id | string The lineage IDs are required only for the default checkpoint source; the lineage-free sources (path, datavolume) omit them. gin's required_unless takes a single value, so the "checkpoint source requires lineage" rule is enforced in the service Create instead (same rejection, better message) — the binding leaves them optional. |
| datavolume_name | string DataVolumeName is the neocore DataVolume to serve the model from, required when model_source is "datavolume". DataVolumeSubpath is the optional dir under its mount the model lives in (empty = the mount root). |
| datavolume_subpath | string |
object EmbeddingQuant is the optional TurboQuant embedding-quantization knob. Absent → no quantization (emitted configs are byte-identical to before). Only online/hybrid deploys carry it (folded into the model fingerprint across the engines + context store + server). Scheme/Bits/Seed/Rounds default server-side when omitted; Enabled defaults false. | |
object Endpoint optionally fixes the online server's client-facing external port at deploy (online/hybrid only): a specific port or a range to draw one from. Absent → neocore auto-allocates. Persisted as the server's desired port and pinned when the online HTTP server is brought up. | |
object EngineScaling is the optional autoscaling config for the GPU engine tier (embedding + backbone). Absent → fixed single-replica engine jobs. | |
object EngineYaml carries optional per-role user-edited engine config documents — the advanced "edit engine YAML" deploy mode — keyed by engine role: "embedding"/"backbone" for a split server, "fused" for a fused server. For each role present, the engine job mounts the user's document with the platform-managed engine fields (model dir, embed_dtype, transport wiring, embedding_quant) deep-merged OVER it, so the operator can't break serving. Roles not present (or an empty string / absent map) fall back to the field-derived config — byte-identical to a deploy made before this knob existed. Malformed YAML → 400. Unknown role keys → 400. | |
| inference_type required | string Enum: "batch" "online" |
| inference_version | string <= 128 characters InferenceVersion overrides the cortex-infer image tag (tag only, e.g. "v0.0.8"); empty = the architecture's tag (latest). Validated tag-only in the service. |
| instances | integer |
| mode | string Enum: "online" "batch" "hybrid" |
| model_path | string ModelPath is the operator-supplied absolute model dir, required when model_source is "path". Must be under a shared volume (/shared or /mnt/fss). |
| model_source | string Enum: "checkpoint" "path" "datavolume" ModelSource selects where the served model dir comes from: "checkpoint" (the default; empty is treated as checkpoint) resolves the data-model / training / checkpoint lineage, "path" serves ModelPath directly (no lineage), or "datavolume" serves a dir under a neocore DataVolume's mount (no lineage). |
object Scaling is the optional autoscaling config for an online endpoint. Absent → a fixed fleet sized by Instances. | |
object (model.InferenceServerSchedule) | |
object ScheduledBatch is the stepper config a batch-mode server reuses on each scheduled fire (rolling window). The schedule lives in Schedule. | |
| space required | string |
| tag | string |
| topology | string Enum: "split" "fused" Topology selects the online engine layout: "split" (default; empty = split) runs the embedding + backbone pair, "fused" runs one fused engine. Fused is online/hybrid only — the service rejects it for a batch-only server. |
| training_id | string |
| weight_load | string Enum: "standard" "legacy" WeightLoad selects the engine checkpoint-head load path: "standard" (default) or "legacy" (pre-refactor checkpoints, older head layout). Absent → standard. Engine-only: it reaches both GPU engine roles on every deploy type and never the context store. |
{- "architecture": "string",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "string",
- "integration_id": "string",
- "integration_name": "string",
- "path": "string"
}, - "no_new_files_behavior": "string",
- "schedule": {
- "active_between": {
- "end": "string",
- "start": "string"
}, - "recurrence": {
- "by_week_day": [
- "string"
], - "frequency": "string",
- "interval": 0,
- "time_of_day": "string"
}, - "termination": {
- "count": 0,
- "mode": "string",
- "until": "string"
}, - "timezone": "string"
}
}, - "checkpoint_id": "string",
- "compile": true,
- "compile_mode": "regional",
- "connectors": {
- "inputs": [
- {
- "connector_id": "string",
- "hive_partition": "string",
- "path": "string"
}
]
}, - "cortex_image": "string",
- "data_model_id": "string",
- "datavolume_name": "string",
- "datavolume_subpath": "string",
- "embedding_quant": {
- "bits": 0,
- "enabled": true,
- "rounds": 0,
- "scheme": "string",
- "seed": 0
}, - "endpoint": {
- "port": 1,
- "range": {
- "max": 1,
- "min": 1
}
}, - "engine_scaling": {
- "backbone": {
- "max": 0,
- "min": 0
}, - "embedding": {
- "max": 0,
- "min": 0
}, - "fused": {
- "max": 0,
- "min": 0
}, - "max": 0,
- "min": 0
}, - "engine_yaml": {
- "property1": "string",
- "property2": "string"
}, - "inference_type": "batch",
- "inference_version": "string",
- "instances": 0,
- "mode": "online",
- "model_path": "string",
- "model_source": "checkpoint",
- "scaling": {
- "cooldown_seconds": 0,
- "max": 0,
- "min": 0,
- "target_concurrency": 0
}, - "schedule": {
- "active_between": {
- "end": "string",
- "start": "string"
}, - "recurrence": {
- "by_week_day": [
- "string"
], - "frequency": "string",
- "interval": 0,
- "time_of_day": "string"
}, - "termination": {
- "count": 0,
- "mode": "string",
- "until": "string"
}, - "timezone": "string"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "string"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": true,
- "infer_every_event": true,
- "infer_target_date": "string",
- "logits_only": true,
- "omit_predictions_json": true,
- "save_logits": true,
- "use_context": true
}, - "pool": {
- "file_connector_id": "string",
- "file_path": "string",
- "reference_dataset_ids": [
- "string"
]
}, - "window": {
- "count": 0,
- "end": "string",
- "mode": "string",
- "start": "string",
- "unit": "string"
}
}, - "space": "string",
- "tag": "string",
- "topology": "split",
- "training_id": "string",
- "weight_load": "standard"
}{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}Renders the engine config document(s) the platform would generate for the given deploy request, keyed by engine role ("embedding"+"backbone" for split, "fused" for fused), with the platform-managed engine fields shown as readable placeholders. Creates nothing — used to pre-fill the advanced engine-YAML editor.
| spaceId required | string Space id |
Deploy payload
| architecture | string <= 128 characters Architecture names which platform architecture the model was trained under, for a path/datavolume deploy that has NO checkpoint lineage. It supplies the inference config (rust image + tunables) AND the cortex image the GPU engines run in (always multi-version — the training cortex, never cortex-infer-gpu) — the provenance a lineage-free deploy otherwise lacks. Empty → the platform's current default architecture (the most recent cortex). Ignored for a checkpoint source (which resolves the architecture from the checkpoint's training lineage). |
object AutoBatchConfig is the batch-mode automation intent (input source + schedule
| |
| checkpoint_id | string |
| compile | boolean Compile is the torch.compile override for the backbone-bearing engine(s): the backbone (split) and fused roles. Tri-state (*bool) with a role-dependent default when omitted: the FUSED engine defaults ON, the split BACKBONE engine is opt-in (default eager — regional compile is a p99 tail on the online path). Send an explicit true/false to force on/off. The embedding engine stays eager regardless. Engine-only — it never reaches the context store. |
| compile_mode | string Enum: "regional" "max-autotune" CompileMode is the torch.compile mode used when Compile is on: "regional" (the default) or "max-autotune". "whole" is intentionally not offered (documented broken). |
object Connectors carries the server's optional input data integrations. It is no longer required — the output destination moved to the batch run — so a deploy that sends none (or only inputs) is accepted. | |
| cortex_image | string <= 512 characters CortexImage optionally overrides the GPU/training cortex image the engines run in (the multi-version main container) — a full image ref typed by hand for a path/datavolume deploy. Empty → the architecture's image. Ignored for a checkpoint source (which resolves the image from its training lineage). |
| data_model_id | string The lineage IDs are required only for the default checkpoint source; the lineage-free sources (path, datavolume) omit them. gin's required_unless takes a single value, so the "checkpoint source requires lineage" rule is enforced in the service Create instead (same rejection, better message) — the binding leaves them optional. |
| datavolume_name | string DataVolumeName is the neocore DataVolume to serve the model from, required when model_source is "datavolume". DataVolumeSubpath is the optional dir under its mount the model lives in (empty = the mount root). |
| datavolume_subpath | string |
object EmbeddingQuant is the optional TurboQuant embedding-quantization knob. Absent → no quantization (emitted configs are byte-identical to before). Only online/hybrid deploys carry it (folded into the model fingerprint across the engines + context store + server). Scheme/Bits/Seed/Rounds default server-side when omitted; Enabled defaults false. | |
object Endpoint optionally fixes the online server's client-facing external port at deploy (online/hybrid only): a specific port or a range to draw one from. Absent → neocore auto-allocates. Persisted as the server's desired port and pinned when the online HTTP server is brought up. | |
object EngineScaling is the optional autoscaling config for the GPU engine tier (embedding + backbone). Absent → fixed single-replica engine jobs. | |
object EngineYaml carries optional per-role user-edited engine config documents — the advanced "edit engine YAML" deploy mode — keyed by engine role: "embedding"/"backbone" for a split server, "fused" for a fused server. For each role present, the engine job mounts the user's document with the platform-managed engine fields (model dir, embed_dtype, transport wiring, embedding_quant) deep-merged OVER it, so the operator can't break serving. Roles not present (or an empty string / absent map) fall back to the field-derived config — byte-identical to a deploy made before this knob existed. Malformed YAML → 400. Unknown role keys → 400. | |
| inference_type required | string Enum: "batch" "online" |
| inference_version | string <= 128 characters InferenceVersion overrides the cortex-infer image tag (tag only, e.g. "v0.0.8"); empty = the architecture's tag (latest). Validated tag-only in the service. |
| instances | integer |
| mode | string Enum: "online" "batch" "hybrid" |
| model_path | string ModelPath is the operator-supplied absolute model dir, required when model_source is "path". Must be under a shared volume (/shared or /mnt/fss). |
| model_source | string Enum: "checkpoint" "path" "datavolume" ModelSource selects where the served model dir comes from: "checkpoint" (the default; empty is treated as checkpoint) resolves the data-model / training / checkpoint lineage, "path" serves ModelPath directly (no lineage), or "datavolume" serves a dir under a neocore DataVolume's mount (no lineage). |
object Scaling is the optional autoscaling config for an online endpoint. Absent → a fixed fleet sized by Instances. | |
object (model.InferenceServerSchedule) | |
object ScheduledBatch is the stepper config a batch-mode server reuses on each scheduled fire (rolling window). The schedule lives in Schedule. | |
| space required | string |
| tag | string |
| topology | string Enum: "split" "fused" Topology selects the online engine layout: "split" (default; empty = split) runs the embedding + backbone pair, "fused" runs one fused engine. Fused is online/hybrid only — the service rejects it for a batch-only server. |
| training_id | string |
| weight_load | string Enum: "standard" "legacy" WeightLoad selects the engine checkpoint-head load path: "standard" (default) or "legacy" (pre-refactor checkpoints, older head layout). Absent → standard. Engine-only: it reaches both GPU engine roles on every deploy type and never the context store. |
{- "architecture": "string",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "string",
- "integration_id": "string",
- "integration_name": "string",
- "path": "string"
}, - "no_new_files_behavior": "string",
- "schedule": {
- "active_between": {
- "end": "string",
- "start": "string"
}, - "recurrence": {
- "by_week_day": [
- "string"
], - "frequency": "string",
- "interval": 0,
- "time_of_day": "string"
}, - "termination": {
- "count": 0,
- "mode": "string",
- "until": "string"
}, - "timezone": "string"
}
}, - "checkpoint_id": "string",
- "compile": true,
- "compile_mode": "regional",
- "connectors": {
- "inputs": [
- {
- "connector_id": "string",
- "hive_partition": "string",
- "path": "string"
}
]
}, - "cortex_image": "string",
- "data_model_id": "string",
- "datavolume_name": "string",
- "datavolume_subpath": "string",
- "embedding_quant": {
- "bits": 0,
- "enabled": true,
- "rounds": 0,
- "scheme": "string",
- "seed": 0
}, - "endpoint": {
- "port": 1,
- "range": {
- "max": 1,
- "min": 1
}
}, - "engine_scaling": {
- "backbone": {
- "max": 0,
- "min": 0
}, - "embedding": {
- "max": 0,
- "min": 0
}, - "fused": {
- "max": 0,
- "min": 0
}, - "max": 0,
- "min": 0
}, - "engine_yaml": {
- "property1": "string",
- "property2": "string"
}, - "inference_type": "batch",
- "inference_version": "string",
- "instances": 0,
- "mode": "online",
- "model_path": "string",
- "model_source": "checkpoint",
- "scaling": {
- "cooldown_seconds": 0,
- "max": 0,
- "min": 0,
- "target_concurrency": 0
}, - "schedule": {
- "active_between": {
- "end": "string",
- "start": "string"
}, - "recurrence": {
- "by_week_day": [
- "string"
], - "frequency": "string",
- "interval": 0,
- "time_of_day": "string"
}, - "termination": {
- "count": 0,
- "mode": "string",
- "until": "string"
}, - "timezone": "string"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "string"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": true,
- "infer_every_event": true,
- "infer_target_date": "string",
- "logits_only": true,
- "omit_predictions_json": true,
- "save_logits": true,
- "use_context": true
}, - "pool": {
- "file_connector_id": "string",
- "file_path": "string",
- "reference_dataset_ids": [
- "string"
]
}, - "window": {
- "count": 0,
- "end": "string",
- "mode": "string",
- "start": "string",
- "unit": "string"
}
}, - "space": "string",
- "tag": "string",
- "topology": "split",
- "training_id": "string",
- "weight_load": "standard"
}{- "configs": { }
}| id required | string Inference server ID |
Body (status canceled = undeploy; running = activate, may persist as awaiting_inference when instances is 0)
| status required | string Enum: "canceled" "running" canceled: soft undeploy. running: activate (stored as running or awaiting_inference when instances is 0). |
{- "status": "canceled"
}{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}| id required | string Inference server ID |
Body
| architecture | string <= 128 characters Architecture names which platform architecture the model was trained under, for a path/datavolume deploy that has NO checkpoint lineage. It supplies the inference config (rust image + tunables) AND the cortex image the GPU engines run in (always multi-version — the training cortex, never cortex-infer-gpu) — the provenance a lineage-free deploy otherwise lacks. Empty → the platform's current default architecture (the most recent cortex). Ignored for a checkpoint source (which resolves the architecture from the checkpoint's training lineage). |
object AutoBatchConfig is the batch-mode automation intent (input source + schedule
| |
| checkpoint_id | string |
| compile | boolean Compile is the torch.compile override for the backbone-bearing engine(s): the backbone (split) and fused roles. Tri-state (*bool) with a role-dependent default when omitted: the FUSED engine defaults ON, the split BACKBONE engine is opt-in (default eager — regional compile is a p99 tail on the online path). Send an explicit true/false to force on/off. The embedding engine stays eager regardless. Engine-only — it never reaches the context store. |
| compile_mode | string Enum: "regional" "max-autotune" CompileMode is the torch.compile mode used when Compile is on: "regional" (the default) or "max-autotune". "whole" is intentionally not offered (documented broken). |
object Connectors carries the server's optional input data integrations. It is no longer required — the output destination moved to the batch run — so a deploy that sends none (or only inputs) is accepted. | |
| cortex_image | string <= 512 characters CortexImage optionally overrides the GPU/training cortex image the engines run in (the multi-version main container) — a full image ref typed by hand for a path/datavolume deploy. Empty → the architecture's image. Ignored for a checkpoint source (which resolves the image from its training lineage). |
| data_model_id | string The lineage IDs are required only for the default checkpoint source; the lineage-free sources (path, datavolume) omit them. gin's required_unless takes a single value, so the "checkpoint source requires lineage" rule is enforced in the service Create instead (same rejection, better message) — the binding leaves them optional. |
| datavolume_name | string DataVolumeName is the neocore DataVolume to serve the model from, required when model_source is "datavolume". DataVolumeSubpath is the optional dir under its mount the model lives in (empty = the mount root). |
| datavolume_subpath | string |
object EmbeddingQuant is the optional TurboQuant embedding-quantization knob. Absent → no quantization (emitted configs are byte-identical to before). Only online/hybrid deploys carry it (folded into the model fingerprint across the engines + context store + server). Scheme/Bits/Seed/Rounds default server-side when omitted; Enabled defaults false. | |
object Endpoint optionally fixes the online server's client-facing external port at deploy (online/hybrid only): a specific port or a range to draw one from. Absent → neocore auto-allocates. Persisted as the server's desired port and pinned when the online HTTP server is brought up. | |
object EngineScaling is the optional autoscaling config for the GPU engine tier (embedding + backbone). Absent → fixed single-replica engine jobs. | |
object EngineYaml carries optional per-role user-edited engine config documents — the advanced "edit engine YAML" deploy mode — keyed by engine role: "embedding"/"backbone" for a split server, "fused" for a fused server. For each role present, the engine job mounts the user's document with the platform-managed engine fields (model dir, embed_dtype, transport wiring, embedding_quant) deep-merged OVER it, so the operator can't break serving. Roles not present (or an empty string / absent map) fall back to the field-derived config — byte-identical to a deploy made before this knob existed. Malformed YAML → 400. Unknown role keys → 400. | |
| inference_type required | string Enum: "batch" "online" |
| inference_version | string <= 128 characters InferenceVersion overrides the cortex-infer image tag (tag only, e.g. "v0.0.8"); empty = the architecture's tag (latest). Validated tag-only in the service. |
| instances | integer |
| mode | string Enum: "online" "batch" "hybrid" |
| model_path | string ModelPath is the operator-supplied absolute model dir, required when model_source is "path". Must be under a shared volume (/shared or /mnt/fss). |
| model_source | string Enum: "checkpoint" "path" "datavolume" ModelSource selects where the served model dir comes from: "checkpoint" (the default; empty is treated as checkpoint) resolves the data-model / training / checkpoint lineage, "path" serves ModelPath directly (no lineage), or "datavolume" serves a dir under a neocore DataVolume's mount (no lineage). |
object Scaling is the optional autoscaling config for an online endpoint. Absent → a fixed fleet sized by Instances. | |
object (model.InferenceServerSchedule) | |
object ScheduledBatch is the stepper config a batch-mode server reuses on each scheduled fire (rolling window). The schedule lives in Schedule. | |
| space required | string |
| tag | string |
| topology | string Enum: "split" "fused" Topology selects the online engine layout: "split" (default; empty = split) runs the embedding + backbone pair, "fused" runs one fused engine. Fused is online/hybrid only — the service rejects it for a batch-only server. |
| training_id | string |
| weight_load | string Enum: "standard" "legacy" WeightLoad selects the engine checkpoint-head load path: "standard" (default) or "legacy" (pre-refactor checkpoints, older head layout). Absent → standard. Engine-only: it reaches both GPU engine roles on every deploy type and never the context store. |
{- "architecture": "string",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "string",
- "integration_id": "string",
- "integration_name": "string",
- "path": "string"
}, - "no_new_files_behavior": "string",
- "schedule": {
- "active_between": {
- "end": "string",
- "start": "string"
}, - "recurrence": {
- "by_week_day": [
- "string"
], - "frequency": "string",
- "interval": 0,
- "time_of_day": "string"
}, - "termination": {
- "count": 0,
- "mode": "string",
- "until": "string"
}, - "timezone": "string"
}
}, - "checkpoint_id": "string",
- "compile": true,
- "compile_mode": "regional",
- "connectors": {
- "inputs": [
- {
- "connector_id": "string",
- "hive_partition": "string",
- "path": "string"
}
]
}, - "cortex_image": "string",
- "data_model_id": "string",
- "datavolume_name": "string",
- "datavolume_subpath": "string",
- "embedding_quant": {
- "bits": 0,
- "enabled": true,
- "rounds": 0,
- "scheme": "string",
- "seed": 0
}, - "endpoint": {
- "port": 1,
- "range": {
- "max": 1,
- "min": 1
}
}, - "engine_scaling": {
- "backbone": {
- "max": 0,
- "min": 0
}, - "embedding": {
- "max": 0,
- "min": 0
}, - "fused": {
- "max": 0,
- "min": 0
}, - "max": 0,
- "min": 0
}, - "engine_yaml": {
- "property1": "string",
- "property2": "string"
}, - "inference_type": "batch",
- "inference_version": "string",
- "instances": 0,
- "mode": "online",
- "model_path": "string",
- "model_source": "checkpoint",
- "scaling": {
- "cooldown_seconds": 0,
- "max": 0,
- "min": 0,
- "target_concurrency": 0
}, - "schedule": {
- "active_between": {
- "end": "string",
- "start": "string"
}, - "recurrence": {
- "by_week_day": [
- "string"
], - "frequency": "string",
- "interval": 0,
- "time_of_day": "string"
}, - "termination": {
- "count": 0,
- "mode": "string",
- "until": "string"
}, - "timezone": "string"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "string"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": true,
- "infer_every_event": true,
- "infer_target_date": "string",
- "logits_only": true,
- "omit_predictions_json": true,
- "save_logits": true,
- "use_context": true
}, - "pool": {
- "file_connector_id": "string",
- "file_path": "string",
- "reference_dataset_ids": [
- "string"
]
}, - "window": {
- "count": 0,
- "end": "string",
- "mode": "string",
- "start": "string",
- "unit": "string"
}
}, - "space": "string",
- "tag": "string",
- "topology": "split",
- "training_id": "string",
- "weight_load": "standard"
}Persist how much cached context the online endpoint keeps per user.
| id required | string Inference server ID |
Context configuration
| enabled | boolean |
| lookback_window | string |
| max_len | integer |
| min_context | integer |
| mismatch_strategy | string |
{- "enabled": true,
- "lookback_window": "string",
- "max_len": 0,
- "min_context": 0,
- "mismatch_strategy": "string"
}{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}Throughput, latency and engine health for the server over a rolling window.
| id required | string Inference server ID |
| window | string Default: "1h" Dashboard window as a Go duration (e.g. 1h) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/dashboard" \ -H "x-api-key: $API_KEY"
{- "alerts": [
- {
- "action_href": "example",
- "code": "example",
- "message": "Example message",
- "severity": "example",
- "title": "example"
}
], - "engines": {
- "backbone": {
- "cpu_percent": 0.5,
- "gpu_memory_gb": 0.5,
- "gpu_percent": 0.5,
- "inflight": 0.5,
- "latency_forward_ms": 0.5,
- "latency_total_ms": 0.5,
- "mem_percent": 0.5,
- "queue_depth": 0.5,
- "role": "example",
- "state": "PENDING",
- "status_reason": "Example message",
- "throughput_rps": 0.5,
- "time_series": { }
}, - "embedding": {
- "cpu_percent": 0.5,
- "gpu_memory_gb": 0.5,
- "gpu_percent": 0.5,
- "inflight": 0.5,
- "latency_forward_ms": 0.5,
- "latency_total_ms": 0.5,
- "mem_percent": 0.5,
- "queue_depth": 0.5,
- "role": "example",
- "state": "PENDING",
- "status_reason": "Example message",
- "throughput_rps": 0.5,
- "time_series": { }
}, - "fused": {
- "cpu_percent": 0.5,
- "gpu_memory_gb": 0.5,
- "gpu_percent": 0.5,
- "inflight": 0.5,
- "latency_forward_ms": 0.5,
- "latency_total_ms": 0.5,
- "mem_percent": 0.5,
- "queue_depth": 0.5,
- "role": "example",
- "state": "PENDING",
- "status_reason": "Example message",
- "throughput_rps": 0.5,
- "time_series": { }
}
}, - "kpis": {
- "avg_latency_ms": 0.5,
- "gpu_utilization": 0.5,
- "npu_count": 8,
- "status": "PENDING",
- "throughput_rps": 0.5,
- "uptime_sec": 1
}, - "online": {
- "error_rps": 0.5,
- "inflight": 0.5,
- "latency_p50_ms": 0.5,
- "latency_p95_ms": 0.5,
- "latency_p99_ms": 0.5,
- "rps": 0.5,
- "state": "PENDING",
- "status_reason": "Example message",
- "time_series": {
- "error_rps": [
- { }
], - "inflight": [
- { }
], - "latency_p50": [
- { }
], - "latency_p95": [
- { }
], - "latency_p99": [
- { }
], - "rps": [
- { }
]
}
}, - "recent_runs": [
- {
- "duration_sec": 1,
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "n_rows": 1,
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING"
}
], - "resources": {
- "cpu_percent": 0.5,
- "gpu_memory_gb": 0.5,
- "gpu_percent": 0.5,
- "mem_percent": 0.5
}, - "scaling": [
- {
- "conditions": [
- { }
], - "current_replicas": 1,
- "desired_replicas": 1,
- "last_decision": "example",
- "last_scale_time": "example",
- "lb": { },
- "max": 4,
- "members": [
- { }
], - "metric_stale": false,
- "min": 1,
- "observed_metric": 0.5,
- "ready_replicas": 1,
- "role": "example",
- "time_series": { }
}
], - "time_series": {
- "inflight": [
- { }
], - "latency_forward": [
- { }
], - "latency_total": [
- { }
], - "queue_depth": [
- { }
], - "throughput": [
- { }
]
}, - "window": "example"
}The score cut-offs the server applies when turning a prediction into a decision.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/decision-thresholds" \ -H "x-api-key: $API_KEY"
{- "targets": [
- {
- "best_threshold": 0.5,
- "target": "example"
}
]
}Renders each engine role's current effective engine config for an already-deployed server (folding in any persisted per-role override), with the platform-managed fields shown as placeholders. Pre-fills the reconfigure editor. Creates nothing.
| spaceId required | string Space id |
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/engine-config" \ -H "x-api-key: $API_KEY"
{- "configs": { }
}Applies per-role engine-config overrides to an already-provisioned server and recreates ONLY the reconfigured engine role(s) with the new config — a brief serving interruption on the affected tier. Managed fields are re-injected; unknown role / malformed YAML → 400.
| spaceId required | string Space id |
| id required | string Inference server ID |
Per-role engine YAML
object | |||
| |||
{- "engine_yaml": {
- "property1": "string",
- "property2": "string"
}
}{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}Bump one role's (embedding | backbone | server) ScalingGroup min/max replica bounds on demand. Floored to min >= 1, max >= min.
| id required | string Inference server ID |
| role required | string Role (embedding | backbone | server) |
New bounds
| max | integer |
| min | integer |
{- "max": 0,
- "min": 0
}{- "max": 4,
- "min": 1,
- "role": "example"
}The checkpoint the server serves, its parameter counts, and the input and target views a caller must fill.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/model" \ -H "x-api-key: $API_KEY"
{- "info": {
- "backbone_dim": 1,
- "checkpoint": "example",
- "engine_params": 1,
- "input_keys": [
- "REDACTED"
], - "kind": "example",
- "target_keys": [
- "REDACTED"
], - "total_params": 1
}, - "input_views": [
- {
- "cat_cols": [
- "example"
], - "client_id_col": "example",
- "event_ts_col": "example",
- "key": "REDACTED",
- "label": "example",
- "n_cat": 1,
- "n_num": 1,
- "n_str": 1,
- "n_ts": 1,
- "num_cols": [
- "example"
], - "real_id_cols": [
- "example"
], - "role": "example",
- "str_cols": [
- "example"
], - "ts_cols": [
- "example"
], - "use_real_id_as_feature": false,
- "vocab_samples": [
- [
- "example"
]
], - "vocab_sizes": [
- 1
]
}
], - "target_views": [
- {
- "cat_cols": [
- "example"
], - "client_id_col": "example",
- "event_ts_col": "example",
- "key": "REDACTED",
- "label": "example",
- "n_cat": 1,
- "n_num": 1,
- "n_str": 1,
- "n_ts": 1,
- "num_cols": [
- "example"
], - "real_id_cols": [
- "example"
], - "role": "example",
- "str_cols": [
- "example"
], - "ts_cols": [
- "example"
], - "use_real_id_as_feature": false,
- "vocab_samples": [
- [
- "example"
]
], - "vocab_sizes": [
- 1
]
}
]
}The model's tensor/shard layout as published by the engine, forwarded verbatim.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/model/layout" \ -H "x-api-key: $API_KEY"
{ }Set the drift and quality monitoring the server runs against its own traffic.
| id required | string Inference server ID |
Monitoring settings
| critical_ks_d required | number <= 1 |
object (request.ConfigureDecisionThresholdRequest) | |
| warn_ks_d required | number <= 1 |
{- "critical_ks_d": 1,
- "decision_threshold": {
- "target": "string",
- "threshold": 0
}, - "warn_ks_d": 1
}{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}Bring up the online (synchronous) inference endpoint. Accepted immediately; the server reports READY through its status.
| id required | string Inference server ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}The URL and credentials a client needs to call the online endpoint.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server/connection" \ -H "x-api-key: $API_KEY"
{- "health_check": {
- "interval_seconds": 1,
- "path": "/datasets/transactions",
- "port": 1,
- "protocol": "example",
- "timeout_seconds": 1
}, - "http_endpoint": {
- "backend": "example",
- "external_host": "example",
- "name": "churn-propensity-v3",
- "node_port": 2,
- "protocol": "example",
- "service_dns": "example",
- "target_port": 1
}, - "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "job_name": "churn-propensity-v3",
- "leader_task": "example",
- "metrics_endpoint": {
- "backend": "example",
- "external_host": "example",
- "name": "churn-propensity-v3",
- "node_port": 2,
- "protocol": "example",
- "service_dns": "example",
- "target_port": 1
}, - "node_ip": "example",
- "node_name": "churn-propensity-v3"
}Per-role (embedding | backbone | server) replica counts and readiness, forwarded from the scaling groups.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server/replicas" \ -H "x-api-key: $API_KEY"
{ }Tear the online endpoint down and release its engine replicas.
| id required | string Inference server ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server/stop" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "auto_batch_config": {
- "enabled": true,
- "input_source": {
- "bucket": "example",
- "integration_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "integration_name": "churn-propensity-v3",
- "path": "/datasets/transactions"
}, - "no_new_files_behavior": "example",
- "schedule": {
- "active_between": { },
- "recurrence": { },
- "termination": { },
- "timezone": "UTC"
}
}, - "checkpoint": 1,
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "compile": false,
- "compile_mode": "example",
- "connectors": {
- "inputs": [
- { }
]
}, - "context_config": {
- "enabled": true,
- "lookback_window": "example",
- "max_len": 4,
- "min_context": 1,
- "mismatch_strategy": "example"
}, - "cortex_image": "registry.example.com/image:tag",
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3"
}, - "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "datavolume_name": "shared-datasets",
- "datavolume_subpath": "transactions/2026-01",
- "desired_endpoint_port": 1,
- "embedding_quant": {
- "bits": 1,
- "enabled": true,
- "rounds": 1,
- "scheme": "example",
- "seed": 1
}, - "endpoint": {
- "external_host": "example",
- "listen_port": 1,
- "protocol": "example"
}, - "engine_scaling": {
- "backbone": {
- "max": 4,
- "min": 1
}, - "embedding": {
- "max": 4,
- "min": 1
}, - "fused": {
- "max": 4,
- "min": 1
}, - "max": 4,
- "min": 1
}, - "engine_yaml": { },
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_type": "example",
- "inference_version": "1.0.0",
- "instances": 1,
- "job_state_reasons": { },
- "job_states": { },
- "last_deployed_at": "2026-01-15T10:30:00Z",
- "mode": "example",
- "model_dir": "/datasets/transactions",
- "model_path": "/datasets/transactions",
- "model_source": "example",
- "monitoring_settings": {
- "decision_thresholds": [
- { }
], - "model_drift": {
- "critical_ks_d": 0.5,
- "warn_ks_d": 0.5
}
}, - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target_concurrency": 1
}, - "schedule": {
- "active_between": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "recurrence": {
- "by_week_day": [
- "example"
], - "frequency": "example",
- "interval": 1,
- "time_of_day": "example"
}, - "termination": {
- "count": 8,
- "mode": "example",
- "until": "example"
}, - "timezone": "UTC"
}, - "scheduled_batch": {
- "event_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "flags": {
- "eos_inference_mode": "every_token",
- "include_all_probs": false,
- "infer_every_event": false,
- "infer_target_date": "example",
- "logits_only": false,
- "omit_predictions_json": false,
- "save_logits": false,
- "use_context": false
}, - "pool": {
- "file_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
- "file_path": "/datasets/transactions",
- "reference_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
]
}, - "window": {
- "count": 8,
- "end": "2026-03-31T23:59:59Z",
- "mode": "example",
- "start": "2026-01-01T00:00:00Z",
- "unit": "example"
}
}, - "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tag": "example",
- "topology": "example",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z",
- "weight_load": "example"
}Run one inference against the live endpoint and return the raw response, for smoke-testing a deploy.
| id required | string Inference server ID |
Test inference payload
| body required | Array of integers |
| path required | string |
{- "body": [
- 0
], - "path": "string"
}{- "body": [
- 1
], - "body_text": "example",
- "elapsed_ms": 1,
- "status": 1,
- "truncated": false
}| id required | string Inference server ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/resume" \ -H "x-api-key: $API_KEY"
Renders the cortex-batch-infer recipe the platform would generate for the given batch-run create request, with the platform-managed fields shown as readable placeholders. Creates nothing — used to pre-fill the advanced-YAML editor.
| spaceId required | string Space id |
| id required | string Inference server id |
Batch run create payload
object AnchorSource scores each client at the positions named by a dataset/file instead of at a
single date (cortex | |
| checkpoint_id | string CheckpointID scores with a checkpoint directly — no inference server, nothing deployed. Ignored when the route already carries a server id. |
| event_dataset_ids | Array of strings EventDatasetIDs are the registered datasets feeding the model input views. It may be empty when every view is instead fed by a local dataset below; full per-view coverage (registered OR local) is enforced in the service, so there is no min=1 binding here. |
object EventDatasetShifts optionally overrides the per-dataset temporal shift, keyed by
the dataset id (registered) or the local dataset_key. Absent keys inherit the
shift the dataset was trained with; a present key wins, and an explicit empty
string clears it (score with no offset). Same string encoding as the training
shift ("1h" or " | |
Array of objects (request.CreateBatchInferenceLocalDataset) EventDatasetsLocal are event datasets fed by absolute path or neocore DataVolume rather than a registered dataset id. Each covers the model input view named by its dataset_key, so a run can be driven entirely from local paths; a run with none stays byte-identical. Appended to the id-resolved event datasets. | |
object (request.CreateBatchInferenceFlagsBody) | |
| inference_version | string <= 128 characters InferenceVersion pins the TAG of the cortex-infer image this run uses (e.g. "v0.0.9"): the carrier init container injects that image's engines/ into the ranks, and the publish step runs its binary. Empty = the architecture's tag. It does NOT change the model image — the ranks run the cortex image the checkpoint was trained with, chosen by the checkpoint and never by an operator here. |
object Output optionally sets where this run's writer publishes predictions. ConnectorID set → an output connector (aws-s3 / aws-s3-instance-profile / oracle_s3 / oracle_instance_principal / local) at Path; empty ConnectorID + non-empty Path → a raw shared-filesystem path; both empty → the auto-derived run output dir (current behavior). Mirrors the deploy-time output-destination shape. | |
object Parallelism fans the run out into N independent data shards (bucket-shard i/N), each a driver + its own output writer, mirroring the hand-run sharded batch. Nil or shards<=1 runs the single-driver path (byte-identical to before). | |
object (request.CreateBatchInferencePool) | |
| recipe_yaml | string RecipeYaml, when set, is a full user-edited cortex-batch-infer recipe document used as the run's recipe instead of the field-derived one — the advanced "YAML" mode. The field-derived recipe knobs are ignored (the YAML wins for non-managed keys), but the datasets/pool/output are still resolved the normal way to drive the job wiring (managed fields + volumes). The platform re-injects its managed fields over it at submit so the user can't break the wiring. Malformed YAML → 400. Empty = the field-derived recipe (byte-identical to the stepper path). |
required | object (request.CreateBatchInferenceTimeRange) |
{- "anchor_source": {
- "dataset_ids": [
- "string"
], - "datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "extend_to_cover": true,
- "ts_col": "string"
}, - "checkpoint_id": "string",
- "event_dataset_ids": [
- "string"
], - "event_dataset_shifts": {
- "property1": "string",
- "property2": "string"
}, - "event_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "flags": {
- "eos_inference_mode": "string",
- "include_all_probs": true,
- "infer_every_event": true,
- "infer_target_date": "string",
- "logits_only": true,
- "omit_predictions_json": true,
- "save_logits": true,
- "use_context": true
}, - "inference_version": "string",
- "output": {
- "connector_id": "string",
- "path": "string"
}, - "parallelism": {
- "concurrency": 1,
- "group_workers": 1,
- "shard_workers": 1,
- "shards": 1
}, - "pool": {
- "file_source": {
- "as_of_last_event": true,
- "connector_id": "string",
- "path": "string"
}, - "filter_dataset_ids": [
- "string"
], - "filter_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
], - "reference_dataset_ids": [
- "string"
], - "reference_datasets_local": [
- {
- "connector_id": "string",
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
]
}, - "recipe_yaml": "string",
- "time_range": {
- "end": "string",
- "start": "string"
}
}{- "recipe_yaml": "example"
}Destructive: wipes every cached context for the server.
| id required | string Inference server ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store" \ -H "x-api-key: $API_KEY"
{ }| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/builds" \ -H "x-api-key: $API_KEY"
{ }Spawns one embedding-cache build job per dataset to populate the server's context store.
| id required | string Inference server ID |
Build configuration
Array of objects (request.ContextStoreBuildDatasetItem) | |
Array of objects (request.ContextStoreBuildLocalDatasetItem) |
{- "datasets": [
- {
- "chunk_size": 0,
- "dataset_id": "string",
- "dataset_key": "string"
}
], - "datasets_local": [
- {
- "chunk_size": 0,
- "dataset_key": "string",
- "datavolume_name": "string",
- "dir": "string",
- "subpath": "string"
}
]
}{- "build_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "datasets": [
- {
- "dataset_key": "transactions",
- "job_name": "churn-propensity-v3",
- "reason": "Example message",
- "state": "PENDING"
}
], - "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "status": "PENDING"
}Proxies the context-store daemon's stats verbatim.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/occupancy" \ -H "x-api-key: $API_KEY"
{ }Proxies the context-store daemon's user listing verbatim; the query string is forwarded as-is.
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/users" \ -H "x-api-key: $API_KEY"
{ }Proxies the context-store daemon's per-user context verbatim.
| id required | string Inference server ID |
| userId required | string User ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/users/{userId}" \ -H "x-api-key: $API_KEY"
{ }| spaceId required | string Space ID |
| id required | string Inference server ID |
| granularity | string Bucket granularity |
| start | string Range start (RFC3339) |
| end | string Range end (RFC3339) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift" \ -H "x-api-key: $API_KEY"
{- "baseline": { },
- "granularity": "example",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "targets": { }
}| spaceId required | string Space ID |
| id required | string Inference server ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/baseline/report" \ -H "x-api-key: $API_KEY"
{- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "mode": "example",
- "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "run_output_dir": "/datasets/transactions",
- "status": "PENDING",
- "status_reason": "Example message",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}| spaceId required | string Space ID |
| id required | string Inference server ID |
| limit | integer Page size |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/reports" \ -H "x-api-key: $API_KEY"
[- {
- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "mode": "example",
- "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "run_output_dir": "/datasets/transactions",
- "status": "PENDING",
- "status_reason": "Example message",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}
]| spaceId required | string Space ID |
| id required | string Inference server ID |
| runId required | string Batch inference run ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/runs/{runId}/report" \ -H "x-api-key: $API_KEY"
{- "checkpoint_id": "che_1a2b3c4d5e6f708192a3b4c5",
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "mode": "example",
- "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
- "run_output_dir": "/datasets/transactions",
- "status": "PENDING",
- "status_reason": "Example message",
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "updated_at": "2026-01-15T10:30:00Z"
}| spaceId required | string Space ID |
| id required | string Inference server ID |
| runId required | string Batch inference run ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/runs/{runId}/retry" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}| spaceId required | string Space ID |
| id required | string Inference server ID |
| target required | string Target name |
| column | string Column filter |
| class | string Class filter |
| granularity | string Bucket granularity |
| start | string Range start (RFC3339) |
| end | string Range end (RFC3339) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/targets/{target}" \ -H "x-api-key: $API_KEY"
{- "baseline": {
- "class": "example",
- "column": "event_ts",
- "created_at": "2026-01-15T10:30:00Z",
- "granularity": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "label": "example",
- "metrics": {
- "distribution": { },
- "drift": { },
- "migration": { },
- "volume": { }
}, - "mode": "example",
- "n_clients": 1,
- "n_rows": 1,
- "partial": false,
- "period": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "report_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "ruler": {
- "bands": [
- { }
], - "class_selection": "example",
- "classes": [
- "example"
], - "n_classes": 1,
- "vocab_offset": 1
}, - "score_column": "event_ts",
- "target": "example",
- "target_type": "example"
}, - "class": "example",
- "column": "event_ts",
- "periods": [
- {
- "class": "example",
- "column": "event_ts",
- "created_at": "2026-01-15T10:30:00Z",
- "granularity": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "label": "example",
- "metrics": { },
- "mode": "example",
- "n_clients": 1,
- "n_rows": 1,
- "partial": false,
- "period": { },
- "report_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "ruler": { },
- "score_column": "event_ts",
- "target": "example",
- "target_type": "example"
}
], - "target": "example"
}| spaceId required | string Space ID |
| id required | string Inference server ID |
| target required | string Target name |
| periodId required | string Drift period ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/targets/{target}/periods/{periodId}" \ -H "x-api-key: $API_KEY"
{- "baseline_full": {
- "class": "example",
- "column": "event_ts",
- "created_at": "2026-01-15T10:30:00Z",
- "granularity": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "label": "example",
- "metrics": {
- "distribution": { },
- "drift": { },
- "migration": { },
- "volume": { }
}, - "mode": "example",
- "n_clients": 1,
- "n_rows": 1,
- "partial": false,
- "period": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "report_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "ruler": {
- "bands": [
- { }
], - "class_selection": "example",
- "classes": [
- "example"
], - "n_classes": 1,
- "vocab_offset": 1
}, - "score_column": "event_ts",
- "target": "example",
- "target_type": "example"
}, - "profile_period": {
- "class": "example",
- "column": "event_ts",
- "created_at": "2026-01-15T10:30:00Z",
- "granularity": "example",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "label": "example",
- "metrics": {
- "distribution": { },
- "drift": { },
- "migration": { },
- "volume": { }
}, - "mode": "example",
- "n_clients": 1,
- "n_rows": 1,
- "partial": false,
- "period": {
- "end": "2026-03-31T23:59:59Z",
- "start": "2026-01-01T00:00:00Z"
}, - "report_id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "ruler": {
- "bands": [
- { }
], - "class_selection": "example",
- "classes": [
- "example"
], - "n_classes": 1,
- "vocab_offset": 1
}, - "score_column": "event_ts",
- "target": "example",
- "target_type": "example"
}, - "target": "example"
}| id required | string Inference server ID |
| limit | integer Page size |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/stress-runs" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "config": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "report": { },
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message"
}
], - "has_more": false
}| id required | string Inference server ID |
Stress run configuration
object (request.CreateStressRunBreaker) | |
| events_per_request | integer |
required | object |
required | Array of objects (request.CreateStressRunStage) non-empty |
| timeout_ms | integer |
| unique_field | string |
| warmup_s | integer |
{- "breaker": {
- "consecutive_bad_buckets": 0,
- "error_rate": 0
}, - "events_per_request": 0,
- "payload": {
- "property1": null,
- "property2": null
}, - "stages": [
- {
- "concurrency": 1,
- "duration_s": 1
}
], - "timeout_ms": 0,
- "unique_field": "string",
- "warmup_s": 0
}{- "config": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "report": { },
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/stress-runs/{id}" \ -H "x-api-key: $API_KEY"
{- "config": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "report": { },
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message"
}curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/stress-runs/{id}/cancel" \ -H "x-api-key: $API_KEY"
{- "config": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": "example",
- "finished_at": "2026-01-15T10:30:00Z",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
- "report": { },
- "started_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message"
}Best-effort tail of the stress job's logs; empty while the job runs healthy.
| id required | string Stress run ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/stress-runs/{id}/logs" \ -H "x-api-key: $API_KEY"
{ }Retrieve a paginated list of checkpoints grouped with their metrics for leaderboard display
| limit | integer Default: 10 Limit |
| after | string Cursor for pagination (checkpoint ID of last item, required with after_metric_value) |
| model_id | string Filter by model/checkpoint ID |
| benchmarks | Array of strings Filter by benchmark IDs (can be multiple) |
| trainings | Array of strings Filter by training IDs (can be multiple) |
| start_date | string Filter by start date (RFC3339 format, e.g., 2024-01-01T00:00:00Z) |
| end_date | string Filter by end date (RFC3339 format, e.g., 2024-12-31T23:59:59Z) |
| order_by_metric.metric_name | string Order by this metric name (requires dataset_name and target_name) |
| order_by_metric.dataset_name | string Dataset name for metric ordering (required when ordering by metric) |
| order_by_metric.target_name | string Target name for metric ordering (required when ordering by metric) |
| order_by_metric.after_metric_value | number Metric value of last item for cursor pagination (requires after param) |
| order_by_metric.direction | string Default: "desc" Order direction: asc or desc |
| name | string Filter by checkpoint name |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/leaderboards" \ -H "x-api-key: $API_KEY"
{- "data": [
- {
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "epoch": 1,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "metrics": [
- { }
], - "name": "churn-propensity-v3",
- "step": 1,
- "training_id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "training_name": "churn-propensity-v3"
}
], - "has_more": false
}| kind | string model_input or model_output |
| status | string draft or published |
| name | string name substring filter |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs" \ -H "x-api-key: $API_KEY"
{- "data": [
- {
- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": { },
- "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": { },
- "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}
]
}Create a new design model (input or output). The created_by
Create body
| data_preprocesses required | Array of strings |
| description | string <= 300 characters |
| kind required | string Enum: "model_input" "model_output" |
| name required | string <= 100 characters |
object TimeRanges is only required for model_input; model_output designs may omit it. |
{- "data_preprocesses": [
- "string"
], - "description": "string",
- "kind": "model_input",
- "name": "string",
- "time_ranges": {
- "test": [
- "string"
], - "train": [
- "string"
], - "val": [
- "string"
]
}
}{- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "name": "churn-propensity-v3"
}, - "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}Soft-deletes the design (stamps deleted_at). The row is kept
| id required | string Design model ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}" \ -H "x-api-key: $API_KEY"
{- "error": "example"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}" \ -H "x-api-key: $API_KEY"
{- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "name": "churn-propensity-v3"
}, - "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}Marks the design as archived. Archived designs remain in the
| id required | string Design model ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}/archive" \ -H "x-api-key: $API_KEY"
{- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "name": "churn-propensity-v3"
}, - "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}Persists config_snapshot on a draft design without changing
| id required | string Design model ID |
Snapshot body
required | object | ||
| |||
{- "config_snapshot": {
- "property1": null,
- "property2": null
}
}{- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "name": "churn-propensity-v3"
}, - "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}Flips a draft design to published, persists the snapshot and
| id required | string Design model ID |
Snapshot body
required | object | ||
| |||
{- "config_snapshot": {
- "property1": null,
- "property2": null
}
}{- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "name": "churn-propensity-v3"
}, - "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}Clears the archived flag, returning the design to its active
| id required | string Design model ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}/unarchive" \ -H "x-api-key: $API_KEY"
{- "archived_at": "2026-01-15T10:30:00Z",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "created_by": {
- "email": "someone@example.com",
- "name": "churn-propensity-v3"
}, - "data_preprocesses": [
- "example"
], - "description": "Scores the active customer base every morning.",
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kind": "model_input",
- "name": "churn-propensity-v3",
- "published_at": "2026-01-15T10:30:00Z",
- "status": "draft",
- "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "updated_at": "2026-01-15T10:30:00Z",
- "used_in_training": false
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints" \ -H "x-api-key: $API_KEY"
[- {
- "context_pool": {
- "chunk_tokens": 1,
- "enabled": true,
- "local_cpu_gb": 0.5,
- "transport": "example"
}, - "created_at": "2026-01-15T10:30:00Z",
- "deployed_at": "2026-01-15T10:30:00Z",
- "gpus_per_node": 2,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_context_tokens": 4,
- "name": "churn-propensity-v3",
- "nodes": 2,
- "pipeline_parallel": 1,
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "roles": [
- { }
], - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target": 0.5
}, - "served_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "served_model_name": "churn-propensity",
- "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tensor_parallel": 1,
- "topology": "example",
- "total_gpus": 8,
- "weights_format": "example"
}
]Deploys one configuration (weights format + profile) of a cataloged model. The chosen configuration is RE-VALIDATED against current cluster capacity before anything is created, so a plan that has gone stale is refused with 409 rather than deployed into a queue.
| spaceId required | string Space ID |
Endpoint configuration
| kv_offload | string KVOffload is how far the cache travels: off, offloading, lmcache, mooncake. StoreTopology applies only to the modes that share a pool, and says who owns its memory. |
| max_context_tokens | integer MaxContextTokens is the advertised context window. Optional (the model's own maximum applies), and not cosmetic: it shapes the cache reservation, so raising it can make an otherwise-deployable configuration stop fitting. |
| name required | string Name is the operator's label, unique within the space. |
| port | integer Port fixes the client-facing port; 0 lets neocore allocate one. A fixed port is reserved before any GPU is claimed, so an unavailable one fails the deploy instead of silently landing somewhere else. |
| profile_id required | string |
object (request.ModelEndpointScalingRequest) | |
| served_model_id | string ServedModelID or ServedModelName identifies the catalog entry; one is required. |
| served_model_name | string |
| shared_cache | boolean SharedCache overrides whether the endpoint runs a shared cross-machine KV pool. Left unset, the platform follows the machine boundary: a fleet that can place replicas on different machines (max > 1) pools its KV so scaling out shares the prefix cache instead of siloing it. Set false to force replica-local caching (economy, or a model with a known store gap); set true to demand it (refused if the model does not support the store). A pointer so "unset" and "false" are different instructions. |
| spec_decoding | boolean SpecDecoding requests the checkpoint's fused draft module. Refused when the chosen variant ships none, because the engine will not start when told to speculate with weights that cannot. |
| store_topology | string |
| strategy | string Strategy is the parallelism family. Must be one the model declares — and one its chosen variant does not exclude, since a fused release can carry kernels its siblings lack. |
| variant_id | string VariantID names the CHECKPOINT to serve. A weights format cannot identify one: two checkpoints of a model can share a precision and differ in release, publisher and draft module. WeightsFormat above stays for callers that predate variants and resolves to the model's only checkpoint at that precision. |
| weights_format required | string WeightsFormat and ProfileID are the picked cell. Both are required because a configuration is the pair — a format without a parallelism is not deployable, and defaulting either one would deploy something the operator did not choose. |
| weights_secret_name | string WeightsSecretName is the external secret that unlocks gated weights. Required only when the chosen variant is gated, and only the NAME travels — the credential itself is resolved on the node and never reaches the platform. |
{- "kv_offload": "string",
- "max_context_tokens": 0,
- "name": "string",
- "port": 0,
- "profile_id": "string",
- "scaling": {
- "cooldown_seconds": 0,
- "max": 0,
- "min": 0,
- "target": 0
}, - "served_model_id": "string",
- "served_model_name": "string",
- "shared_cache": true,
- "spec_decoding": true,
- "store_topology": "string",
- "strategy": "string",
- "variant_id": "string",
- "weights_format": "string",
- "weights_secret_name": "string"
}{- "context_pool": {
- "chunk_tokens": 1,
- "enabled": true,
- "local_cpu_gb": 0.5,
- "transport": "example"
}, - "created_at": "2026-01-15T10:30:00Z",
- "deployed_at": "2026-01-15T10:30:00Z",
- "gpus_per_node": 2,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_context_tokens": 4,
- "name": "churn-propensity-v3",
- "nodes": 2,
- "pipeline_parallel": 1,
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "roles": [
- {
- "current": 1,
- "desired": 1,
- "ready": 1,
- "reason": "Example message",
- "role": "example"
}
], - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target": 0.5
}, - "served_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "served_model_name": "churn-propensity",
- "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tensor_parallel": 1,
- "topology": "example",
- "total_gpus": 8,
- "weights_format": "example"
}Lists the staged weight sets and their progress. A deploy that is waiting on weights is answered here: a several-hundred-gigabyte fetch takes a long time, and "preparing, 40 GB so far" is a very different answer from an endpoint that will not start.
| spaceId required | string Space ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/weight-stages" \ -H "x-api-key: $API_KEY"
[- {
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "model_name": "churn-propensity",
- "size_gb": 0.5,
- "staged_at": "2026-01-15T10:30:00Z",
- "status": "PENDING",
- "status_reason": "Example message",
- "weights_format": "example"
}
]Tears down the serving fleet and the endpoint address, then removes the record. Teardown is best-effort per resource: a neocore failure is logged and the record is still removed, because an endpoint nobody can delete through the API is worse than a resource to clean up.
| spaceId required | string Space ID |
| id required | string Model endpoint ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}" \ -H "x-api-key: $API_KEY"
{ }| spaceId required | string Space ID |
| id required | string Model endpoint ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}" \ -H "x-api-key: $API_KEY"
{- "context_pool": {
- "chunk_tokens": 1,
- "enabled": true,
- "local_cpu_gb": 0.5,
- "transport": "example"
}, - "created_at": "2026-01-15T10:30:00Z",
- "deployed_at": "2026-01-15T10:30:00Z",
- "gpus_per_node": 2,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_context_tokens": 4,
- "name": "churn-propensity-v3",
- "nodes": 2,
- "pipeline_parallel": 1,
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "roles": [
- {
- "current": 1,
- "desired": 1,
- "ready": 1,
- "reason": "Example message",
- "role": "example"
}
], - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target": 0.5
}, - "served_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "served_model_name": "churn-propensity",
- "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tensor_parallel": 1,
- "topology": "example",
- "total_gpus": 8,
- "weights_format": "example"
}| spaceId required | string Space ID |
| id required | string Model endpoint ID |
| window | string Lookback window (e.g. 15m, 1h) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}/metrics" \ -H "x-api-key: $API_KEY"
{- "e2e_avg_ms": 0.5,
- "generation_tokens_per_sec": 0.5,
- "kv_cache_usage": 0.5,
- "kv_capacity_derived": false,
- "kv_capacity_gb": 0.5,
- "kv_used_gb": 0.5,
- "preemptions_per_sec": 0.5,
- "prefix_hit_rate": 0.5,
- "prompt_tokens_per_sec": 0.5,
- "queue_wait_avg_ms": 0.5,
- "reporting_replicas": 1,
- "requests_per_sec": 0.5,
- "requests_running": 0.5,
- "requests_waiting": 0.5,
- "series": {
- "e2e_avg_ms": [
- { }
], - "generation_tokens_per_sec": [
- { }
], - "kv_cache_usage": [
- { }
], - "preemptions_per_sec": [
- { }
], - "prefix_hit_rate": [
- { }
], - "prompt_tokens_per_sec": [
- { }
], - "queue_wait_avg_ms": [
- { }
], - "reporting_replicas": [
- { }
], - "requests_per_sec": [
- { }
], - "requests_running": [
- { }
], - "requests_waiting": [
- { }
], - "shared_hit_rate": [
- { }
], - "tpot_avg_ms": [
- { }
], - "ttft_avg_ms": [
- { }
]
}, - "shared_hit_rate": 0.5,
- "tpot_avg_ms": 0.5,
- "ttft_avg_ms": 0.5,
- "window_seconds": 1
}Live view of the endpoint's shared cross-machine KV pool: how many replicas contribute to it and how big it therefore is, plus best-effort hit rate, cache occupancy and throughput scraped from the serving replicas. Returns enabled=false for an endpoint that has no pool. The optional window (e.g. 30m, 6h) sets the range of the returned sparklines.
| spaceId required | string Space ID |
| id required | string Model endpoint ID |
| window | string Time window, e.g. 30m or 6h (default 30m) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}/pool/metrics" \ -H "x-api-key: $API_KEY"
{- "enabled": true,
- "hit_rate": 0.5,
- "kv_cache_usage": 0.5,
- "pool_capacity_gb": 0.5,
- "replicas": 1,
- "requests_running": 0.5,
- "requests_waiting": 0.5,
- "segment_gb_per_replica": 0.5,
- "series": {
- "hit_rate": [
- { }
], - "kv_cache_usage": [
- { }
], - "requests_running": [
- { }
], - "tokens_per_sec": [
- { }
]
}, - "tokens_per_sec": 0.5,
- "tokens_saved_per_sec": 0.5,
- "transport": "example",
- "window_seconds": 1
}Change how many replicas the endpoint holds. Converges in place: the groups are rewritten and the reconciler appends or drains members, so running replicas are not torn down. Shape (parallelism, GPUs, nodes, image) is not changeable here -- that is a redeploy.
| spaceId required | string Space ID |
| id required | string Model endpoint ID |
New fleet bounds
| cooldown_seconds | integer CooldownSeconds paces repeated scale decisions; 0 takes the platform default, which is sized to how long a replica actually takes to become ready. |
| max | integer |
| min | integer |
| target | number Target is the saturation level to hold the fleet at; 0 takes the platform default. |
{- "cooldown_seconds": 0,
- "max": 0,
- "min": 0,
- "target": 0
}{- "context_pool": {
- "chunk_tokens": 1,
- "enabled": true,
- "local_cpu_gb": 0.5,
- "transport": "example"
}, - "created_at": "2026-01-15T10:30:00Z",
- "deployed_at": "2026-01-15T10:30:00Z",
- "gpus_per_node": 2,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "max_context_tokens": 4,
- "name": "churn-propensity-v3",
- "nodes": 2,
- "pipeline_parallel": 1,
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "roles": [
- {
- "current": 1,
- "desired": 1,
- "ready": 1,
- "reason": "Example message",
- "role": "example"
}
], - "scaling": {
- "cooldown_seconds": 1,
- "max": 4,
- "min": 1,
- "target": 0.5
}, - "served_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "served_model_name": "churn-propensity",
- "space": "example",
- "status": "PENDING",
- "status_reason": "Example message",
- "tensor_parallel": 1,
- "topology": "example",
- "total_gpus": 8,
- "weights_format": "example"
}Forwards an OpenAI-compatible request (chat completions, models, ...) to the endpoint, streaming the response through. Authentication and authorisation are the platform's; the request body and the response are passed through untouched.
| spaceId required | string Space ID |
| id required | string Model endpoint ID |
| upstream required | string Upstream path, e.g. /chat/completions |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}/v1/{upstream}" \ -H "x-api-key: $API_KEY"
Lists the served-model catalog with, per model, whether it can be deployed on this space's cluster right now. A model that cannot be served is returned WITH its reason rather than omitted.
| spaceId required | string Space ID |
| family | string Narrow to one family (deepseek, qwen, glm, gemma, nemotron) |
| include_disabled | boolean Include entries an operator turned off |
| max_context_tokens | integer Longest conversation to assume when deciding what fits; defaults to each model's own maximum |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/served-models" \ -H "x-api-key: $API_KEY"
{- "items": [
- {
- "active_params_b": 0.5,
- "autoregressive": false,
- "availability": "example",
- "capabilities": [
- "example"
], - "context_pool_supported": false,
- "display_name": "Churn propensity",
- "family": "example",
- "hybrid_kv_cache": false,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "image": "registry.example.com/image:tag",
- "max_context": 4,
- "modality": "example",
- "name": "churn-propensity",
- "params_b": 0.5,
- "profiles": [
- { }
], - "provenance": "example",
- "reason": "Example message",
- "reasoning": false,
- "smallest_viable": { },
- "strategies": [
- "example"
], - "tool_calling": false,
- "variants": [
- { }
]
}
], - "observed_at": "2026-01-15T10:30:00Z"
}Adds one servable model to this organisation's catalog. The built-in catalog is a RECOMMENDATION, off unless the deployment enables it — this is how a deployment says what it actually serves.
| spaceId required | string Space ID |
Model
| active_params_b | number |
| autoregressive | boolean Autoregressive é ponteiro para distinguir "não marcado" de "marcado como falso": o default é TRUE (quase todo modelo o é), e um bool simples faria o formulário que esquece o campo prometer que um difusor não faz streaming. |
| capabilities | Array of strings |
| context_pool_supported | boolean |
| data_parallel | integer |
| display_name required | string <= 120 characters |
object | |
object | |
| expert_parallel | boolean |
| family required | string <= 60 characters |
| format required | string Enum: "bf16" "fp16" "fp8" "nvfp4" "mxfp4" "int8" "int4" "mixed" |
| gpus_per_node required | integer [ 1 .. 64 ] A configuração de execução -- o formato que o deploy vai usar. |
| hidden_layers | integer |
| hybrid_kv_cache | boolean |
| image | string <= 300 characters Image é uma imagem de container |
| kv_cache_dtype | string |
| max_context | integer |
| min_runtime_version | string Exigências da ARQUITETURA, não preferências: sem o modo de tokenizer certo um checkpoint sem chat template carrega bem e falha toda requisição de chat, e um parser ausente faz o chip de capacidade prometer o que não se cumpre. |
| name required | string <= 120 characters Identidade. |
| node_fraction | number |
| nodes required | integer [ 1 .. 16 ] |
| params_b required | number Tamanho. |
| pipeline_parallel | integer |
| reasoning_parser | string |
| ref required | string <= 300 characters |
| size_gb | number |
| tensor_parallel required | integer [ 1 .. 64 ] |
| tokenizer_mode | string |
| tool_call_parser | string |
| trust_remote_code | boolean |
| weights_source | string Enum: "hub" "path" "hub_cache" Onde estão os pesos, e em que precisão.
Lista em vez de bloco indentado de propósito: indentação vira code block em markdown, e a referência publicada renderiza esta descrição. |
{- "active_params_b": 0,
- "autoregressive": true,
- "capabilities": [
- "string"
], - "context_pool_supported": true,
- "data_parallel": 0,
- "display_name": "string",
- "engine_args": {
- "property1": "string",
- "property2": "string"
}, - "env": {
- "property1": "string",
- "property2": "string"
}, - "expert_parallel": true,
- "family": "string",
- "format": "bf16",
- "gpus_per_node": 1,
- "hidden_layers": 0,
- "hybrid_kv_cache": true,
- "image": "string",
- "kv_cache_dtype": "string",
- "max_context": 0,
- "min_runtime_version": "string",
- "name": "string",
- "node_fraction": 0,
- "nodes": 1,
- "params_b": 0,
- "pipeline_parallel": 0,
- "reasoning_parser": "string",
- "ref": "string",
- "size_gb": 0,
- "tensor_parallel": 1,
- "tokenizer_mode": "string",
- "tool_call_parser": "string",
- "trust_remote_code": true,
- "weights_source": "hub"
}{- "active_params_b": 0.5,
- "autoregressive": false,
- "capabilities": [
- "example"
], - "context_pool_supported": false,
- "createdAt": "example",
- "display_name": "Churn propensity",
- "enabled": true,
- "family": "example",
- "hidden_layers": 1,
- "hybrid_kv_cache": false,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "image": "registry.example.com/image:tag",
- "image_key": "REDACTED",
- "internalID": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kv_bytes_per_token": 0.5,
- "max_context": 4,
- "min_runtime_version": "1.0.0",
- "modality": "text",
- "name": "churn-propensity",
- "params_b": 0.5,
- "profiles": [
- {
- "data_parallel": 1,
- "engine_args": { },
- "env": { },
- "expert_parallel": false,
- "formats": [
- { }
], - "gpus_per_node": 2,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "kv_cache_dtype": "example",
- "node_fraction": 0.5,
- "nodes": 2,
- "pipeline_parallel": 1,
- "portable": false,
- "requires": { },
- "split": false,
- "tensor_parallel": 1
}
], - "reasoning_parser": "Example message",
- "runtime": "vllm",
- "source": "builtin",
- "strategies": [
- "tensor_parallel"
], - "tokenizer_mode": "REDACTED",
- "tool_call_parser": "example",
- "trust_remote_code": false,
- "updatedAt": "example",
- "variants": [
- {
- "description": "Scores the active customer base every morning.",
- "draft_method": "example",
- "draft_ref": "example",
- "draft_tokens": 1,
- "format": "bf16",
- "gated": false,
- "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "label": "example",
- "min_runtime": "example",
- "ref": "example",
- "size_gb": 0.5,
- "source": "hub",
- "strategies": [
- { }
]
}
]
}Enumerates every configuration (weights format x parallelism) for one model against this space's cluster, each marked ready / no_capacity / too_large / unsupported with the numbers behind it. Creates nothing. The answer is advisory — deploy re-validates against fresh capacity.
| spaceId required | string Space ID |
Model and sizing intent
| max_context_tokens | integer MaxContextTokens is the longest single conversation the endpoint must serve. Optional (the model's own maximum is used when absent), but not cosmetic: the cache has to hold one full sequence for the endpoint to serve it, so raising this can turn a ready cell into a too-large one. |
| model_id | string ModelID or ModelName identifies the catalog entry; exactly one is required. |
| model_name | string |
| replicas | integer Replicas is the fleet floor the capacity check must satisfy. Defaults to 1. |
{- "max_context_tokens": 0,
- "model_id": "string",
- "model_name": "string",
- "replicas": 0
}{- "availability": "example",
- "blocked": "example",
- "capacity": [
- {
- "contended_gpus": 8,
- "free_gpus": 8,
- "gpu_arch": "example",
- "gpu_model": "example",
- "gpus_per_node": 2,
- "hardware_class": "example",
- "inter_node_fabric": "example",
- "nodes": 2,
- "schedulable_gpus": 8,
- "schedulable_nodes": 2,
- "total_gpus": 8,
- "vram_gb_per_gpu": 0.5
}
], - "cells": [
- {
- "context_pool_available": false,
- "format": "example",
- "gpu_model": "example",
- "gpus_per_node": 2,
- "hardware_class": "example",
- "kv_budget_gb": 0.5,
- "kv_budget_tokens": 1,
- "nodes": 2,
- "pipeline_parallel": 1,
- "profile_id": "dp_1a2b3c4d5e6f708192a3b4c5",
- "reason": "Example message",
- "recommended": false,
- "split_available": false,
- "state": "PENDING",
- "tensor_parallel": 1,
- "total_gpus": 8,
- "usable_vram_gb": 0.5,
- "weights_estimated": false,
- "weights_gb": 0.5
}
], - "display_name": "Churn propensity",
- "model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_name": "churn-propensity",
- "observed_at": "2026-01-15T10:30:00Z"
}Removes a declared model. A BUILT-IN recommendation is hidden instead of removed — the seed re-inserts what is missing at every boot, so a disabled row is what survives that; the response says which happened. Refused while any endpoint still serves the model.
| spaceId required | string Space ID |
| servedModelId required | string Served model ID |
curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/served-models/{servedModelId}" \ -H "x-api-key: $API_KEY"
{- "message": "Example message",
- "outcome": "deleted"
}Retrieve a list of training jobs with cursor pagination and optional filters
| limit | integer Default: 10 Page size |
| after | string Cursor: last training ID from the previous page |
| kind | string Filter by training kind |
| data_model_id | string Filter by data model ID |
| status | string Filter by job status |
| name | string Filter by training name (case-insensitive substring) |
| start_date | string Lower bound for created_at (RFC3339 or RFC3339Nano) |
| end_date | string Upper bound for created_at (RFC3339 or RFC3339Nano) |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings" \ -H "x-api-key: $API_KEY"
{- "count": 8,
- "data": [
- {
- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": { },
- "space": "example",
- "status": "PENDING",
- "target_datasets": [
- { }
], - "time_ranges": { },
- "training_datasets": [
- { }
], - "updated_at": "2026-01-15T10:30:00Z"
}
], - "has_more": false
}Create a new training job
Training creation request
object | |
| architecture_id required | string |
| base_checkpoint | string |
| data_model_id required | string |
| description | string |
| model_input_id | string Design-driven training: when set, the service resolves TrainingDatasets / TargetDatasets and TimeRanges from the referenced Model Design's snapshot, so the client doesn't have to duplicate that mapping. |
| model_output_id | string |
| name required | string |
| recipe_preset required | string |
required | object (request.RequestedResources) |
object Schedule, when set with a start_at, defers the training: it is persisted as Scheduled and dispatched by the reconciler instead of immediately. | |
Array of objects (model.TargetDataset) | |
required | object (model.TimeRanges) |
Array of objects (model.TrainingDataset) |
{- "advanced_fields": {
- "property1": null,
- "property2": null
}, - "architecture_id": "string",
- "base_checkpoint": "string",
- "data_model_id": "string",
- "description": "string",
- "model_input_id": "string",
- "model_output_id": "string",
- "name": "string",
- "recipe_preset": "string",
- "requested_resources": {
- "cpu": "string",
- "gpu": {
- "count": 0,
- "per_node": 0
}, - "memory": "string",
- "min_nodes": 0
}, - "schedule": {
- "start_at": "string",
- "timezone": "string"
}, - "target_datasets": [
- {
- "columns": [
- "string"
], - "dir": "string",
- "excluded_columns": [
- "string"
], - "id": "string",
- "shift": "string"
}
], - "time_ranges": {
- "test": [
- "string"
], - "train": [
- "string"
], - "val": [
- "string"
]
}, - "training_datasets": [
- {
- "columns": [
- "string"
], - "cross_net_sharing_group_size": 0,
- "dir": "string",
- "excluded_columns": [
- "string"
], - "id": "string",
- "shift": "string"
}
]
}{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Resolves what StartTraining would compute for event/feature/
| model_input_id | string Model Input design id |
| model_output_id | string Model Output design id |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/dataset-preview" \ -H "x-api-key: $API_KEY"
{- "artifact_refs": [
- {
- "mode": "ReadOnly",
- "mount_path": "/datasets/transactions",
- "name": "churn-propensity-v3",
- "sub_path": "/datasets/transactions"
}
], - "dataset_names": { },
- "event_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "feature_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "filter_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "needs_shared_bind": false,
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
]
}Persist the minimum of a training wizard (name + project) so it can be reopened and finished later, without validating or resolving anything else yet
Draft creation request
| data_model_id required | string |
| description | string |
| name required | string |
{- "data_model_id": "string",
- "description": "string",
- "name": "string"
}{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}" \ -H "x-api-key: $API_KEY"
{- "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Update a training job by ID
| id required | string Training ID |
Training update request
| architecture | string |
| benchmark_ids | Array of strings |
| configuration | object |
object (request.UpdateConnectorTraining) | |
| name | string |
{- "architecture": "string",
- "benchmark_ids": [
- "string"
], - "configuration": { },
- "connector": {
- "connector_id": "string",
- "keys": [
- "string"
]
}, - "name": "string"
}{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Cancel a training job by ID (stops the job but preserves the training record)
| id required | string Training ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/cancel" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Overwrite a Draft training's config_snapshot with whatever the wizard has filled in so far. Unvalidated until the draft is actually started.
| id required | string Training ID |
Draft snapshot
required | object |
| description | string |
| name | string Name / Description are optional: the wizard lets both be edited once a draft is reopened (see NewTrainingFromDesignSheet's onNameChange / onDescriptionChange), and every subsequent save needs to persist whatever they were changed to, not just the config_snapshot. |
{- "config_snapshot": {
- "property1": null,
- "property2": null
}, - "description": "string",
- "name": "string"
}{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Retrieve logs for a training job by ID
| id required | string Training ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/logs" \ -H "x-api-key: $API_KEY"
{- "created_at": "2026-01-15T10:30:00Z",
- "id": "log_1a2b3c4d5e6f708192a3b4c5",
- "job_id": "log_1a2b3c4d5e6f708192a3b4c5",
- "text": "example"
}Download all logs for a training job as a plain text file
| id required | string Training ID |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/logs/download" \ -H "x-api-key: $API_KEY"
Retrieve metrics for a training job by ID. When max_points is set and the series is longer, it is downsampled (LTTB) to about that many points; checkpoint points are always kept.
| id required | string Training ID |
| type | string Metric type filter (TRAIN, CHECKPOINT_LOSS, CHECKPOINT_VALIDATION, BENCHMARK) |
| max_points | integer Max points to return; omit or <= 0 to return every point |
curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/metrics" \ -H "x-api-key: $API_KEY"
{- "benchmark": "example",
- "checkpoint": "example",
- "checkpoint_name": "churn-propensity-v3-step-4000",
- "created_at": "2026-01-15T10:30:00Z",
- "data_model": "example",
- "dataset": "example",
- "dataset_name": "transactions-daily",
- "epoch": 1,
- "id": "met_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "step": 1,
- "target": "example",
- "training": "example",
- "training_name": "churn-propensity-v3",
- "type": "BENCHMARK",
- "values": { }
}Pause a running training: the neocore job is deleted but checkpoints persist, so the training can be resumed later
| id required | string Training ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/pause" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Resume a paused or failed training from its last periodic checkpoint by re-creating the neocore job. A failed run's checkpoint integrity isn't guaranteed, since the job didn't shut down cleanly.
| id required | string Training ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/resume" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Replace the deferred start time of a Scheduled (not yet started) training
| id required | string Training ID |
New schedule
required | object (model.TrainingSchedule) | ||||
| |||||
{- "schedule": {
- "start_at": "string",
- "timezone": "string"
}
}{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}Dispatch a Scheduled training immediately instead of waiting for its start time
| id required | string Training ID |
curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/start" \ -H "x-api-key: $API_KEY"
{- "architecture": "example",
- "architecture_id": "arc_1a2b3c4d5e6f708192a3b4c5",
- "base_checkpoint": "example",
- "config": "example",
- "config_snapshot": { },
- "created_at": "2026-01-15T10:30:00Z",
- "data_model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "description": "Scores the active customer base every morning.",
- "filter_dataset_ids": [
- "dpp_1a2b3c4d5e6f708192a3b4c5",
- "dpp_1a2b3c4d5e6f708192a3b4d6"
], - "gpu_count": 8,
- "id": "tra_1a2b3c4d5e6f708192a3b4c5",
- "kind": "PRETRAIN",
- "model_input_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "model_output_id": "dm_1a2b3c4d5e6f708192a3b4c5",
- "name": "churn-propensity-v3",
- "recipe_preset": "example",
- "schedule": {
- "start_at": "2026-01-15T10:30:00Z",
- "timezone": "UTC"
}, - "space": "example",
- "status": "PENDING",
- "target_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "time_ranges": {
- "test": [
- "2026-01-01",
- "2026-03-31"
], - "train": [
- "2026-01-01",
- "2026-03-31"
], - "val": [
- "2026-01-01",
- "2026-03-31"
]
}, - "training_datasets": [
- {
- "columns": [
- "event_ts",
- "customer_id"
], - "cross_net_sharing_group_size": 1,
- "dir": "/datasets/transactions",
- "excluded_columns": [
- "event_ts",
- "customer_id"
], - "id": "obj_1a2b3c4d5e6f708192a3b4c5",
- "shift": "example"
}
], - "updated_at": "2026-01-15T10:30:00Z"
}