Native model inference

POST /v1/inference/{model_path}

Sends a JSON payload in the model's own request format to the specified model. The model path uses an organization/model-name format (e.g., deepseek-ai/DeepSeek-V4-Pro). The request body schema is model-dependent — consult the model's documentation for supported parameters.

Authentication

Bearer API key required.

Parameters

model_path (path) — Required

The model identifier in org/model-name format. Model identifiers may contain slash-separated segments. Generated SDKs may percent-encode / as %2F. DEVUP accepts both literal slash-separated paths and percent-encoded slash values (e.g., deepseek-ai/DeepSeek-V4-Pro or deepseek-ai%2FDeepSeek-V4-Pro).

string

Request body — Required

application/json

object

Free-form JSON payload forwarded to the model. The exact schema depends on the target model.

FieldType and description
webhookstring

Optional callback URL for asynchronous delivery of inference results. This field is honoured on this native inference endpoint only; it has no effect on the OpenAI-compatible endpoints.

format: "uri"

{
  "input": "Hello from Algeria!",
  "max_new_tokens": 256
}

Responses

HTTP 200

Inference completed successfully. Response schema is model-dependent.

application/json

object
FieldType and description
_devupschema
oneOf
object

Billing reservation metadata when webhook callback is requested.

FieldType and description
reserved_dzd
Required
number

Funds held in Algerian Dinar (DZD) pending completion.

status
Required
string

Allowed values: ["pending_settlement"]

request_idstring

Equal to the x-request-id response header.

pattern: "^req_[0-9a-f]{32}$"

Synchronous response (no webhook)
{
  "output": "Example model output",
  "_devup": {
    "request_id": "req_9fd8ddec5b2149539860a86dccba58cf"
  }
}
Asynchronous response (webhook specified)
{
  "id": "inf-9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
  "model": "deepseek-ai/DeepSeek-V4-Pro",
  "inference_status": {
    "status": "queued"
  },
  "_devup": {
    "request_id": "req_9fd8ddec5b2149539860a86dccba58cf"
  }
}

HTTP 400

Invalid request body or parameters.

application/json

ErrorResponse

ErrorResponse

{
  "error": {
    "message": "The \"model\" field is required.",
    "type": "devup_error",
    "code": "missing_model"
  }
}

HTTP 401

Missing, empty, or revoked API key. This response covers three distinct codes depending on the authentication path: - missing_api_key: Authorization header absent or Bearer token is empty. On GET /v1/models, GET /v1/models/{model}, GET /v1/me and GET /v1/me/avatar, which also accept the x-api-key header, the message is "Provide your API key as: Authorization: Bearer sk-devup-..., or in the x-api-key header." - invalid_api_key: Key not found, deactivated, or not valid. - token_revoked: The scoped JWT credential has been explicitly revoked.

application/json

ErrorResponse

ErrorResponse

Authorization header absent or empty Bearer token
{
  "error": {
    "message": "Provide your API key as: Authorization: Bearer sk-devup-...",
    "type": "devup_error",
    "code": "missing_api_key"
  }
}
Key not found, deactivated, or not valid
{
  "error": {
    "message": "The API key provided is invalid or has been deactivated.",
    "type": "devup_error",
    "code": "invalid_api_key"
  }
}
Scoped JWT credential has been explicitly revoked (scoped-token auth only)
{
  "error": {
    "message": "This scoped token has been revoked.",
    "type": "devup_error",
    "code": "token_revoked"
  }
}

HTTP 402

DZD balance depleted or scoped credential budget exhausted. - insufficient_balance: The DEVUP account has insufficient available balance. Also returned on POST /v1/chat/completions and POST /v1/responses for a request with a non-empty tools array that the balance does not cover in full. - budget_exhausted: The scoped credential has reached its configured budget. This code is never returned for unrestricted master API keys.

application/json

ErrorResponse

ErrorResponse

DEVUP account has insufficient available balance
{
  "error": {
    "message": "Your balance is depleted. Top up at https://devupai.com/dashboard/billing.",
    "type": "devup_error",
    "code": "insufficient_balance"
  }
}
Scoped credential budget exhausted (scoped-token auth only)
{
  "error": {
    "message": "Scoped token budget has been exhausted.",
    "type": "devup_error",
    "code": "budget_exhausted"
  }
}

HTTP 404

The requested model identifier was not found in the catalog. It is not retryable unless the model identifier is changed.

application/json

ErrorResponse

ErrorResponse

Model not found in catalog
{
  "error": {
    "message": "The requested model was not found.",
    "type": "devup_error",
    "code": "model_not_found"
  }
}

HTTP 429

Too many requests. error.code is rate_limit_exceeded (your account's per-minute limit), model_at_capacity (the model is momentarily at capacity; Retry-After: 5 and retry-after-ms: 5000, no X-RateLimit-* headers; the OpenAI and Anthropic SDKs retry it automatically), concurrency_limit_exceeded, tpm_limit_exceeded, or flex_capacity_unavailable. Wait the number of seconds in Retry-After before retrying.

application/json

ErrorResponse

ErrorResponse

Your account's per-minute limit is reached
{
  "error": {
    "message": "Rate limit exceeded. Please slow down your requests and try again shortly.",
    "type": "devup_error",
    "code": "rate_limit_exceeded"
  }
}
The model is momentarily at capacity
{
  "error": {
    "message": "This model is currently at capacity. Retry in a few seconds.",
    "type": "devup_error",
    "code": "model_at_capacity"
  }
}

HTTP 502

The model could not complete the request this time. Retry the request. A request that the model rejects is never returned as 502: it returns 400 with a specific code, such as tools_not_supported, conversation_must_end_with_user, empty_message_content, feature_not_supported, response_format_not_supported or invalid_request_error. - DEVUP_COMPUTE_ERROR: The model returned an empty or unreadable response, or could not complete the request this time. - response_truncated: The response stream was cut off before completing.

application/json

ErrorResponse

ErrorResponse

The model could not complete the request
{
  "error": {
    "message": "The model could not complete this request. Retry it; retrying usually succeeds.",
    "type": "devup_error",
    "code": "DEVUP_COMPUTE_ERROR"
  }
}
Response was cut off before completing
{
  "error": {
    "message": "The response was cut off before completing. Retrying will produce a complete response.",
    "type": "devup_error",
    "code": "DEVUP_COMPUTE_ERROR"
  }
}

HTTP 503

Requests are temporarily paused or the requested model is temporarily unavailable. Retry according to the delay communicated in Retry-After and/or retry-after-ms when present.

application/json

ErrorResponse

ErrorResponse

Requests are paused for a few seconds
{
  "error": {
    "message": "Requests are paused for a few seconds. Retry after the delay in the Retry-After header.",
    "type": "devup_error",
    "code": "service_unavailable"
  }
}
The requested model is temporarily unavailable
{
  "error": {
    "message": "The requested model is temporarily unavailable. Retry shortly.",
    "type": "devup_error",
    "code": "model_unavailable"
  }
}