Skip to main content

Neo Platform Inference API (1.0)

Download OpenAPI specification:Download

Public REST API for the NeoSpace platform (inference, chat, and platform management).

admin

List audits (org-wide)

List audit logs across all spaces. space_id is an optional filter from the query string.

query Parameters
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)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/audits" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Audit filter facets (org-wide)

Distinct values available for each audit filter, across every space.

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/audits/facets" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "actions": [
    ],
  • "resource_types": [
    ]
}

Get audit by ID (org-wide)

Get any audit log entry regardless of space.

path Parameters
id
required
string

Audit ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/audits/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Get the org MFA policy

Read the current org-wide MFA enforcement policy from the auth-service

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/mfa-policy" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "org_wide": false,
  • "required_groups": [
    ],
  • "updated_at": "2026-01-15T10:30:00Z"
}

Update the org MFA policy

Replace the org-wide MFA enforcement policy. required_groups must name existing seats.

Request Body schema: application/json
required

Desired MFA policy

org_wide
boolean
required_groups
Array of strings

Responses

Request samples

Content type
application/json
{
  • "org_wide": true,
  • "required_groups": [
    ]
}

Response samples

Content type
application/json
{
  • "org_wide": false,
  • "required_groups": [
    ],
  • "updated_at": "2026-01-15T10:30:00Z"
}

Get users

Retrieve a list of users

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/users" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Offboard a user

path Parameters
id
required
string

User ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/admin/users/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "message": "Example message"
}

Suspend a user

Blocks the account (reversible). Proxied to the auth-service.

path Parameters
id
required
string

User ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/admin/users/{id}/suspend" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "message": "Example message"
}

Lift a user suspension

path Parameters
id
required
string

User ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/admin/users/{id}/unsuspend" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "message": "Example message"
}

Admin OIDC

List OIDC providers

Returns all configured OIDC providers for admin management

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/oidc/providers" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • {
    }
]

Create OIDC provider

Creates a new OIDC provider with KMS-encrypted client_secret

Request Body schema: application/json
required

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

Responses

Request samples

Content type
application/json
{
  • "client_id": "string",
  • "client_secret": "string",
  • "display_name": "string",
  • "issuer": "string",
  • "scim_managed": true,
  • "scopes": "string",
  • "slug": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

Delete OIDC provider

Soft-deletes an OIDC provider by slug

path Parameters
slug
required
string

Provider slug

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
No sample

Get OIDC provider

Returns a single OIDC provider by slug for admin management

path Parameters
slug
required
string

Provider slug

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Update OIDC provider

Updates fields of an existing OIDC provider (partial update)

path Parameters
slug
required
string

Provider slug

Request Body schema: application/json
required

Fields to update

client_id
string
client_secret
string
display_name
string
issuer
string
scim_managed
boolean
scopes
string

Responses

Request samples

Content type
application/json
{
  • "client_id": "string",
  • "client_secret": "string",
  • "display_name": "string",
  • "issuer": "string",
  • "scim_managed": true,
  • "scopes": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

Admin SCIM

List SCIM tokens

Lists SCIM provisioning tokens — metadata only, never the plaintext

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • {
    }
]

Create SCIM token

Mints a SCIM provisioning bearer token; the plaintext is returned only in this response

path Parameters
slug
required
string

Provider slug

query Parameters
ttl
string

Token lifetime (7d | 1m | 2m | 3m | never); defaults to 7d

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Regenerate SCIM token

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

path Parameters
slug
required
string

Provider slug

query Parameters
ttl
string

Token lifetime (7d | 1m | 2m | 3m | never); defaults to 7d

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens/regenerate" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Revoke SCIM token

Revokes a SCIM token immediately. SCIM provisioning stops until a new token is generated.

path Parameters
id
required
string

Token id

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/admin/oidc/providers/{slug}/scim/tokens/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
No sample

api-keys

List API keys

Get a paginated list of API keys for the current user

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/api-keys" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create API key

Create a new API key

Request Body schema: application/json
required

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 required binding because a request may state the grant in Grant instead; the handler rejects a request that carries neither.

Deprecated: use Grant.

spaces
Array of strings

Spaces is not required: a key holding only global permissions carries no Space. Grant coherence (Space-scoped permissions need a Space, global ones take none) is enforced in the handler, not by binding.

Deprecated: use Grant.

Responses

Request samples

Content type
application/json
{
  • "created_by": "string",
  • "grant": {
    },
  • "name": "string",
  • "permissions": [
    ],
  • "spaces": [
    ]
}

Response samples

Content type
application/json
{
  • "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"
}

Delete API key

Delete an API key by ID

path Parameters
id
required
string

API key ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/api-keys/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get API key

Retrieve an API key by ID

path Parameters
id
required
string

API key ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/api-keys/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Update API key

Update an API key by ID

path Parameters
id
required
string

API key ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "grant": {
    },
  • "name": "string",
  • "permissions": [
    ],
  • "spaces": [
    ],
  • "updated_by": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

OIDC

Handle OIDC callback

Handles the callback from OIDC provider after user authentication

query Parameters
code
required
string

Authorization code

state
required
string

State parameter

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/auth/oidc/callback?code=CODE&state=STATE" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
"example"

Initiate OIDC login

Starts the OIDC authentication flow for the requested provider (optional when only one IdP is configured)

Request Body schema: application/json

Login options

provider
string

Responses

Request samples

Content type
application/json
{
  • "provider": "string"
}

Response samples

Content type
application/json
{}

List OIDC providers

Returns id and display name for each configured OIDC IdP

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/auth/oidc/providers" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • {
    }
]

Refresh OIDC token

Refreshes the internal JWT token using the stored OIDC refresh token

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/auth/oidc/refresh" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "token": "REDACTED"
}

clusters

List clusters

Retrieve a list of clusters

Authorizations:
ApiKeyAuth

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create cluster

Create a new cluster

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required

Cluster creation request

description
string
name
string

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "description": "Scores the active customer base every morning.",
  • "id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "name": "churn-propensity-v3",
  • "nodes": [
    ],
  • "spaces": [
    ],
  • "stats": {
    },
  • "status": "HEALTHY",
  • "updated_at": "2026-01-15T10:30:00Z"
}

Delete cluster

Delete a cluster by ID

Authorizations:
ApiKeyAuth

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/clusters/{cluster}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

List endpoints for a cluster

List the cluster's neocore Endpoints (stable service identities — headless DNS or balanced Envoy VIP) with their runtime backends + load balancer

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/endpoints" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "revision": 1
}

Create a cluster endpoint

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.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

Request Body schema: application/json
required

Endpoint create request

object (request.NeocoreV2Metadata)
object (request.NeocoreV2EndpointSpec)

Responses

Request samples

Content type
application/json
{
  • "metadata": {
    },
  • "spec": {
    }
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "revision": 1,
  • "runtime": {
    },
  • "spec": {
    },
  • "status": {
    }
}

Delete a cluster endpoint

Delete a neocore Endpoint by name. Clients dialing its address stop resolving; the backing tasks are untouched.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

endpoint
required
string

Endpoint name

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/clusters/{cluster}/endpoints/{endpoint}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get one cluster endpoint

Fetch a single neocore Endpoint (spec + status + runtime backends/LB), scoped to the cluster

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

endpoint
required
string

Endpoint name

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/endpoints/{endpoint}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "revision": 1,
  • "runtime": {
    },
  • "spec": {
    },
  • "status": {
    }
}

List jobs for a cluster

List all jobs enriched with task details, node info, and CPU/GPU utilization, optionally filtered by state

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

query Parameters
state
string

Filter by job state (Pending, Running, Completed, Failed, Canceled)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/jobs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "completed_jobs": 1,
  • "failed_jobs": 1,
  • "items": [
    ],
  • "running_jobs": 1,
  • "total_jobs": 1
}

List queued jobs for a cluster

List all jobs currently in pending/queued state

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/jobs/queue" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "total_jobs": 1
}

Rerun a cluster job

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.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

job
required
string

Job name

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/clusters/{cluster}/jobs/{job}/rerun" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

Get cluster metrics

Returns aggregated KPIs, per-node utilization, IO history, network traffic, disk and network usage for the cluster overview dashboard

Authorizations:
ApiKeyAuth

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/metrics" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "disk_usage": {
    },
  • "io_history": [
    ],
  • "kpis": {
    },
  • "network_traffic": [
    ],
  • "network_usage": {
    },
  • "nodes": [
    ]
}

List nodes summary for a cluster

List all nodes with aggregated CPU, GPU, memory and disk metrics, plus cluster-level averages

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/summary" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "average_cpu": 0.5,
  • "average_disk": 0.5,
  • "average_gpu": 0.5,
  • "average_memory": 0.5,
  • "average_utilization": 0.5,
  • "items": [
    ]
}

List scaling groups for a cluster

List the cluster's neocore ScalingGroups (engine + online-server tiers) with their autoscale runtime (desired/current replicas, members, load balancer)

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/scaling-groups" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "revision": 1
}

Delete a cluster scaling group

Delete a neocore ScalingGroup by name. Its member jobs are torn down; a deploy that owns it will recreate it.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

sg
required
string

Scaling group name

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/clusters/{cluster}/scaling-groups/{sg}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get one cluster scaling group

Fetch a single neocore ScalingGroup (scaling spec + autoscale runtime: desired/current/ready replicas, members, load balancer), scoped to the cluster

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

sg
required
string

Scaling group name

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/scaling-groups/{sg}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "revision": 1,
  • "runtime": {
    },
  • "spec": {
    },
  • "status": {
    }
}

