Copied to clipboard
Skip to content

ORVYXOne endpoint. Every model.

One address, one key, one bill. Reach every model through a single link, with fallback and usage tracking built in. Pay by card or mobile money.

ORVYX
    1. Your applicationAny OpenAI SDK
    1. ORVYX/v1/chat/completionsAuth, routing, metering routes to 3 destinations
    1. orvyx/claude-fable-5streaming
    2. orvyx/gemini-3.7-flashstreaming
    3. orvyx/gpt-oss-120bstreaming
One endpoint
+500

models behind a single URL and a single key

Change one string to switch models. No new SDK, no new contract, no new invoice. The catalogue is browsable at GET /v1/models.

Chat JSON Tools Vision Embeddings
Popular models from
  • OpenAI
  • Anthropic
  • Google
  • DeepSeek
  • Meta
  • Mistral
  • Moonshot
Browse every model in the dashboard

Explore the documentation ​

Built for one line of code ​

Since ORVYX speaks the same language as OpenAI, switching over is one address and one key. Nothing else in your project changes. Here is a support assistant that streams an answer, in the language you already use.

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.orvyx-ai.com/v1",
    api_key="oryx_...",
)

stream = client.chat.completions.create(
    model="orvyx/claude-fable-5",
    messages=[
        {"role": "system", "content": "You are a concise support agent."},
        {"role": "user", "content": "My invoice shows a duplicate charge."},
    ],
    stream=True,
)

for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")
ts
import OpenAI from "openai"

const client = new OpenAI({
  baseURL: "https://api.orvyx-ai.com/v1",
  apiKey: process.env.ORVYX_API_KEY,
})

const stream = await client.chat.completions.create({
  model: "orvyx/claude-fable-5",
  messages: [
    { role: "system", content: "You are a concise support agent." },
    { role: "user", content: "My invoice shows a duplicate charge." },
  ],
  stream: true,
})

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "")
}
php
<?php
$ch = curl_init('https://api.orvyx-ai.com/v1/chat/completions');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . getenv('ORVYX_API_KEY'),
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'model' => 'orvyx/claude-fable-5',
        'messages' => [
            ['role' => 'system', 'content' => 'You are a concise support agent.'],
            ['role' => 'user', 'content' => 'My invoice shows a duplicate charge.'],
        ],
    ]),
]);

$res = json_decode(curl_exec($ch), true);
echo $res['choices'][0]['message']['content'] . PHP_EOL;
php
<?php

use Illuminate\Support\Facades\Http;

$res = Http::withToken(config('services.orvyx.key'))
    ->post('https://api.orvyx-ai.com/v1/chat/completions', [
        'model' => 'orvyx/claude-fable-5',
        'messages' => [
            ['role' => 'system', 'content' => 'You are a concise support agent.'],
            ['role' => 'user', 'content' => 'My invoice shows a duplicate charge.'],
        ],
    ])
    ->throw()
    ->json();

echo $res['choices'][0]['message']['content'];
go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
	"os"
)

func main() {
	body, _ := json.Marshal(map[string]any{
		"model": "orvyx/claude-fable-5",
		"messages": []map[string]string{
			{"role": "system", "content": "You are a concise support agent."},
			{"role": "user", "content": "My invoice shows a duplicate charge."},
		},
	})

	req, _ := http.NewRequest("POST", "https://api.orvyx-ai.com/v1/chat/completions", bytes.NewReader(body))
	req.Header.Set("Authorization", "Bearer "+os.Getenv("ORVYX_API_KEY"))
	req.Header.Set("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()

	var out struct {
		Choices []struct {
			Message struct {
				Content string `json:"content"`
			} `json:"message"`
		} `json:"choices"`
	}
	json.NewDecoder(res.Body).Decode(&out)

	fmt.Println(out.Choices[0].Message.Content)
}
rust
use serde_json::json;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let res = reqwest::Client::new()
        .post("https://api.orvyx-ai.com/v1/chat/completions")
        .bearer_auth(std::env::var("ORVYX_API_KEY")?)
        .json(&json!({
            "model": "orvyx/claude-fable-5",
            "messages": [
                {"role": "system", "content": "You are a concise support agent."},
                {"role": "user", "content": "My invoice shows a duplicate charge."}
            ]
        }))
        .send()
        .await?
        .json::<serde_json::Value>()
        .await?;

    println!("{}", res["choices"][0]["message"]["content"]);
    Ok(())
}
bash
curl https://api.orvyx-ai.com/v1/chat/completions \
  -H "Authorization: Bearer $ORVYX_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "orvyx/claude-fable-5",
    "messages": [
      { "role": "system", "content": "You are a concise support agent." },
      { "role": "user", "content": "My invoice shows a duplicate charge." }
    ]
  }'

Pay your way ​

Top up with the money you already have. Prepaid balance, no subscription, and the same rates whichever way you pay.

Mobile money
WaveOrange MoneyMTN MoMoMoov MoneyAirtel MoneyM-Pesa
Card
VisaMastercardPayPalApple PayGoogle Pay

Start here ​

  1. 1

    Issue a scoped key from the dashboard. It is shown once, so store it in a secret manager.

  2. 2

    Send a chat completion with any OpenAI client by changing only the base URL.

  3. 3

    Copy-paste recipes for chat, streaming, tools, embeddings and structured output.

  4. 4

    One error envelope, stable codes and standard rate-limit headers on every response.

ORVYX is a proprietary AI platform. All rights reserved.