CORe API Docs
Docs Hub Dev Hub Chat Dashboard
Dashboard / API Documentation

CORe API

The CORe API is a fully OpenAI-compatible REST API for CORe 6.2 and CORe 6.1. You can use any OpenAI SDK or HTTP client by pointing the base URL to https://opencore.one/v1.

Base URL: https://opencore.one/v1 Spec: OpenAI-compatible Auth: Bearer token

Introduction #

The CORe API provides programmatic access to CORe's flagship language models. It follows the OpenAI API specification, meaning existing code written for OpenAI's API works with minimal changes.

All requests require authentication via a Bearer token. Responses are returned as JSON. Streaming (Server-Sent Events) is supported for real-time response delivery.

Quick Start #

  1. Create an API key from the Dev Hub -- open your dashboard, click the Dev Hub card, then select API keys in the left sidebar and press Create API key. Copy the key immediately -- it is shown only once.
  2. Set your base URL to https://opencore.one/v1 and authenticate with Authorization: Bearer <your-key>.
  3. Send a request to /v1/chat/completions with your messages array.
Tip: The default model is core-ex2 (CORe EX2). You can also use core-pico-4. See the models table.

Authentication #

Every API request must include an Authorization header with your API key:

Header
Authorization: Bearer ck-your-api-key-here

API keys are prefixed with ck- and are 64-character hex strings. They are hashed (SHA-256) before storage -- only you ever see the raw key.

Security: Never commit API keys to source control or expose them in client-side code. Rotate keys regularly from the Dev Hub → API keys tab.

Rate Limits #

Rate limits depend on your account role. Untrusted users have hourly and daily caps. Trusted users get higher daily limits. Admins and Owners have unlimited access.

Overall Rate Limit
15
requests / min (all tiers)
Untrusted Hourly
50
requests / hour
Untrusted Daily
100
requests / day
Trusted Hourly
150
requests / hour
Trusted Daily
5000
requests / day
Admin / Owner
∞
unlimited

If you exceed a limit, the API returns HTTP 429 Too Many Requests with a Retry-After header indicating when you can resume.

GET /v1/models #

List all available models. Identical to the OpenAI /v1/models endpoint.

GET /v1/models
Returns a paginated list of available models with metadata.
Example Request
curl https://opencore.one/v1/models \
  -H "Authorization: Bearer ck-your-key-here"
Example Response
{
  "object": "list",
  "data": [
    {
      "id": "core-ex2",
      "object": "model",
      "created": 1715000000,
      "owned_by": "core-technologies"
    },
    {
      "id": "core-pico-4",
      "object": "model",
      "created": 1714000000,
      "owned_by": "core-technologies"
    }
  ]
}

POST /v1/chat/completions #

The primary endpoint for chat completions. Accepts a conversation history and returns a model response. Supports both standard (blocking) and streaming (real-time) modes.

POST /v1/chat/completions
Creates a model response for the given conversation. Compatible with all OpenAI SDKs.

Request Body

Field Type Required Description
model string Yes Model ID. Default: core-ex2
messages array Yes Conversation history. Roles: system, user, assistant, tool
stream boolean No If true, returns SSE stream. Default: false
temperature number No Sampling temperature (0-2). Default: inherited from upstream
max_tokens integer No Maximum output tokens. max_completion_tokens is also accepted and takes precedence.
reasoning_effort string No Not supported on the current model lineup. Requests that set it are rejected with invalid_reasoning_budget.
reasoning_budget string | integer No Not supported on the current model lineup. Requests that set it are rejected with invalid_reasoning_budget. thinking_budget is accepted as an alias.
stream_options object No Set {"include_usage":true} to receive streaming token usage, including available reasoning-token details.
top_p number No Nucleus sampling parameter
tools array No List of tool definitions for function calling
tool_choice string | object No Controls tool usage: auto, none, or force a specific tool

The current lineup includes xenon-9, core-ex2, and core-pico-4. Both are available in the chat app and the API.

Response Format

Non-streaming response:

Example Response
{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1715000000,
  "model": "core-ex2",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "Hello! How can I help you today?"
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 8,
    "total_tokens": 20
  }
}

Streaming (SSE)

When stream: true, the API returns Server-Sent Events. Each event is a JSON fragment containing a delta with partial content. The final event contains finish_reason.

The stream sends keep-alive comments during hidden reasoning. Treat a data: {"error":...} event as a failure, even if followed by [DONE]; interrupted generations are never reported as successful completions. Default server limits are 90 seconds without upstream data and 15 minutes total, including at max effort. Prefer streaming for long reasoning requests to avoid client or proxy timeouts.

While a model is reasoning, streaming responses may include short status summaries describing what the model is currently working on, wrapped in <sbegin>...</sbegin> markers. Once reasoning completes, the final reasoning content is an encrypted string. This is done on purpose.

Streaming Request
curl https://opencore.one/v1/chat/completions \
  -H "Authorization: Bearer ck-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "core-ex2",
    "messages": [{"role": "user", "content": "Say hello"}],
    "stream": true
  }'

Multimodal Input (Image & Video)

Vision- and video-capable models accept the standard OpenAI multimodal content-parts format: the content field of a user message can be an array of parts, each part being text, image_url, or video_url.

Video support: Only xenon-9 accepts video_url parts. Sending video to any other model returns 400 video_not_supported. Images are supported on all vision-capable models.