Rescale a cluster scaling group

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.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

sg
required
string

Scaling group name

Request Body schema: application/json
required

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)

Responses

Request samples

Content type
application/json
{
  • "cooldown_seconds": 0,
  • "max": 0,
  • "min": 0,
  • "scale_down_rules": [
    ],
  • "scale_to_zero": {
    },
  • "scale_up_rules": [
    ],
  • "target": {
    }
}

Response samples

Content type
application/json
{
  • "metadata": {
    },
  • "revision": 1,
  • "runtime": {
    },
  • "spec": {
    },
  • "status": {
    }
}

Read how a cluster runs

path Parameters
cluster
required
string

Cluster ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/settings" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "available_devices": [
    ],
  • "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "datavolume_device": "local"
}

Change how a cluster runs

path Parameters
cluster
required
string

Cluster ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "datavolume_device": "string"
}

Response samples

Content type
application/json
{
  • "available_devices": [
    ],
  • "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "datavolume_device": "local"
}

Assign multiple spaces to a cluster

Assign one or more spaces to the given cluster (each space's cluster pointer is set).

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

Request Body schema: application/json
required

Spaces to assign

space_ids
required
Array of strings non-empty

Responses

Request samples

Content type
application/json
{
  • "space_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "space_ids": [
    ]
}

nodes

List nodes

Retrieve a list of nodes

Authorizations:
ApiKeyAuth

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create node

Create a new node

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required

Node creation request

object
name
string

Responses

Request samples

Content type
application/json
{
  • "labels": {
    },
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "apiserver_url": "https://example.com/path",
  • "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",
  • "setup_url": "https://example.com/path",
  • "spire_join_token": "REDACTED",
  • "spire_server_address": "example",
  • "spire_trust_domain": "example",
  • "status": "CONNECTED",
  • "token": "REDACTED"
}

Delete node

Delete a node by ID

Authorizations:
ApiKeyAuth

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Update node job labels

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.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

id
required
string

Node ID

Request Body schema: application/json
required

Labels and drain options

drain_strategy
required
string
Enum: "graceful" "hard"
grace_period_seconds
integer [ 0 .. 300 ]
labels
required
Array of strings

Responses

Request samples

Content type
application/json
{
  • "drain_strategy": "graceful",
  • "grace_period_seconds": 300,
  • "labels": [
    ]
}

Response samples

Content type
application/json
{
  • "added": [
    ],
  • "drained_tasks": 1,
  • "labels": [
    ],
  • "node_id": "nod_1a2b3c4d5e6f708192a3b4c5",
  • "removed": [
    ]
}

Move node to another cluster

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.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Source cluster ID

id
required
string

Node ID

Request Body schema: application/json
required

Target cluster and drain options

grace_period_seconds
integer [ 0 .. 300 ]
targetClusterId
required
string

Responses

Request samples

Content type
application/json
{
  • "grace_period_seconds": 300,
  • "targetClusterId": "string"
}

Response samples

Content type
application/json
{
  • "apiserver_url": "https://example.com/path",
  • "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",
  • "setup_url": "https://example.com/path",
  • "spire_join_token": "REDACTED",
  • "spire_server_address": "example",
  • "spire_trust_domain": "example",
  • "status": "CONNECTED",
  • "token": "REDACTED"
}

Re-enroll node

Generate a fresh enroll token + setup command for an existing node

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

id
required
string

Node ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}/re-enroll" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "apiserver_url": "https://example.com/path",
  • "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",
  • "setup_url": "https://example.com/path",
  • "spire_join_token": "REDACTED",
  • "spire_server_address": "example",
  • "spire_trust_domain": "example",
  • "status": "CONNECTED",
  • "token": "REDACTED"
}

Reconcile node labels from hardware

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.

Authorizations:
ApiKeyAuth
path Parameters
cluster
required
string

Cluster ID

id
required
string

Node ID

Responses

Request samples

curl -X PATCH "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}/reconcile-labels" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Generate node token

Generate a new token for a node

Authorizations:
ApiKeyAuth

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/clusters/{cluster}/nodes/{id}/token" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "token": "REDACTED"
}

external-secrets

List external secrets

Retrieve a list of external secrets

Authorizations:
ApiKeyAuth
query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/external-secrets" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create external secret

Create a new external secret

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required

External secret creation request

object
name
required
string
required
object (request.ExternalSecretSpec)

Responses

Request samples

Content type
application/json
{
  • "labels": {
    },
  • "name": "string",
  • "spec": {
    }
}

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "labels": { },
  • "name": "churn-propensity-v3",
  • "spec": {
    },
  • "sync_status": {
    }
}

Delete external secret

Delete an external secret by ID

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

External secret ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/external-secrets/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get external secret

Get an external secret by ID

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

External secret ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/external-secrets/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "labels": { },
  • "name": "churn-propensity-v3",
  • "spec": {
    },
  • "sync_status": {
    }
}

Resync external secret

Trigger a resync for an external secret

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

External secret ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/external-secrets/{id}/resync" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

users

Get logged user informations

Get logged user informations

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/me" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "theme": "example"
}

Update user

Update user

Request Body schema: application/json
required

Update user request

first_name
string
last_name
string
role
string (model.UserRole)
Enum: "designer" "developer"

Responses

Request samples

Content type
application/json
{
  • "first_name": "string",
  • "last_name": "string",
  • "role": "designer"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "spaces": [
    ]
}

Get user panel settings

Get user panel settings for the authenticated user

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/users/panel" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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

Create user panel settings with language and theme preferences

Request Body schema: application/json
required

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

Responses

Request samples

Content type
application/json
{
  • "language": "string",
  • "notification_toasts_enabled": true,
  • "pinned_space_id": "string",
  • "role": "string",
  • "theme": "string"
}

Response samples

Content type
application/json
{
  • "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

Update user panel settings (language and/or theme) for the authenticated user

Request Body schema: application/json
required

Update user panel request

language
string
notification_toasts_enabled
boolean
pinned_space_id
string
role
string
theme
string

Responses

Request samples

Content type
application/json
{
  • "language": "string",
  • "notification_toasts_enabled": true,
  • "pinned_space_id": "string",
  • "role": "string",
  • "theme": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

metrics

Scrape the platform's metrics

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.

Authorizations:
ApiKeyAuth
header Parameters
Authorization
required
string
Default: Bearer <Add access token here>

Insert your access token

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/metrics" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
No sample

List label names

Label names known to the metrics backend, optionally restricted by a series selector.

Authorizations:
ApiKeyAuth
query Parameters
match
string

Series selector (singular, no brackets)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/metrics/labels" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "isPartial": false,
  • "status": "PENDING",
  • "warnings": [
    ]
}

List the values of one label

Values of a single label, optionally restricted by a series selector.

Authorizations:
ApiKeyAuth
path Parameters
label
required
string

Label name

query Parameters
match
string

Series selector (singular, no brackets)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/metrics/labels/{label}/values" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "isPartial": false,
  • "status": "PENDING",
  • "warnings": [
    ]
}

Instant query

Prometheus instant query against the platform's metrics backend.

Authorizations:
ApiKeyAuth
query Parameters
query
required
string

PromQL expression

time
string

Evaluation instant (unix seconds or RFC3339); defaults to now

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/metrics/query?query=QUERY" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": {
    },
  • "isPartial": false,
  • "status": "PENDING",
  • "warnings": [
    ]
}

Range query

Prometheus range query against the platform's metrics backend. start/end/step are optional and default to the last hour at a 30s step.

Authorizations:
ApiKeyAuth
query Parameters
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)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/metrics/query_range?query=QUERY" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": {
    },
  • "isPartial": false,
  • "status": "PENDING",
  • "warnings": [
    ]
}

seats

Get all seats

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.

query Parameters
limit
integer
Default: 10

limit

after
string

Cursor: a seat id, or a numeric offset while SCIM-governed

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/seats" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false,
  • "scim_governed": false,
  • "unmapped_seats": [
    ]
}

Create seat

Create a new seat

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "grant": {
    },
  • "group_id": "string",
  • "name": "string",
  • "permissions": [
    ],
  • "spaces": [
    ]
}

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "grant": {
    },
  • "id": "sea_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Data scientist",
  • "permissions": [
    ],
  • "spaces": [
    ],
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

List valid seat permissions

Return the set of permission keys that can be assigned to a seat. Derived from the same enum the backend uses to authorize requests.

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/seats/permissions" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "permissions": [
    ]
}

Purge every local seat

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.

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/seats/purge" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "purged": 1
}

Delete seat

Delete a seat by ID

path Parameters
id
required
string

Seat ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/seats/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get seat

Retrieve a seat by ID

path Parameters
id
required
string

Seat ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/seats/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "grant": {
    },
  • "id": "sea_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Data scientist",
  • "permissions": [
    ],
  • "spaces": [
    ],
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

Update seat

Update a seat by ID

path Parameters
id
required
string

Seat ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "grant": {
    },
  • "name": "string",
  • "permissions": [
    ],
  • "spaces": [
    ]
}

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "grant": {
    },
  • "id": "sea_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Data scientist",
  • "permissions": [
    ],
  • "spaces": [
    ],
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

Add a member to a seat

Assign an existing user to a seat (federated to the auth-service)

path Parameters
id
required
string

Seat ID

Request Body schema: application/json
required

User to assign

user_id
required
string

Responses

Request samples

Content type
application/json
{
  • "user_id": "string"
}

Response samples

Content type
application/json
{
  • "message": "Example message"
}

Add people to a seat by email

