📦 Buying in bulk? Message @SpaceTree1 on Telegram for bulk prices Chat now →
Telegram storeListingLab

AI API docs

Set up your key in Claude Code, Cursor, Cline, your own code and more. One key, every model, the OpenAI or the Anthropic API.

On this page
IntroductionQuick startClaude CodeCursorCline / Roo CodeKilo CodeOpenCodePythonNode.jscURL / HTTPOpenAI-compatible modeModels & token ratesYour key & usageErrorsFAQ

Introduction

One key for Claude, GPT, Gemini, DeepSeek, Grok, Qwen, GLM and Kimi, through the OpenAI and the Anthropic API.

Most AI apps, SDKs and coding tools let you set a base URL and an API key. Put ours in those two places and the tool talks to every model we carry, with no code to rewrite. A token pack gives you one key with that many tokens; every request takes tokens from it at the model's rate.

Base URL · OpenAI-compatiblehttps://listinglab.my/v1
Base URL · Anthropic / Claude Codehttps://listinglab.my
Two API formats, one key

OpenAI-compatible: https://listinglab.my/v1/chat/completions. Anthropic: https://listinglab.my/v1/messages. Both take the same key and use the same tokens; pick the one your tool speaks.

ListingLab is an independent reseller, not affiliated with Anthropic, OpenAI, Google or the other model makers. Model names belong to their owners.

Quick start

From buying a pack to your first answer, in five steps.

  1. Buy a token pack

    Pick one on the AI API page and pay by DuitNow QR or from your balance.

  2. Get your key

    It is made the moment you pay and sent to your Telegram chat. It is also on your order page and on My API keys, behind Show key.

  3. Check the key works

    Listing the models uses no tokens, so it is the safest first call. A list of model ids means the key is good.

    Terminal
    curl https://listinglab.my/v1/models \
      -H "Authorization: Bearer YOUR_KEY"
  4. Ask a model something

    This uses a few tokens. Any model id from the list works; see Models & token rates.

    Terminal
    curl https://listinglab.my/v1/chat/completions \
      -H "Authorization: Bearer YOUR_KEY" \
      -H "Content-Type: application/json" \
      -d '{"model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": "Hello"}]}'
  5. Plug it into your tool

    Set the base URL and the key in Claude Code, Cursor, Cline, OpenCode or your own code.

Claude Code

Claude Code reads its address and key from environment variables, so two settings point it at us.

  1. Install it

    Claude Code needs Node.js 18 or newer.

    Terminal
    npm install -g @anthropic-ai/claude-code
  2. Start it on macOS or Linux

    Set the two variables, then run claude in your project folder. Add the two export lines to ~/.zshrc or ~/.bashrc to keep them.

    Terminal
    export ANTHROPIC_BASE_URL="https://listinglab.my"
    export ANTHROPIC_API_KEY="YOUR_KEY"
    claude
  3. Start it on Windows (PowerShell)

    $env: sets them for this window; use setx to keep them.

    PowerShell
    $env:ANTHROPIC_BASE_URL = "https://listinglab.my"
    $env:ANTHROPIC_API_KEY = "YOUR_KEY"
    claude
  4. Or set it once in settings.json

    Claude Code reads ~/.claude/settings.json when it starts, so nothing needs exporting.

    ~/.claude/settings.json
    {
      "env": {
        "ANTHROPIC_BASE_URL": "https://listinglab.my",
        "ANTHROPIC_API_KEY": "YOUR_KEY"
      },
      "model": "claude-sonnet-4-6"
    }
  5. Pick a model

    Type /model inside Claude Code to switch, or set "model" above. Claude models suit it best.

    Claude Code
    /model claude-sonnet-4-6
If it asks about the API key, say yes

On the first start Claude Code asks whether to use the key it found; choose Yes. If you are logged in to Claude Code with an Anthropic account, run /logout first, and do not also set ANTHROPIC_AUTH_TOKEN.

Cursor

Cursor takes a custom OpenAI key and base URL in its model settings.

  1. Open the model settings

    Cursor Settings, then Models.

  2. Enter the key and base URL

    Under API Keys, paste your key in OpenAI API Key, turn on Override OpenAI Base URL and enter https://listinglab.my/v1. Then press Verify.

  3. Add the models you want

    Add each model by its exact id, such as claude-sonnet-4-6, and turn it on. Pick it in the chat.

Good to know

Your key is used for the models you add here. Some of Cursor’s own features, such as Tab completion, always run on Cursor’s models and do not use your key.

Cline / Roo Code

Both VS Code extensions take an OpenAI-compatible provider, with the same three fields.

  1. Choose the provider

    Open the extension’s settings and set API Provider to OpenAI Compatible. The Anthropic provider has no base URL field, so it cannot reach us.

  2. Fill in the connection

    The key goes in API Key; it is sent as a bearer token.

    Settings
    Base URL:  https://listinglab.my/v1
    API Key:   YOUR_KEY
    Model ID:  claude-sonnet-4-6

Kilo Code