Supported URL formats

Image + Text Request
{
  "model": "xenon-9",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "What's in this image?" },
        {
          "type": "image_url",
          "image_url": { "url": "https://example.com/photo.jpg" }
        }
      ]
    }
  ]
}
Video + Text Request
{
  "model": "xenon-9",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "Summarize what happens in this video." },
        {
          "type": "video_url",
          "video_url": { "url": "https://example.com/clip.mp4" }
        }
      ]
    }
  ]
}
Multiple Media Items in One Message
{
  "model": "xenon-9",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "Compare this image to the video." },
        { "type": "image_url", "image_url": { "url": "https://example.com/a.jpg" } },
        { "type": "video_url", "video_url": { "url": "https://example.com/b.mp4" } }
      ]
    }
  ]
}
Python (OpenAI SDK) — Video + Text
from openai import OpenAI

client = OpenAI(
    base_url="https://opencore.one/v1",
    api_key="ck-your-key-here",
)

response = client.chat.completions.create(
    model="xenon-9",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Describe this video in one sentence."},
                {
                    "type": "video_url",
                    "video_url": {"url": "https://example.com/clip.mp4"},
                },
            ],
        }
    ],
)
print(response.choices[0].message.content)

Per-request limits

Each media URL is fetched server-side, so the URL-based caps are what matter in practice. Files over the per-item cap are replaced with a descriptive text marker so the model still sees a coherent prompt instead of a broken reference.

LimitValue
Max images per request96
Max videos per request12
Max total media per request (URL)240 MB
Max size per image (URL)80–90 MB
Max request body (when using data: URIs)8 MB

Accepted MIME types

Optional: image_url.detail

You can pass detail: "low" | "high" | "original" | "auto" alongside image_url.url to control preprocessing resolution. When in doubt, use auto. Higher detail produces more tokens and costs proportionally more.

Hosting the file: If your URL is behind auth, on a private network, or otherwise unreachable from the public internet, the fetch will fail and the attachment is replaced with a marker. Either make the URL publicly reachable for the duration of the request, or send the file as a small data: URI (under ~7 MB after base64).

Tool Calling

CORe 6.2 natively supports tool calling (function calling). Pass a tools array and optionally tool_choice to enable it.

Tool Calling Example
{
  "model": "core-ex2",
  "messages": [{"role": "user", "content": "What's the weather?"}],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "get_weather",
        "description": "Get weather for a location",
        "parameters": {
          "type": "object",
          "properties": {
            "location": { "type": "string" }
          },
          "required": ["location"]
        }
      }
    }
  ],
  "tool_choice": "auto"
}
Tool Call Format: The model will return tool_calls in the assistant message instead of regular content. Pass the tool result back as a tool role message.

Available Models #

Model ID Name Description Status
core-pico-4 CORe Pico 4 Our smallest model. Runs in-house. Available
core-ex2 CORe EX2 Newest generation. Sharpest answers. Available
xenon-9 Xenon 9 Full general-use flagship. Available
xenon-9-code Xenon 9 Code Coding-specialized Xenon 9. Available
xenon-9s Xenon 9s Small, fast general-use variant. Available

Error Handling #

The API uses standard HTTP status codes and returns JSON error bodies:

Status Meaning Resolution
401 Unauthorized; invalid or missing API key Check your Authorization header
429 Rate limit exceeded Wait for Retry-After seconds
404 Model not found Use a valid model ID from the list
500 Upstream error Retry or contact support
503 video_provider_unavailable — video input temporarily unavailable Retry later, or send a text/image-only request. Contact support if the issue persists.
Upstream Errors: If both Genesis AND Exodus is unavailable, the API returns 503 Service Unavailable with a clear error message.

SDK Examples #

cURL

Basic Request
curl https://opencore.one/v1/chat/completions \
  -H "Authorization: Bearer ck-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "core-ex2",
    "messages": [{"role": "user", "content": "Hello"}],
    "stream": false
  }'
Streaming Request
curl https://opencore.one/v1/chat/completions \
  -H "Authorization: Bearer ck-your-key-here" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "core-ex2",
    "messages": [{"role": "user", "content": "Count to 10"}],
    "stream": true
  }'

Python

Using OpenAI SDK
from openai import OpenAI

client = OpenAI(
    base_url="https://opencore.one/v1",
    api_key="ck-your-key-here",
)

response = client.chat.completions.create(
    model="core-ex2",
    messages=[{"role": "user", "content": "Hello"}],
)
print(response.choices[0].message.content)
Streaming with Python
for chunk in client.chat.completions.create(
    model="core-ex2",
    messages=[{"role": "user", "content": "Hello"}],
    stream=True,
):
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

JavaScript / TypeScript

Using OpenAI SDK
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://opencore.one/v1",
  apiKey: "ck-your-key-here",
  dangerouslyAllowBrowser: true,
});

const response = await client.chat.completions.create({
  model: "core-ex2",
  messages: [{ role: "user", content: "Hello" }],
});

console.log(response.choices[0].message.content);
Streaming with JavaScript
const stream = await client.chat.completions.create({
  model: "core-ex2",
  messages: [{ role: "user", content: "Hello" }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content || "");
}

CORe API · OpenAI-compatible · Manage Keys

© 2026 CORe Technologies. All rights reserved.