Place a list of emails in the seat — known emails are added, unknown ones invited

path Parameters
id
required
string

Seat ID

Request Body schema: application/json
required

Emails to add

emails
required
Array of strings non-empty

Responses

Request samples

Content type
application/json
{
  • "emails": [
    ]
}

Response samples

Content type
application/json
{
  • "added": [
    ],
  • "failed": [
    ],
  • "invited": [
    ],
  • "skipped": [
    ]
}

Remove a member from a seat

Revoke a user's seat membership (federated to the auth-service)

path Parameters
id
required
string

Seat ID

userId
required
string

User ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/seats/{id}/members/{userId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "message": "Example message"
}

Add space to seat

Add a space to a specific seat

path Parameters
id
required
string

Seat ID

Request Body schema: application/json
required

Add space to seat request

space_id
required
string

Responses

Request samples

Content type
application/json
{
  • "space_id": "string"
}

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "grant": {
    },
  • "id": "sea_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Data scientist",
  • "permissions": [
    ],
  • "spaces": [
    ],
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

spaces

Get all spaces

Retrieve all spaces

query Parameters
limit
integer
Default: 10

Limit

after
string
Default: "\"\""

After

name
string

Filter by space name

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create space

Create a new space

Request Body schema: application/json
required

Space creation request

description
required
string
name
required
string
seat_id
string

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "seat_id": "string"
}

Response samples

Content type
application/json
{
  • "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "description": "Scores the active customer base every morning.",
  • "id": "spa_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Risk",
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

Delete space

Delete a space by ID

path Parameters
spaceId
required
string

Space ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get space

Retrieve a space by ID

path Parameters
spaceId
required
string

Space ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "description": "Scores the active customer base every morning.",
  • "id": "spa_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Risk",
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

Update space

Update a space by ID

path Parameters
spaceId
required
string

Space ID

Request Body schema: application/json
required

Space update request

description
string
name
string

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "cluster_id": "clu_1a2b3c4d5e6f708192a3b4c5",
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "description": "Scores the active customer base every morning.",
  • "id": "spa_1a2b3c4d5e6f708192a3b4c5",
  • "name": "Risk",
  • "updated_at": "2026-01-15T10:30:00Z",
  • "updated_by": "example"
}

Invite users to a space

Invite one or more people by email. Provisions the account (if new) and emails a set-password link via the auth-service.

path Parameters
spaceId
required
string

Space ID

Request Body schema: application/json
required

Invite request

emails
required
Array of strings non-empty
seat_id
required
string

Responses

Request samples

Content type
application/json
{
  • "emails": [
    ],
  • "seat_id": "string"
}

Response samples

Content type
application/json
{
  • "invites": [
    ]
}

Get space members

List members of a space with cursor pagination and optional email substring filter

path Parameters
spaceId
required
string

Space ID

query Parameters
limit
integer
Default: 10

Limit

after
string

Cursor — user ID of the last item from the previous page

email
string

Email substring filter (case-insensitive)

seatType
string

Seat type filter

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/members" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Restore space

Restore a deleted space by ID

path Parameters
spaceId
required
string

Space ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/restore" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

audits

List audits

List audits

query Parameters
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)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/audits" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Audit filter facets

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.

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/audits/facets" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "actions": [
    ],
  • "resource_types": [
    ]
}

Get audit by ID

Get audit by ID with all details including metadata

path Parameters
id
required
string

Audit ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/audits/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

batch-inference

Every batch inference run in the space

query Parameters
limit
integer
Default: 10

Page size

after
string

Cursor from the previous page

status
string

Comma-separated run statuses to keep

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Start a batch run from a checkpoint, with nothing deployed

Request Body schema: application/json
required

Body (checkpoint_id required)

object

AnchorSource scores each client at the positions named by a dataset/file instead of at a single date (cortex dataset.anchor_datasets); mutually exclusive with flags.infer_target_date.

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 "|"). Omit entirely to reproduce training exactly.

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)

Responses

Request samples

Content type
application/json
{
  • "anchor_source": {
    },
  • "checkpoint_id": "string",
  • "event_dataset_ids": [
    ],
  • "event_dataset_shifts": {
    },
  • "event_datasets_local": [
    ],
  • "flags": {
    },
  • "inference_version": "string",
  • "output": {
    },
  • "parallelism": {
    },
  • "pool": {
    },
  • "recipe_yaml": "string",
  • "time_range": {
    }
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Preview the cortex recipe a checkpoint-scoped run would drive

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/recipe-preview" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "recipe_yaml": "example"
}

Get a batch inference run

path Parameters
id
required
string

Batch inference run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Cancel a batch inference run

Stop a queued or running batch run. Output already written is kept.

path Parameters
id
required
string

Batch inference run ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}/cancel" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Batch run metrics

Throughput, shard progress and resource use for a run over a rolling window.

path Parameters
id
required
string

Batch inference run ID

query Parameters
window
string
Default: "10m"

Metrics window as a Go duration (e.g. 10m, 1h)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}/metrics" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "batch_p50_ms": [
    ],
  • "batch_p95_ms": [
    ],
  • "chunks_per_second": [
    ],
  • "inflight": [
    ],
  • "memory_rss_mb": [
    ],
  • "throughput": [
    ],
  • "users_per_second": [
    ],
  • "window": "example",
  • "writer_errors": [
    ],
  • "writer_rows": [
    ]
}

Per-shard breakdown of a batch run

Status, failure reason, nodes, live progress and writer status for each shard of a data-parallel run — on failure, which shard broke and why.

path Parameters
id
required
string

Batch inference run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/batch-inference-runs/{id}/shards" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "shards": [
    ]
}

Datasets a checkpoint accepts for a batch run

path Parameters
id
required
string

Checkpoint ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints/{id}/batch-model" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "info": {
    },
  • "input_views": [
    ],
  • "target_views": [
    ]
}

List a server's batch runs

path Parameters
id
required
string

Inference server ID

query Parameters
limit
integer
Default: 10

Page size

after
string

Cursor for pagination

status
string

Comma-separated status filter

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/batch-runs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Start a batch run on an inference server

Score a population offline against the model this server serves.

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

Batch run configuration

object

AnchorSource scores each client at the positions named by a dataset/file instead of at a single date (cortex dataset.anchor_datasets); mutually exclusive with flags.infer_target_date.

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 "|"). Omit entirely to reproduce training exactly.

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)

Responses

Request samples

Content type
application/json
{
  • "anchor_source": {
    },
  • "checkpoint_id": "string",
  • "event_dataset_ids": [
    ],
  • "event_dataset_shifts": {
    },
  • "event_datasets_local": [
    ],
  • "flags": {
    },
  • "inference_version": "string",
  • "output": {
    },
  • "parallelism": {
    },
  • "pool": {
    },
  • "recipe_yaml": "string",
  • "time_range": {
    }
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Batch run KPIs for a server

Aggregate KPIs across the server's batch runs over a rolling window.

path Parameters
id
required
string

Inference server ID

query Parameters
window
string
Default: "24h"

KPIs window as a Go duration (e.g. 24h)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/batch-runs/kpis" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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
}

checkpoints

List checkpoints

List checkpoints by ID

Authorizations:
ApiKeyAuth
query Parameters
limit
integer
Default: 10

Limit

after
string
Default: "\"\""

After

query
string

Case-insensitive substring match on checkpoint name

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Get checkpoint

Get a single checkpoint by id

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Checkpoint ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Rename checkpoint

Update the display name of a checkpoint

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Checkpoint ID

Request Body schema: application/json
required

Body

name
required
string [ 1 .. 128 ] characters

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

Inference deploy config for a checkpoint

Resolve the images + tunables an inference server built from this checkpoint would deploy with (checkpoint → training → architecture).

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Checkpoint ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/checkpoints/{id}/inference-config" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "architecture": "example",
  • "image_go": "registry.example.com/image:tag",
  • "max_seqlen": 4,
  • "memory_margin": 0.5,
  • "node_fraction": 0.5,
  • "token_budget": 1
}

connectors

List connectors

Retrieve a list of connectors with pagination

Authorizations:
ApiKeyAuth
query Parameters
limit
integer
Default: 10

limit

after
string

after

name
string

case-insensitive regular expression matched against the connector name

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create connector

Create a new connector

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required

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"

Responses

Request samples

Content type
application/json
{
  • "external_secret_id": "string",
  • "index_interval_seconds": 0,
  • "local": {
    },
  • "name": "string",
  • "oracle": {
    },
  • "oracle_instance_principal": {
    },
  • "oracle_s3": {
    },
  • "s3": {
    },
  • "s3_instance_profile": {
    },
  • "type": "aws-s3"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "prefix": "example",
  • "provider": "aws-s3",
  • "region": "example",
  • "volume_name": "shared-datasets",
  • "volume_root": "example"
}

Compare connector files

Compare connector files by ID

Authorizations:
ApiKeyAuth
Request Body schema: application/json
required

Compare connector files request

required
Array of objects (request.CompareConnector)
Array
files
Array of strings
id
string

Responses

Request samples

Content type
application/json
{
  • "compare": [
    ]
}

Response samples

Content type
application/json
{
  • "schema_groups": [
    ]
}

Delete connector

Delete a connector by ID

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Connector ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get connector

Retrieve a connector by ID

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Connector ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "prefix": "example",
  • "provider": "aws-s3",
  • "region": "example",
  • "volume_name": "shared-datasets",
  • "volume_root": "example"
}

List files in a connector (S3)

List files for a connector by ID (currently supports S3 connectors)

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Connector ID

query Parameters
prefix
string

File prefix filter