Kilo Code connects through a custom OpenAI-compatible provider.

  1. Add a provider

    Open Settings, add a custom provider, and choose the OpenAI Compatible type.

  2. Name it and connect it

    The id is for Kilo; the display name is what the model picker shows.

    Settings
    Provider ID:   listinglab
    Display name:  ListingLab
    Base URL:      https://listinglab.my/v1
    API Key:       YOUR_KEY
  3. Add models

    Add each model id exactly as the model list shows it, then pick one.

OpenCode

OpenCode keeps the key in its own credential store, so it never lands in your project.

  1. Install it
    Terminal
    npm install -g opencode-ai
  2. Add the provider

    In ~/.config/opencode/opencode.json (every project) or an opencode.json in the project. There is no key in this file on purpose.

    opencode.json
    {
      "$schema": "https://opencode.ai/config.json",
      "provider": {
        "listinglab": {
          "npm": "@ai-sdk/openai-compatible",
          "name": "ListingLab",
          "options": {
            "baseURL": "https://listinglab.my/v1"
          },
          "models": {
            "claude-sonnet-4-6": {
              "name": "claude-sonnet-4-6"
            }
          }
        }
      }
    }
  3. Store the key

    Run OpenCode, type /connect, choose listinglab and paste your key. Then /models lists the models.

    Terminal
    opencode
    /connect

Python

The official OpenAI and Anthropic SDKs both work: change the base URL and the key.

OpenAI SDK

Terminal
pip install openai
Python
from openai import OpenAI

client = OpenAI(
    base_url="https://listinglab.my/v1",
    api_key="YOUR_KEY",
)

reply = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "Hello"}],
)
print(reply.choices[0].message.content)

Streaming

The words arrive as they are written. A streamed answer uses the same tokens as a whole one.

Python
stream = client.chat.completions.create(
    model="claude-sonnet-4-6",
    messages=[{"role": "user", "content": "Count to five"}],
    stream=True,
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

Anthropic SDK

Terminal
pip install anthropic
Python
import anthropic

client = anthropic.Anthropic(
    base_url="https://listinglab.my",
    api_key="YOUR_KEY",
)

message = client.messages.create(
    model="claude-sonnet-4-6",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
)
print(message.content[0].text)
Keep the key out of your code

Read it from an environment variable, for example os.environ["LISTINGLAB_AI_KEY"], so it never ends up in a file you share or commit.

Node.js

The official OpenAI package, with our base URL.

Terminal
npm install openai
JavaScript
import OpenAI from 'openai';

const client = new OpenAI({
  baseURL: 'https://listinglab.my/v1',
  apiKey: process.env.LISTINGLAB_AI_KEY,
});

const reply = await client.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages: [{ role: 'user', content: 'Hello' }],
});
console.log(reply.choices[0].message.content);

Streaming

JavaScript
const stream = await client.chat.completions.create({
  model: 'claude-sonnet-4-6',
  messages: [{ role: 'user', content: 'Count to five' }],
  stream: true,
});
for await (const chunk of stream) process.stdout.write(chunk.choices[0]?.delta?.content ?? '');

cURL / HTTP

Both formats over plain HTTP.

OpenAI format

The key goes in Authorization: Bearer.

Terminal
curl https://listinglab.my/v1/chat/completions \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "messages": [{"role": "user", "content": "Hello"}]}'

Anthropic format

The key goes in x-api-key, with the anthropic-version header.

Terminal
curl https://listinglab.my/v1/messages \
  -H "x-api-key: YOUR_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "max_tokens": 1024, "messages": [{"role": "user", "content": "Hello"}]}'

Streaming

Add "stream": true; the answer arrives as server-sent events and ends with data: [DONE].

Terminal
curl -N https://listinglab.my/v1/chat/completions \
  -H "Authorization: Bearer YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "claude-sonnet-4-6", "stream": true, "messages": [{"role": "user", "content": "Count to five"}]}'

OpenAI-compatible mode

Any OpenAI client works against https://listinglab.my/v1.

Requests and answers follow the OpenAI chat completions shape: system messages, temperature, top_p, max_tokens, stop and streaming. Tool calling (tools and tool_choice) is passed to the model as it is, so it works where the model supports it. Pictures go in as image_url parts, to models that can see.

Use the Anthropic format (/v1/messages) for tools built around it, such as Claude Code, and the OpenAI format for nearly everything else. Both cost the same tokens.

The answer

The text is in choices[0].message.content. The usage object gives prompt_tokens and completion_tokens: the tokens read and written, before the model's rate is applied.

Models & token rates

Each model takes tokens from your key at its own rate.

A request uses the tokens it reads (your message, and the whole chat so far) plus the tokens it writes, times the model's rate. At 1.8×, a request of 2,000 tokens takes 3,600 from your key; at 0.7× it takes 1,400. Cached input, text the model has seen moments before, is charged at the lower cached rate. Every request also carries about 400 tokens of the service’s own instructions. Requests that fail use nothing.

0 of 49 models answered at the last check, 2026-10-16 21:08:40. Every model is asked for one word every 30 minutes.

