VoidnetVoid Docs
LLM

LLM Buyer Guide

Call AI models through Voidnet with the OpenAI SDK.

Call a publisher's AI model through Voidnet. One model per app, billed per token. Use the OpenAI SDK — just change the base_url.

Credentials

Use an API key from Voidnet Console → API Keys (vnb-sk-*) or a short-lived JWT from POST /oauth/token (grant_type=client_credentials, scope=llm:completions). The gateway accepts both.

Find an app

Browse the Voidnet Marketplace and note the publisher's username, the app name, and the model ID listed on the app page (for example Qwen/Qwen2.5-7B-Instruct). Each app serves exactly one model — the model in your request must match it.

Get access

Apps offer free tiers, paid tiers, or both. Purchase in the Marketplace to gain access:

  • Free tier — tap Get Free. Access is instant, no payment.
  • Paid tier — tap Subscribe/Purchase. Paid access runs on wallet: the price is deducted from your wallet balance (one-time/setup charge at grant, plus per-token charges per call on usage-based apps). Top up first if your balance is short.
  • Upgrade — own free and want paid? The app page shows an Upgrade button that moves you to the paid tier. Your free access is revoked automatically when the paid grant completes. There is exactly one active tier per app.

Top up at Voidnet Console → Wallet: $5–$1000 per top-up via Stripe Checkout. You return to the wallet page and the balance credits automatically.

Call it

cURL

curl -X POST https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm \
  -H "Authorization: Bearer vnb-sk-a1b2c3..." \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-7B-Instruct","messages":[{"role":"user","content":"Write a haiku"}],"temperature":0.7,"max_tokens":64,"stream":false}'

Response (OpenAI-compatible):

{
  "id": "chatcmpl-abc",
  "object": "chat.completion",
  "created": 1730000000,
  "model": "Qwen/Qwen2.5-7B-Instruct",
  "choices": [{"index":0,"message":{"role":"assistant","content":"An old pond..."},"finish_reason":"stop"}],
  "usage": {"prompt_tokens":10,"completion_tokens":12,"total_tokens":22}
}

Streaming

stream:true is supported (SSE, OpenAI shape). The gateway injects stream_options.include_usage:true when missing so the call stays metered. A stream whose publisher never sends a final usage chunk fails loudly instead of going unbilled.

curl -X POST https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm \
  -H "Authorization: Bearer vnb-sk-a1b2c3..." \
  -H "Content-Type: application/json" \
  -d '{"model":"Qwen/Qwen2.5-7B-Instruct","messages":[{"role":"user","content":"hi"}],"stream":true}'

OpenAI SDK

from openai import OpenAI
client = OpenAI(base_url="https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm", api_key="vnb-sk-a1b2c3...")
response = client.chat.completions.create(model="Qwen/Qwen2.5-7B-Instruct", messages=[{"role":"user","content":"hi"}])
print(response.choices[0].message.content, response.usage.total_tokens)
import OpenAI from "openai"
const openai = new OpenAI({ baseURL: "https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm", apiKey: "vnb-sk-..." })
const response = await openai.chat.completions.create({ model: "Qwen/Qwen2.5-7B-Instruct", messages: [{role:"user",content:"hi"}] })

The only changes from a standard OpenAI call are the baseURL (your app's gateway URL) and the model (must match the app's published model).

Models listing

A read-only listing of the publisher's models (proxied from their server, OpenAI shape):

curl https://api.openvoidnet.com/v1-beta/llm/acmecorp/my-llm/models \
  -H "Authorization: Bearer vnb-sk-a1b2c3..."

Non-billable — no metering, no wallet charge.

Full interactive reference (parameters, responses, Try-it) for every LLM operation: LLM API.

Billing

Paid LLM apps price per 1M tokens (shown as $X/1M on the app page). Each call deducts total_tokens / 1M × price from your wallet; an empty wallet returns 402 insufficient_balance. Track spending per app in Voidnet Console → Usage.

Errors you will see

StatusCodeMeaning
401api_key_invalid / api_key_missingBad or missing credential
403app_not_purchasedNo live purchase — get the free tier or subscribe first
404app_not_foundWrong publisher username or app name
400invalid_requestMissing model/messages, bad JSON, or multimodal content (image_url, audio, video)
4xxpublisher_client_errorThe publisher's server rejected the request (for example unknown model) — body preserved
429rate_limit_exceededToo fast — back off and retry (see Rate Limiting)
429meter_limit_exceededMonthly tier quota used — wait for reset or upgrade tier
402insufficient_balanceWallet too low for a paid call — top up in Console → Wallet
502publisher_errorPublisher offline, invalid JSON, or stream without a usage chunk

Limits

  • TEXT only — content must be a string. image_url, audio, and video are rejected.
  • Only chat/completions for inference, plus the read-only models listing above — no embeddings.
  • Single model per app.

On this page