limit
integer

Maximum number of files to return

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}/files" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • [
    ]
]

Get connector live status

Returns the live status (latest/active runs, schema count) for a connector by proxying neocore.

Authorizations:
ApiKeyAuth
path Parameters
id
required
string

Connector ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/connectors/{id}/status" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "active_index_run": {
    },
  • "active_parquet_scan": {
    },
  • "index_status": "PENDING",
  • "is_indexing": false,
  • "is_profiling": false,
  • "latest_index_run": {
    },
  • "latest_parquet_scan": {
    },
  • "profile_status": "PENDING",
  • "schema_count": 8
}

data-enhancements

List data enhancements

Paginated list of data enhancement workspaces in the current space

query Parameters
limit
integer
Default: 10

Page size

after
string

Cursor

name
string

Filter by name (substring)

status
string

Filter by status

header Parameters
Space
required
string

Space ID (spa_*)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-enhancements" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create data enhancement workspace

Create a new data enhancement workspace scoped to the Space header (source datasets, status, audit). Requires JWT or API key and data-enhancements:create.

header Parameters
Space
required
string

Space ID (spa_*)

Request Body schema: application/json
required

Create request

description
string
name
required
string
raw_dataset_ids
Array of strings
status
string
Enum: "DRAFT" "PROCESSING" "READY" "FAILED"

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "raw_dataset_ids": [
    ],
  • "status": "DRAFT"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "status": "DRAFT",
  • "transformations_count": 8
}

Delete data enhancement

Delete a data enhancement workspace by ID in the current space

path Parameters
id
required
string

Data enhancement ID (enh_*)

header Parameters
Space
required
string

Space ID (spa_*)

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-enhancements/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get data enhancement

Get a data enhancement workspace by ID in the current space

path Parameters
id
required
string

Data enhancement ID (enh_*)

header Parameters
Space
required
string

Space ID (spa_*)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-enhancements/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "status": "DRAFT",
  • "transformations_count": 8
}

Update data enhancement

Partial update of a data enhancement workspace in the current space

path Parameters
id
required
string

Data enhancement ID (enh_*)

header Parameters
Space
required
string

Space ID (spa_*)

Request Body schema: application/json
required

Update body

description
string
name
string
raw_dataset_ids
Array of strings
status
string
Enum: "DRAFT" "PROCESSING" "READY" "FAILED"

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "raw_dataset_ids": [
    ],
  • "status": "DRAFT"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "status": "DRAFT",
  • "transformations_count": 8
}

data-extractions

List data extractions

Returns the data extractions in the current space. Deleted

query Parameters
limit
integer
Default: 10

limit

after
string

after

status
string

comma-separated statuses

include_deleted
boolean

include soft-deleted extractions

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-extractions" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create data extraction

Submit a new extraction job. Returns the extraction in PENDING status.

Request Body schema: application/json
required

Data extraction creation request

description
string
name
required
string
required
object (request.ExtractionSource)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "source": {
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Delete data extraction

Soft-delete a data extraction. The underlying neocore job is

path Parameters
id
required
string

Data extraction ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-extractions/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Get data extraction

Retrieve a data extraction by ID.

path Parameters
id
required
string

Data extraction ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-extractions/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Rename / update data extraction

Update name and/or description. Source config is immutable.

path Parameters
id
required
string

Data extraction ID

Request Body schema: application/json
required

Update body

description
string
name
string

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

data-models

Get all data models

Retrieve a list of data models with pagination

query Parameters
limit
integer
Default: 10

limit

after
string

after

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-models" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create data model

Create a new data model

Request Body schema: application/json
required

Data model creation request

description
string
kind
required
string
Enum: "PRETRAIN" "POST_TRAINING"
name
required
string

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "kind": "PRETRAIN",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

Delete data model

Delete a data model by ID

path Parameters
id
required
string

Data model ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-models/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get data model

Retrieve a data model by ID

path Parameters
id
required
string

Data model ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-models/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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 data model

Update a data model by ID

path Parameters
id
required
string

Data model ID

Request Body schema: application/json
required

Data model update request

description
string
name
string

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

data-preprocesses

List data preprocesses

query Parameters
profile_id
string

filter by parent profile

status
string

comma-separated statuses (include ARCHIVED to pull archived rows)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create data preprocess

Create a preprocess from a parent profile. Send EITHER

Request Body schema: application/json
required

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 (min=1 rejects a pointer to "").

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

Responses

Request samples

Content type
application/json
{
  • "excluded_columns": [
    ],
  • "feature_columns": [
    ],
  • "included_columns": [
    ],
  • "lineage_id": "string",
  • "name": "string",
  • "options": {
    },
  • "target_columns": [
    ],
  • "timestamp_column": "string"
}

Response samples

Content type
application/json
{
  • "archived": false,
  • "archived_at": "2026-01-15T10:30:00Z",
  • "created_at": "2026-01-15T10:30:00Z",
  • "excluded_columns": [
    ],
  • "feature_columns": [
    ],
  • "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": [
    ],
  • "target_metric_columns": [
    ],
  • "timestamp_column": "2026-01-15T10:30:00Z",
  • "updated_at": "2026-01-15T10:30:00Z"
}

Delete data preprocess

Hard-delete a data preprocess. Only FAILED preprocesses can be

path Parameters
id
required
string

Data preprocess ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Get data preprocess

path Parameters
id
required
string

Data preprocess ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "archived": false,
  • "archived_at": "2026-01-15T10:30:00Z",
  • "created_at": "2026-01-15T10:30:00Z",
  • "excluded_columns": [
    ],
  • "feature_columns": [
    ],
  • "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": [
    ],
  • "target_metric_columns": [
    ],
  • "timestamp_column": "2026-01-15T10:30:00Z",
  • "updated_at": "2026-01-15T10:30:00Z"
}

Rename data preprocess

path Parameters
id
required
string

Data preprocess ID

Request Body schema: application/json
required

Update body

name
string

Responses

Request samples

Content type
application/json
{
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "archived": false,
  • "archived_at": "2026-01-15T10:30:00Z",
  • "created_at": "2026-01-15T10:30:00Z",
  • "excluded_columns": [
    ],
  • "feature_columns": [
    ],
  • "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": [
    ],
  • "target_metric_columns": [
    ],
  • "timestamp_column": "2026-01-15T10:30:00Z",
  • "updated_at": "2026-01-15T10:30:00Z"
}

Approve a data preprocess for auto-merge

Mark a PROCESSED preprocess to auto-merge into a target profile version when that version is promoted drift-free.

path Parameters
id
required
string

Data preprocess ID

Request Body schema: application/json
required

Target profile version

target_profile_id
required
string

Responses

Request samples

Content type
application/json
{
  • "target_profile_id": "string"
}

Response samples

Content type
application/json
{
  • "error": "example"
}

Archive data preprocess

path Parameters
id
required
string

Data preprocess ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/archive" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Get data preprocess columns

Returns the persisted column snapshot — the columns the user

path Parameters
id
required
string

Data preprocess ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/columns" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Copy data preprocess to another space

Clones a PROCESSED preprocess and its parent profile into

path Parameters
id
required
string

Data preprocess ID

Request Body schema: application/json
required

Target space

target_space
required
string

Responses

Request samples

Content type
application/json
{
  • "target_space": "string"
}

Response samples

Content type
application/json
{
  • "archived": false,
  • "archived_at": "2026-01-15T10:30:00Z",
  • "created_at": "2026-01-15T10:30:00Z",
  • "excluded_columns": [
    ],
  • "feature_columns": [
    ],
  • "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": [
    ],
  • "target_metric_columns": [
    ],
  • "timestamp_column": "2026-01-15T10:30:00Z",
  • "updated_at": "2026-01-15T10:30:00Z"
}

Run a data preprocess merge

(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.

path Parameters
id
required
string

Data preprocess ID

Request Body schema: application/json

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

Responses

Request samples

Content type
application/json
{
  • "number_of_nodes": 0,
  • "target_profile_id": "string"
}

Response samples

Content type
application/json
{
  • "archived": false,
  • "archived_at": "2026-01-15T10:30:00Z",
  • "created_at": "2026-01-15T10:30:00Z",
  • "excluded_columns": [
    ],
  • "feature_columns": [
    ],
  • "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": [
    ],
  • "target_metric_columns": [
    ],
  • "timestamp_column": "2026-01-15T10:30:00Z",
  • "updated_at": "2026-01-15T10:30:00Z"
}

Revoke a data preprocess auto-merge approval

Clear the auto-merge target on a preprocess.

path Parameters
id
required
string

Data preprocess ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/unapprove" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Unarchive data preprocess

Restore an archived data preprocess to its active state.

path Parameters
id
required
string

Data preprocess ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-preprocesses/{id}/unarchive" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

data-profiles

List data profiles

Returns the data profiles in the current space. Archived

query Parameters
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)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create data profile

Submit a new profiling job. Returns the profile in PENDING status.

Request Body schema: application/json
required

Data profile creation request

description
string
object

Metrics optionally overrides the scan's drift policy (injected as the top-level metrics block in the scan config) and is persisted on the profile so appends reuse it.

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"

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "drift_metrics": {
    },
  • "files": [
    ],
  • "name": "string",
  • "options": {
    },
  • "structure": "EVENT_BASED"
}

Response samples

Content type
application/json
{
  • "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
}

Delete data profile

Hard-delete a data profile. Only FAILED profiles can be deleted —

path Parameters
id
required
string

Data profile ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Get data profile

Retrieve a data profile by ID.

path Parameters
id
required
string