ModelToken rateCached inputStatus
claude-fable-5 2Ă— 0.9Ă—down
claude-fable-5-1 not published –down
claude-fable-5.1 not published –down
claude-haiku-4-5 not published –down
claude-opus-4-6 not published –down
claude-opus-4-7 1.6Ă— 0.7Ă—down
claude-opus-4-8 1.6Ă— 0.7Ă—down
claude-opus-5 1.8Ă— 0.8Ă—down
claude-opus-5-5 not published –down
claude-sonnet-4-6 1.2Ă— 0.5Ă—down
claude-sonnet-5 1.4Ă— 0.6Ă—down
claude-sonnet-5-5 not published –down
cursor-fable-5 2Ă— 0.9Ă—down
gpt-5.4-mini not published –down
gpt-5.5 1.3Ă— 0.5Ă—down
gpt-5.6-luna 1.3Ă— 0.5Ă—down
gpt-5.6-sol 1.5Ă— 0.6Ă—down
gpt-5.6-terra 0.8Ă— 0.35Ă—down
gpt-6-astra not published –down
gpt-6-luna not published –down
gpt-6-sol not published –down
gpt-6.1-sol not published –down
gemini-2.5-flash not published –down
gemini-2.5-pro not published –down
gemini-3.1-flash-lite not published –down
gemini-3.1-pro not published –down
gemini-3.5-flash not published –down
gemini-3.5-flash-lite not published –down
gemini-3.6-flash not published –down
gemini-3.7-flash not published –down
deepseek-v4-flash 0.7Ă— 0.3Ă—down
deepseek-v4-pro 0.9Ă— 0.4Ă—down
deepseek-v4.1-flash not published –down
grok-4.3 not published –down
grok-4.5 1.4Ă— 0.6Ă—down
grok-4.6 not published –down
grok-4.7 not published –down
qwen3.6-plus 0.8Ă— 0.35Ă—down
qwen3.7-max 0.9Ă— 0.4Ă—down
qwen3.7-plus not published –down
qwen3.8-flash not published –down
qwen3.8-max not published –down
glm-5.1 not published –down
glm-5.2 0.9Ă— 0.45Ă—down
glm-5.3 0.95Ă— 0.45Ă—down
kimi-k2.5 not published –down
kimi-k2.6 not published –down
kimi-k2.7-code not published –down
kimi-k3 1Ă— 0.5Ă—down

Use the model id exactly as shown. GET /v1/models with your key gives the same list and uses no tokens.

Your key & usage

Where your key is, what is left on it, and keeping it safe.

  • Finding it. The key comes to your Telegram chat when you pay, and is on your order page. On My API keys, Show key reveals it again any time.
  • Tokens left. My API keys shows each key's tokens left, tokens used and requests, with every request listed by model, tokens and time. It updates within a minute or two of each request.
  • One pack, one key. Each pack you buy is a separate key with its own tokens. Keep one per project, or buy another pack when a key runs low.
  • Expiry. No expiry date is set on the keys; the tokens stay until you use them.
  • Keep it secret. Anyone with the key can spend its tokens. Never put it in a web page, an app you hand out, or a public repository; read it from an environment variable. In the Playground the key never leaves our server.

Errors

What a refused request means, and what to do.

CodeMeansWhat to do
401 / 403The key is missing, wrong or no longer valid.Copy the whole key again from My API keys, and check the tool sends it (Bearer, or x-api-key for the Anthropic format).
402The key has no tokens left, or too few for the request.Buy another pack for a new key.
404No such model, or a wrong URL.Use a model id exactly as listed, and the base URL for the format you use.
429Too many requests at once.Wait a few seconds and send it again, more slowly.
500 / 502 / 503The model's provider is down for now, for example upstream_circuit_open.Try another model that is online, or again in a few minutes. Failed requests use no tokens.

FAQ

What is a token?

A small piece of text, about three quarters of an English word or four letters. Malay text and code use a few more tokens per word. Both what you send and what the model writes back count.

How far does 1 million tokens go?

We tested it with real chats, starting a new chat every six messages: about 550 messages on a small GPT model (0.8Ă—) and about 350 on Claude Sonnet or Opus. One long chat that never starts over got only about 150, because every message re-sends the whole chat. Coding tools such as Claude Code read a lot of your project with each step, so they use tokens much faster than chat.

Why does even a short message use a few hundred tokens?

Every request carries about 400 tokens of instructions the service adds on its own, on top of your message and the chat so far. A one-word reply to “hi” still uses about 400 tokens times the model’s rate.

Why does a long chat use more tokens with each message?

The model has no memory between requests, so every message sends the whole chat so far with it. Start a new chat when you change topic to keep requests small.

Can I add tokens to a key I have?

No. Each pack is its own key with its own tokens; buy another pack when one runs low.

Do you keep my prompts or answers?

We do not. Requests pass through our server and our supplier to the model provider, and all we keep is what usage needs: the model, the number of tokens and the time. Playground chats are not saved.

Which model should I use?

One that is online in the list. For everyday writing and questions, a model with a low rate goes furthest; for hard coding or reasoning, the larger Claude and GPT models do better and use tokens faster.

Is this the official OpenAI or Anthropic API?

No. ListingLab is an independent reseller. The models are the real ones, reached through our gateway with your key.

Chat with us on Telegram Open a support ticket