Data profile ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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
}

Rename / update data profile

Update name and/or description. Files and structure are immutable.

path Parameters
id
required
string

Data profile ID

Request Body schema: application/json
required

Update body

description
string
name
string
structure
string (model.DataProfileStructure)
Enum: "EVENT_BASED" "FEATURE_BASED" "FILTER_BASED"

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "structure": "EVENT_BASED"
}

Response samples

Content type
application/json
{
  • "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
}

Approve a drift-blocked profile version

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.

path Parameters
id
required
string

Drift-blocked profile version ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/approve-drift" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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
}

Archive data profile

Soft-archive a data profile. Profiles are never hard-deleted —

path Parameters
id
required
string

Data profile ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/archive" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Recast data profile columns

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.

path Parameters
id
required
string

Data profile lineage ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "approve_preprocesses": [
    ],
  • "columns": [
    ],
  • "options": {
    }
}

Response samples

Content type
application/json
{
  • "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
}

Get a data profile column's value distribution

One page of a single column's value distribution (value, count,

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/columns?column=COLUMN" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": {
    },
  • "has_more": false,
  • "rows_count": 8,
  • "total": 1,
  • "values": [
    ]
}

Get a drift-blocked version's drift result

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.

path Parameters
id
required
string

Drift-blocked version ID

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/drift" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "findings": [
    ],
  • "has_more": false,
  • "metrics": [
    ],
  • "run": {
    },
  • "total": 1,
  • "verdict": {
    }
}

Get data profile quality history

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.

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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')

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/quality-history" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_more": false
}

Reject a drift-blocked profile version

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).

path Parameters
id
required
string

Drift-blocked profile version ID

Request Body schema: application/json
required

Rejection reason

reason
required
string

Responses

Request samples

Content type
application/json
{
  • "reason": "string"
}

Response samples

Content type
application/json
{
  • "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
}

Get data profile stats

Live column statistics from neocore. Used for the

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/stats" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "after": "1a2b3c4d5e6f708192a3b4c5",
  • "data": [
    ],
  • "has_more": false,
  • "rows_count": 8,
  • "sampled_rows_count": 8,
  • "total": 1
}

One (column, period) temporal quality cell

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.

path Parameters
id
required
string

Data profile lineage ID

query Parameters
column
required
string

Column name

period
required
string

Period (e.g. 1991-01-07)

Responses

Request samples

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"

Response samples

Content type
application/json
{
  • "classes": { },
  • "column": "event_ts",
  • "entry": { },
  • "granularity": "example",
  • "hist": { },
  • "kind": "example",
  • "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "period": "example",
  • "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
  • "state_version": 1
}

One column's temporal quality series

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 "/").

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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)

Responses

Request samples

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"

Response samples

Content type
application/json
{
  • "column": "event_ts",
  • "flagged_by": {
    },
  • "flagged_periods": [
    ],
  • "granularity": "example",
  • "jsd": [
    ],
  • "jsd_prev": [
    ],
  • "kind": "example",
  • "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "periods": [
    ],
  • "psi": [
    ],
  • "psi_prev": [
    ],
  • "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
  • "state_version": 1,
  • "tvd": [
    ],
  • "tvd_prev": [
    ],
  • "verdict": "example"
}

One column's temporal quality profile

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.

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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)

Responses

Request samples

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"

Response samples

Content type
application/json
{
  • "classes_series": {
    },
  • "column": "event_ts",
  • "count": [
    ],
  • "granularity": "example",
  • "hist": {
    },
  • "kind": "example",
  • "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "null_count": [
    ],
  • "periods": [
    ],
  • "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
  • "state_version": 1,
  • "totals": {
    },
  • "volume": [
    ]
}

Temporal quality heatmap

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.

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/heatmap" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "available_granularities": [
    ],
  • "columns": [
    ],
  • "columns_has_more": false,
  • "drift": { },
  • "event_ts_col": "example",
  • "granularity": "example",
  • "lineage_id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "n_columns": 1,
  • "n_periods": 1,
  • "periods": [
    ],
  • "run_id": "bif_1a2b3c4d5e6f708192a3b4c5",
  • "sampling": { },
  • "scan_mode": "example",
  • "state_version": 1,
  • "volume": [
    ]
}

List temporal quality runs

The lineage's run history, newest first, cursor-paginated.

path Parameters
id
required
string

Data profile lineage ID

query Parameters
after
string

Cursor: id of the previous page's last run

limit
integer

Page size (default 20, max 100)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/runs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_more": false
}

Start a temporal quality run

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.

path Parameters
id
required
string

Data profile lineage ID

Request Body schema: application/json

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:

  • ALONE: a recompute — the engine re-scores the whole timeline from its saved state and reads no data. It needs a completed run, and any other field present is a 400, including values that merely echo the lineage lock (stricter than a plain rerun, which tolerates agreeing echoes).
  • WITH A COLD START (first run, or Rebuild): a data run that seeds the fresh state's reference. A rebuild drops the persisted reference engine-side, so this is how a moved reference survives one; omitted, the rebuilt state scores against the default earliest-periods baseline. On a warm lineage without Rebuild it cannot accompany any other field.

Responses

Request samples

Content type
application/json
{
  • "end_date": "string",
  • "event_ts_col": "string",
  • "rebuild": true,
  • "sample_max_rows": 0,
  • "scan_mode": "string",
  • "start_date": "string",
  • "update_ref_period": {
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Get one temporal quality run

path Parameters
id
required
string

Data profile lineage ID

runId
required
string

Temporal quality run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/temporal-quality/runs/{runId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Unarchive data profile

Restore an archived data profile to its active state.

path Parameters
id
required
string

Data profile ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/unarchive" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

List data profile versions

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.

path Parameters
id
required
string

Data profile lineage ID

query Parameters
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')

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/versions" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_more": false
}

Append a data profile version

Append new connector paths to an existing profile lineage, producing a new incremental version. Optionally pre-approve PROCESSED preprocesses to auto-merge into it.

path Parameters
id
required
string

Data profile lineage ID

Request Body schema: application/json
required

New paths (+ optional approvals)

Array of objects (request.ApprovePreprocessTarget)
object (request.ProfileOptions)

Responses

Request samples

Content type
application/json
{
  • "approve_preprocesses": [
    ],
  • "options": {
    }
}

Response samples

Content type
application/json
{
  • "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
}

Get one data profile version

A single version of a logical profile, addressed by lineage ID + version number.

path Parameters
id
required
string

Data profile lineage ID

version
required
integer

Version number

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/data-profiles/{id}/versions/{version}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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
}

dna

List the bases the DNA pipeline consumes

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.

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-bases" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "items": [
    ]
}

List DNA runs

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.

query Parameters
space_id
string

Narrow to one space

status
string

Comma-separated statuses

limit
integer

Maximum rows

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-runs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "items": [
    ]
}

Start a DNA run

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.

Request Body schema: application/json
required

Run configuration

chunk_size
required
integer >= 1
data_ref
string

VAZIA = derivada da dat_cria_exeo da tabela de execução, que é o default. Preenchida só quando o operador quer ancorar o run noutra data: o pipeline então usa a dele e AVISA se divergir da origem. Obrigatória aqui era o que matava a derivação -- ela só roda quando a data não vem, e a tela mandava sempre.

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 -- escolherFormaDoModelo recusa a ambiguidade em vez de eleger uma.

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 é required aqui: a exigência é "um dos dois", que o binding de campo não expressa.

endpoint_url
string

EndpointURL aponta um vLLM que não é endpoint desta plataforma. Aceita CSV, como o comum/endpoints.py do driver (round-robin + failover).

history_months
required
integer [ 1 .. 120 ]
name
required
string <= 63 characters

Sem space_id: a space vem do PATH. Ela existia aqui quando a tela morava no hub de admin, que não tem space na URL -- e ter a space em dois lugares é ter dois que podem discordar.

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: --model tem que bater com o --served-model-name do servidor, e desta API não há como perguntar a um endereço in-cluster.

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.

Responses

Request samples

Content type
application/json
{
  • "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": {
    },
  • "served_model_name": "string",
  • "shards": 1,
  • "sources": [
    ],
  • "streaming": true
}

Response samples

Content type
application/json
{
  • "chunk_size": 1,
  • "cluster": "example",
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "data_ref": "example",
  • "deadline": "example",
  • "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
  • "endpoint_url": "https://example.com/path",
  • "finished_at": "2026-01-15T10:30:00Z",
  • "history_months": 1,
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "jobs": [
    ],
  • "name": "churn-propensity-v3",
  • "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
  • "output_endpoint": "https://example.com/path",
  • "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"
}

Resolve what a run would read

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.

Request Body schema: application/json
required

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 space_id, pela mesma razão do Create: a space é o path.

required
Array of objects (request.DNASourceInput) non-empty

Responses

Request samples

Content type
application/json
{
  • "data_ref": "string",
  • "endpoint_id": "string",
  • "history_months": 0,
  • "queue": {
    },
  • "sources": [
    ]
}

Response samples

Content type
application/json
{
  • "blockers": [
    ],
  • "queue": {
    },
  • "sources": [
    ],
  • "warnings": [
    ]
}

Get one DNA run

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.

path Parameters
runId
required
string

Run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-runs/{runId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "chunk_size": 1,
  • "cluster": "example",
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "data_ref": "example",
  • "deadline": "example",
  • "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
  • "endpoint_url": "https://example.com/path",
  • "finished_at": "2026-01-15T10:30:00Z",
  • "history_months": 1,
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "jobs": [
    ],
  • "name": "churn-propensity-v3",
  • "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
  • "output_endpoint": "https://example.com/path",
  • "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"
}

Stop a DNA run

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.

path Parameters
runId
required
string

Run ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/dna-runs/{runId}/cancel" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "chunk_size": 1,
  • "cluster": "example",
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": "example",
  • "data_ref": "example",
  • "deadline": "example",
  • "endpoint_id": "mep_1a2b3c4d5e6f708192a3b4c5",
  • "endpoint_url": "https://example.com/path",
  • "finished_at": "2026-01-15T10:30:00Z",
  • "history_months": 1,
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "jobs": [
    ],
  • "name": "churn-propensity-v3",
  • "output_connector_id": "conn_1a2b3c4d5e6f708192a3b4c5",
  • "output_endpoint": "https://example.com/path",
  • "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"
}

drift-policies

List drift policies

Retrieve drift policies in the current space with pagination

query Parameters
limit
integer
Default: 10

limit

after
string

after

name
string

name filter

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/drift-policies" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create drift policy

Create a new drift policy in the current space

Request Body schema: application/json
required

Drift policy creation request

description
string
name
required
string
object (model.DriftMetrics)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "policy": {
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Delete drift policy

Delete a drift policy by ID

path Parameters
id
required
string

Drift policy ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/drift-policies/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get drift policy

Retrieve a drift policy by ID

path Parameters
id
required
string

Drift policy ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/drift-policies/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Update drift policy

Update a drift policy by ID

path Parameters
id
required
string

Drift policy ID

Request Body schema: application/json
required

Drift policy update request

description
string
name
string
object (model.DriftMetrics)

Responses

Request samples

Content type
application/json
{
  • "description": "string",
  • "name": "string",
  • "policy": {
    }
}

Response samples

Content type
application/json
{
  • "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"
}

evaluations

Create evaluation

Create a new evaluation

Request Body schema: application/json
required

Evaluation creation request

benchmark_id
required
string
checkpoint_id
required
string
gpu_count
required
integer

Responses

Request samples

Content type
application/json
{
  • "benchmark_id": "string",
  • "checkpoint_id": "string",
  • "gpu_count": 0
}

Response samples

Content type
application/json
{
  • "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"
}

favorites

Unfavorite an item

Remove the current user's star. Idempotent — removing a star that is not there succeeds.

path Parameters
itemId
required
string

Item ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/favorites/{itemId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "favorited": false,
  • "item_id": "fav_1a2b3c4d5e6f708192a3b4c5",
  • "item_type": "example"
}

Favorite an item

Star an item for the current user. Idempotent — starring twice succeeds.

path Parameters
itemId
required
string

Item ID

Responses

Request samples

curl -X PUT "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/favorites/{itemId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "favorited": false,
  • "item_id": "fav_1a2b3c4d5e6f708192a3b4c5",
  • "item_type": "example"
}

folders

List folders

Retrieve folders in the current space with pagination

query Parameters
limit
integer
Default: 10

limit

after
string

after

name
string

name filter

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create folder

Create a new folder in the current space

Request Body schema: application/json
required

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 oneof= belongs here the day the picker that produces these values lands.

description
string
name
required
string <= 120 characters

Responses

Request samples

Content type
application/json
{
  • "color": "string",
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

Move items into a folder

File items into a folder, or unfile them by passing a null folder_id. Membership is exclusive, so the previous folder is simply replaced.

Request Body schema: application/json
required

Items and destination folder

folder_id
string
item_ids
required
Array of strings [ 1 .. 200 ] items

Responses

Request samples

Content type
application/json
{
  • "folder_id": "string",
  • "item_ids": [
    ]
}

Response samples

Content type
application/json
{
  • "folder_id": "fld_1a2b3c4d5e6f708192a3b4c5",
  • "moved": 1
}

Folder summary

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.

query Parameters
item_type
string
Default: "data_profiles"

Entity type to count

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders/summary" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "favorites_count": 8,
  • "folders": [
    ],
  • "item_type": "example",
  • "total": 1,
  • "unfiled_count": 8
}

Delete folder

Delete a folder by ID. Its contents are moved back to Unfiled, and the response reports how many.

path Parameters
id
required
string

Folder ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "unfiled_count": 8
}

Get folder

Retrieve a folder by ID

path Parameters
id
required
string

Folder ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/folders/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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 folder

Update a folder by ID

path Parameters
id
required
string

Folder ID

Request Body schema: application/json
required

Folder update request

color
string <= 40 characters
description
string
name
string <= 120 characters

Responses

Request samples

Content type
application/json
{
  • "color": "string",
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

inference-servers

List inference servers

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create inference server

Request Body schema: application/json
required

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

  • no-new-files behavior). Previously the decoder dropped it.
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.

Responses

Request samples

Content type
application/json
{
  • "architecture": "string",
  • "auto_batch_config": {
    },
  • "checkpoint_id": "string",
  • "compile": true,
  • "compile_mode": "regional",
  • "connectors": {
    },
  • "cortex_image": "string",
  • "data_model_id": "string",
  • "datavolume_name": "string",
  • "datavolume_subpath": "string",
  • "embedding_quant": {
    },
  • "endpoint": {
    },
  • "engine_scaling": {
    },
  • "engine_yaml": {
    },
  • "inference_type": "batch",
  • "inference_version": "string",
  • "instances": 0,
  • "mode": "online",
  • "model_path": "string",
  • "model_source": "checkpoint",
  • "scaling": {
    },
  • "schedule": {
    },
  • "scheduled_batch": {
    },
  • "space": "string",
  • "tag": "string",
  • "topology": "split",
  • "training_id": "string",
  • "weight_load": "standard"
}

Response samples

Content type
application/json
{
  • "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"
}

Preview the engine config YAML(s)

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.

path Parameters
spaceId
required
string

Space id

Request Body schema: application/json
required

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

  • no-new-files behavior). Previously the decoder dropped it.
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.

Responses

Request samples

Content type
application/json
{
  • "architecture": "string",
  • "auto_batch_config": {
    },
  • "checkpoint_id": "string",
  • "compile": true,
  • "compile_mode": "regional",
  • "connectors": {
    },
  • "cortex_image": "string",
  • "data_model_id": "string",
  • "datavolume_name": "string",
  • "datavolume_subpath": "string",
  • "embedding_quant": {
    },
  • "endpoint": {
    },
  • "engine_scaling": {
    },
  • "engine_yaml": {
    },
  • "inference_type": "batch",
  • "inference_version": "string",
  • "instances": 0,
  • "mode": "online",
  • "model_path": "string",
  • "model_source": "checkpoint",
  • "scaling": {
    },
  • "schedule": {
    },
  • "scheduled_batch": {
    },
  • "space": "string",
  • "tag": "string",
  • "topology": "split",
  • "training_id": "string",
  • "weight_load": "standard"
}

Response samples

Content type
application/json
{
  • "configs": { }
}

/v1/spaces/{spaceId}/inference-servers/{id}

path Parameters
id
required
string

Inference server ID

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}" \
  -H "x-api-key: $API_KEY"

/v1/spaces/{spaceId}/inference-servers/{id}

path Parameters
id
required
string

Inference server ID

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}" \
  -H "x-api-key: $API_KEY"

Patch inference server (lifecycle status)

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

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).

Responses

Request samples

Content type
application/json
{
  • "status": "canceled"
}

Response samples

Content type
application/json
{
  • "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"
}

/v1/spaces/{spaceId}/inference-servers/{id}

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

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

  • no-new-files behavior). Previously the decoder dropped it.
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.

Request samples

Content type
application/json
{
  • "architecture": "string",
  • "auto_batch_config": {
    },
  • "checkpoint_id": "string",
  • "compile": true,
  • "compile_mode": "regional",
  • "connectors": {
    },
  • "cortex_image": "string",
  • "data_model_id": "string",
  • "datavolume_name": "string",
  • "datavolume_subpath": "string",
  • "embedding_quant": {
    },
  • "endpoint": {
    },
  • "engine_scaling": {
    },
  • "engine_yaml": {
    },
  • "inference_type": "batch",
  • "inference_version": "string",
  • "instances": 0,
  • "mode": "online",
  • "model_path": "string",
  • "model_source": "checkpoint",
  • "scaling": {
    },
  • "schedule": {
    },
  • "scheduled_batch": {
    },
  • "space": "string",
  • "tag": "string",
  • "topology": "split",
  • "training_id": "string",
  • "weight_load": "standard"
}

Configure the context store

Persist how much cached context the online endpoint keeps per user.

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

Context configuration

enabled
boolean
lookback_window
string
max_len
integer
min_context
integer
mismatch_strategy
string

Responses

Request samples

Content type
application/json
{
  • "enabled": true,
  • "lookback_window": "string",
  • "max_len": 0,
  • "min_context": 0,
  • "mismatch_strategy": "string"
}

Response samples

Content type
application/json
{
  • "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"
}

Inference server dashboard

Throughput, latency and engine health for the server over a rolling window.

path Parameters
id
required
string

Inference server ID

query Parameters
window
string
Default: "1h"

Dashboard window as a Go duration (e.g. 1h)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/dashboard" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "alerts": [
    ],
  • "engines": {
    },
  • "kpis": {
    },
  • "online": {
    },
  • "recent_runs": [
    ],
  • "resources": {
    },
  • "scaling": [
    ],
  • "time_series": {
    },
  • "window": "example"
}

Get decision thresholds

The score cut-offs the server applies when turning a prediction into a decision.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/decision-thresholds" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "targets": [
    ]
}

Current engine config YAML(s) for a provisioned server

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.

path Parameters
spaceId
required
string

Space id

id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/engine-config" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "configs": { }
}

Reconfigure a provisioned server's engine YAML

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.

path Parameters
spaceId
required
string

Space id

id
required
string

Inference server ID

Request Body schema: application/json
required

Per-role engine YAML

object
property name*
additional property
string

Responses

Request samples

Content type
application/json
{
  • "engine_yaml": {
    }
}

Response samples

Content type
application/json
{
  • "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"
}

Manually scale a role's replica bounds

Bump one role's (embedding | backbone | server) ScalingGroup min/max replica bounds on demand. Floored to min >= 1, max >= min.

path Parameters
id
required
string

Inference server ID

role
required
string

Role (embedding | backbone | server)

Request Body schema: application/json
required

New bounds

max
integer
min
integer

Responses

Request samples

Content type
application/json
{
  • "max": 0,
  • "min": 0
}

Response samples

Content type
application/json
{
  • "max": 4,
  • "min": 1,
  • "role": "example"
}

Get the served model

The checkpoint the server serves, its parameter counts, and the input and target views a caller must fill.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/model" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "info": {
    },
  • "input_views": [
    ],
  • "target_views": [
    ]
}

Get the served model layout

The model's tensor/shard layout as published by the engine, forwarded verbatim.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/model/layout" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

Configure monitoring settings

Set the drift and quality monitoring the server runs against its own traffic.

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

Monitoring settings

critical_ks_d
required
number <= 1
object (request.ConfigureDecisionThresholdRequest)
warn_ks_d
required
number <= 1

Responses

Request samples

Content type
application/json
{
  • "critical_ks_d": 1,
  • "decision_threshold": {
    },
  • "warn_ks_d": 1
}

Response samples

Content type
application/json
{
  • "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"
}

Start the online server

Bring up the online (synchronous) inference endpoint. Accepted immediately; the server reports READY through its status.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Get online server connection details

The URL and credentials a client needs to call the online endpoint.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server/connection" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "health_check": {
    },
  • "http_endpoint": {
    },
  • "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
  • "job_name": "churn-propensity-v3",
  • "leader_task": "example",
  • "metrics_endpoint": {
    },
  • "node_ip": "example",
  • "node_name": "churn-propensity-v3"
}

Get engine replica state

Per-role (embedding | backbone | server) replica counts and readiness, forwarded from the scaling groups.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server/replicas" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

Stop the online server

Tear the online endpoint down and release its engine replicas.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/online-server/stop" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Send a test request to the online server

Run one inference against the live endpoint and return the raw response, for smoke-testing a deploy.

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

Test inference payload

body
required
Array of integers
path
required
string

Responses

Request samples

Content type
application/json
{
  • "body": [
    ],
  • "path": "string"
}

Response samples

Content type
application/json
{
  • "body": [
    ],
  • "body_text": "example",
  • "elapsed_ms": 1,
  • "status": 1,
  • "truncated": false
}

Resume (redeploy) a canceled or failed inference server

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/resume" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
No sample

batch-inference-runs

Preview the batch-inference recipe

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.

path Parameters
spaceId
required
string

Space id

id
required
string

Inference server id

Request Body schema: application/json
required

Batch run create payload

object

AnchorSource scores each client at the positions named by a dataset/file instead of at a single date (cortex dataset.anchor_datasets); mutually exclusive with flags.infer_target_date.

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 "|"). Omit entirely to reproduce training exactly.

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)

Responses

Request samples

Content type
application/json
{
  • "anchor_source": {
    },
  • "checkpoint_id": "string",
  • "event_dataset_ids": [
    ],
  • "event_dataset_shifts": {
    },
  • "event_datasets_local": [
    ],
  • "flags": {
    },
  • "inference_version": "string",
  • "output": {
    },
  • "parallelism": {
    },
  • "pool": {
    },
  • "recipe_yaml": "string",
  • "time_range": {
    }
}

Response samples

Content type
application/json
{
  • "recipe_yaml": "example"
}

context-store

Clear the server's context store

Destructive: wipes every cached context for the server.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

List the server's context-store builds

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/builds" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

Start a context-store build

Spawns one embedding-cache build job per dataset to populate the server's context store.

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

Build configuration

Array of objects (request.ContextStoreBuildDatasetItem)
Array of objects (request.ContextStoreBuildLocalDatasetItem)

Responses

Request samples

Content type
application/json
{
  • "datasets": [
    ],
  • "datasets_local": [
    ]
}

Response samples

Content type
application/json
{
  • "build_id": "obj_1a2b3c4d5e6f708192a3b4c5",
  • "created_at": "2026-01-15T10:30:00Z",
  • "datasets": [
    ],
  • "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
  • "status": "PENDING"
}

Context-store occupancy

Proxies the context-store daemon's stats verbatim.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/occupancy" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

List users held in the context store

Proxies the context-store daemon's user listing verbatim; the query string is forwarded as-is.

path Parameters
id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/users" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

Preview one user's cached context

Proxies the context-store daemon's per-user context verbatim.

path Parameters
id
required
string

Inference server ID

userId
required
string

User ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/context-store/users/{userId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

drift

Drift heatmap for an inference server

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

query Parameters
granularity
string

Bucket granularity

start
string

Range start (RFC3339)

end
string

Range end (RFC3339)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "baseline": { },
  • "granularity": "example",
  • "inference_server_id": "inf_1a2b3c4d5e6f708192a3b4c5",
  • "targets": { }
}

Baseline drift report of an inference server

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/baseline/report" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

List a server's drift reports

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

query Parameters
limit
integer

Page size

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/reports" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • {
    }
]

Drift report of one batch inference run

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

runId
required
string

Batch inference run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/runs/{runId}/report" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Re-run drift analysis for a batch inference run

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

runId
required
string

Batch inference run ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/runs/{runId}/retry" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Drift detail for one target

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

target
required
string

Target name

query Parameters
column
string

Column filter

class
string

Class filter

granularity
string

Bucket granularity

start
string

Range start (RFC3339)

end
string

Range end (RFC3339)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/drift/targets/{target}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "baseline": {
    },
  • "class": "example",
  • "column": "event_ts",
  • "periods": [
    ],
  • "target": "example"
}

Drift detail for one target period

path Parameters
spaceId
required
string

Space ID

id
required
string

Inference server ID

target
required
string

Target name

periodId
required
string

Drift period ID

Responses

Request samples

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"

Response samples

Content type
application/json
{
  • "baseline_full": {
    },
  • "profile_period": {
    },
  • "target": "example"
}

stress-runs

List a server's stress runs

path Parameters
id
required
string

Inference server ID

query Parameters
limit
integer

Page size

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/inference-servers/{id}/stress-runs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create a stress run for a server

path Parameters
id
required
string

Inference server ID

Request Body schema: application/json
required

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

Responses

Request samples

Content type
application/json
{
  • "breaker": {
    },
  • "events_per_request": 0,
  • "payload": {
    },
  • "stages": [
    ],
  • "timeout_ms": 0,
  • "unique_field": "string",
  • "warmup_s": 0
}

Response samples

Content type
application/json
{
  • "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"
}

Get a stress run

path Parameters
id
required
string

Stress run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/stress-runs/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Cancel a stress run

path Parameters
id
required
string

Stress run ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/stress-runs/{id}/cancel" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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"
}

Recent log lines of a stress run

Best-effort tail of the stress job's logs; empty while the job runs healthy.

path Parameters
id
required
string

Stress run ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/stress-runs/{id}/logs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

leaderboards

List leaderboards

Retrieve a paginated list of checkpoints grouped with their metrics for leaderboard display

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/leaderboards" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ],
  • "has_more": false
}

model-designs

List design models

query Parameters
kind
string

model_input or model_output

status
string

draft or published

name
string

name substring filter

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "data": [
    ]
}

Create design model

Create a new design model (input or output). The created_by

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "data_preprocesses": [
    ],
  • "description": "string",
  • "kind": "model_input",
  • "name": "string",
  • "time_ranges": {
    }
}

Response samples

Content type
application/json
{
  • "archived_at": "2026-01-15T10:30:00Z",
  • "config_snapshot": { },
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "data_preprocesses": [
    ],
  • "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
}

Delete a design model

Soft-deletes the design (stamps deleted_at). The row is kept

path Parameters
id
required
string

Design model ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "error": "example"
}

Get design model

path Parameters
id
required
string

Design model ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "archived_at": "2026-01-15T10:30:00Z",
  • "config_snapshot": { },
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "data_preprocesses": [
    ],
  • "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
}

Archive a design model

Marks the design as archived. Archived designs remain in the

path Parameters
id
required
string

Design model ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}/archive" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "archived_at": "2026-01-15T10:30:00Z",
  • "config_snapshot": { },
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "data_preprocesses": [
    ],
  • "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
}

Save draft config snapshot

Persists config_snapshot on a draft design without changing

path Parameters
id
required
string

Design model ID

Request Body schema: application/json
required

Snapshot body

required
object
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "config_snapshot": {
    }
}

Response samples

Content type
application/json
{
  • "archived_at": "2026-01-15T10:30:00Z",
  • "config_snapshot": { },
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "data_preprocesses": [
    ],
  • "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
}

Publish a design model

Flips a draft design to published, persists the snapshot and

path Parameters
id
required
string

Design model ID

Request Body schema: application/json
required

Snapshot body

required
object
property name*
additional property
any

Responses

Request samples

Content type
application/json
{
  • "config_snapshot": {
    }
}

Response samples

Content type
application/json
{
  • "archived_at": "2026-01-15T10:30:00Z",
  • "config_snapshot": { },
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "data_preprocesses": [
    ],
  • "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
}

Unarchive a design model

Clears the archived flag, returning the design to its active

path Parameters
id
required
string

Design model ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-designs/{id}/unarchive" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "archived_at": "2026-01-15T10:30:00Z",
  • "config_snapshot": { },
  • "created_at": "2026-01-15T10:30:00Z",
  • "created_by": {
    },
  • "data_preprocesses": [
    ],
  • "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
}

model-endpoints

List model endpoints

path Parameters
spaceId
required
string

Space ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • {
    }
]

Deploy a model endpoint

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.

path Parameters
spaceId
required
string

Space ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "kv_offload": "string",
  • "max_context_tokens": 0,
  • "name": "string",
  • "port": 0,
  • "profile_id": "string",
  • "scaling": {
    },
  • "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"
}

Response samples

Content type
application/json
{
  • "address": {},
  • "context_pool": {
    },
  • "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": {
    },
  • "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"
}

List weight staging progress

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.

path Parameters
spaceId
required
string

Space ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/weight-stages" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
[
  • {
    }
]

Delete a model endpoint

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.

path Parameters
spaceId
required
string

Space ID

id
required
string

Model endpoint ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{ }

Get a model endpoint

path Parameters
spaceId
required
string

Space ID

id
required
string

Model endpoint ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "address": {},
  • "context_pool": {
    },
  • "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": {
    },
  • "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"
}

Live serving metrics for a model endpoint

path Parameters
spaceId
required
string

Space ID

id
required
string

Model endpoint ID

query Parameters
window
string

Lookback window (e.g. 15m, 1h)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}/metrics" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": {
    },
  • "shared_hit_rate": 0.5,
  • "tpot_avg_ms": 0.5,
  • "ttft_avg_ms": 0.5,
  • "window_seconds": 1
}

Shared KV pool metrics

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.

path Parameters
spaceId
required
string

Space ID

id
required
string

Model endpoint ID

query Parameters
window
string

Time window, e.g. 30m or 6h (default 30m)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}/pool/metrics" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": {
    },
  • "tokens_per_sec": 0.5,
  • "tokens_saved_per_sec": 0.5,
  • "transport": "example",
  • "window_seconds": 1
}

Resize a model endpoint's fleet

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.

Authorizations:
ApiKeyAuth
path Parameters
spaceId
required
string

Space ID

id
required
string

Model endpoint ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "cooldown_seconds": 0,
  • "max": 0,
  • "min": 0,
  • "target": 0
}

Response samples

Content type
application/json
{
  • "address": {},
  • "context_pool": {
    },
  • "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": {
    },
  • "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"
}

OpenAI-compatible inference

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.

path Parameters
spaceId
required
string

Space ID

id
required
string

Model endpoint ID

upstream
required
string

Upstream path, e.g. /chat/completions

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/model-endpoints/{id}/v1/{upstream}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
No sample

served-models

List servable models

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.

path Parameters
spaceId
required
string

Space ID

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/served-models" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "items": [
    ],
  • "observed_at": "2026-01-15T10:30:00Z"
}

Declare a model in the catalog

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.

path Parameters
spaceId
required
string

Space ID

Request Body schema: application/json
required

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 repository:tag que SUBSTITUI a matriz de arquitetura no deploy deste modelo. Opcional, e é o par natural dos engine args: quem precisa de um vLLM com patch próprio precisa das duas coisas.

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. Name é como o engine endereça o modelo (e o que a API do endpoint devolve em model); DisplayName é o que a tela mostra.

node_fraction
number
nodes
required
integer [ 1 .. 16 ]
params_b
required
number

Tamanho. ParamsB e ActiveParamsB andam juntos porque num MoE o ativo prevê velocidade e o total prevê custo -- quem serve lê os dois de uma vez.

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.

WeightsSource decide como Ref é lido:

  • hub (default): id de repositório que o deploy BAIXA e estagia;
  • path: diretório que já tem os pesos (mount compartilhado ou /localdisk);
  • hub_cache: id de repositório que o engine resolve do cache do HF do PRÓPRIO nó, offline -- nada é baixado nem estagiado, e HF_HUB_CACHE no env diz onde a árvore está.

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.

Responses

Request samples

Content type
application/json
{
  • "active_params_b": 0,
  • "autoregressive": true,
  • "capabilities": [
    ],
  • "context_pool_supported": true,
  • "data_parallel": 0,
  • "display_name": "string",
  • "engine_args": {
    },
  • "env": {
    },
  • "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"
}

Response samples

Content type
application/json
{
  • "active_params_b": 0.5,
  • "autoregressive": false,
  • "capabilities": [
    ],
  • "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": [
    ],
  • "reasoning_parser": "Example message",
  • "runtime": "vllm",
  • "source": "builtin",
  • "strategies": [
    ],
  • "tokenizer_mode": "REDACTED",
  • "tool_call_parser": "example",
  • "trust_remote_code": false,
  • "updatedAt": "example",
  • "variants": [
    ]
}

Preview the configurations available for a model

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.

path Parameters
spaceId
required
string

Space ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "max_context_tokens": 0,
  • "model_id": "string",
  • "model_name": "string",
  • "replicas": 0
}

Response samples

Content type
application/json
{
  • "availability": "example",
  • "blocked": "example",
  • "capacity": [
    ],
  • "cells": [
    ],
  • "display_name": "Churn propensity",
  • "model_id": "dm_1a2b3c4d5e6f708192a3b4c5",
  • "model_name": "churn-propensity",
  • "observed_at": "2026-01-15T10:30:00Z"
}

Remove a model from the catalog

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.

path Parameters
spaceId
required
string

Space ID

servedModelId
required
string

Served model ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/served-models/{servedModelId}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "message": "Example message",
  • "outcome": "deleted"
}

trainings

Get all trainings

Retrieve a list of training jobs with cursor pagination and optional filters

query Parameters
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)

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "count": 8,
  • "data": [
    ],
  • "has_more": false
}

Create training

Create a new training job

Request Body schema: application/json
required

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)

Responses

Request samples

Content type
application/json
{
  • "advanced_fields": {
    },
  • "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": {
    },
  • "schedule": {
    },
  • "target_datasets": [
    ],
  • "time_ranges": {
    },
  • "training_datasets": [
    ]
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Preview resolved training/target datasets

Resolves what StartTraining would compute for event/feature/

query Parameters
model_input_id
string

Model Input design id

model_output_id
string

Model Output design id

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/dataset-preview" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "artifact_refs": [
    ],
  • "dataset_names": { },
  • "event_datasets": [
    ],
  • "feature_datasets": [
    ],
  • "filter_datasets": [
    ],
  • "needs_shared_bind": false,
  • "target_datasets": [
    ]
}

Save a training as a draft

Persist the minimum of a training wizard (name + project) so it can be reopened and finished later, without validating or resolving anything else yet

Request Body schema: application/json
required

Draft creation request

data_model_id
required
string
description
string
name
required
string

Responses

Request samples

Content type
application/json
{
  • "data_model_id": "string",
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Delete training

Delete a training job by ID

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X DELETE "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "id": "obj_1a2b3c4d5e6f708192a3b4c5"
}

Get training

Retrieve a training job by ID

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Update training

Update a training job by ID

path Parameters
id
required
string

Training ID

Request Body schema: application/json
required

Training update request

architecture
string
benchmark_ids
Array of strings
configuration
object
object (request.UpdateConnectorTraining)
name
string

Responses

Request samples

Content type
application/json
{
  • "architecture": "string",
  • "benchmark_ids": [
    ],
  • "configuration": { },
  • "connector": {
    },
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Cancel training

Cancel a training job by ID (stops the job but preserves the training record)

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/cancel" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Update a training draft's saved wizard state

Overwrite a Draft training's config_snapshot with whatever the wizard has filled in so far. Unvalidated until the draft is actually started.

path Parameters
id
required
string

Training ID

Request Body schema: application/json
required

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.

Responses

Request samples

Content type
application/json
{
  • "config_snapshot": {
    },
  • "description": "string",
  • "name": "string"
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Get logs

Retrieve logs for a training job by ID

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/logs" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "created_at": "2026-01-15T10:30:00Z",
  • "id": "log_1a2b3c4d5e6f708192a3b4c5",
  • "job_id": "log_1a2b3c4d5e6f708192a3b4c5",
  • "text": "example"
}

Download logs as TXT

Download all logs for a training job as a plain text file

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/logs/download" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
No sample

Get metrics

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.

path Parameters
id
required
string

Training ID

query Parameters
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

Responses

Request samples

curl -X GET "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/metrics" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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 training

Pause a running training: the neocore job is deleted but checkpoints persist, so the training can be resumed later

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/pause" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Resume training

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.

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/resume" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Update a scheduled training's start time

Replace the deferred start time of a Scheduled (not yet started) training

path Parameters
id
required
string

Training ID

Request Body schema: application/json
required

New schedule

required
object (model.TrainingSchedule)
start_at
string
timezone
string

Responses

Request samples

Content type
application/json
{
  • "schedule": {
    }
}

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}

Start a scheduled training now

Dispatch a Scheduled training immediately instead of waiting for its start time

path Parameters
id
required
string

Training ID

Responses

Request samples

curl -X POST "https://tenant.api.neospace.ai/v1/spaces/{spaceId}/trainings/{id}/start" \
  -H "x-api-key: $API_KEY"

Response samples

Content type
application/json
{
  • "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": [
    ],
  • "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"
}