LLM tokens, paid in Rupiah.

One API key for many models. Compatible with OpenAI and Anthropic, billed per token, top up with QRIS or e-wallet.

https://api.mautoken.cloud/v1

MauToken dashboard home: available balance, 30-day summary, and cost per day chart by model
List of API keys with a spend meter against each key's limit

Use the tools you already know.

Change the base URL and API key, and you are done. No custom SDK to install.

POST /v1/chat/completions

OpenAI format

Use the OpenAI SDK or call the endpoint directly. Streaming is supported.

POST /v1/messages

Anthropic format

Works with Claude Code and other tools that speak the Anthropic API.

Works with tools that support the OpenAI or Anthropic API, such as

  • Cursor
  • Claude Code
  • Cline
  • Roo Code
  • Kilo Code
  • Continue
  • Aider
  • OpenCode
  • OpenClaw
  • Zed
  • Open WebUI
  • LibreChat

From balance to first call.

  1. Top up

    Pay with QRIS, virtual account, or e-wallet. Your balance updates automatically once payment is confirmed.

  2. Create an API key

    Set a spend limit and a per-minute limit. The key is shown once, so store it in an environment variable.

  3. Call the API

    Point your SDK or tool at the MauToken base URL, pick a model, and go.

curl https://api.mautoken.cloud/v1/chat/completions \
  -H "Authorization: Bearer $MAUTOKEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "MODEL_ID",
    "messages": [{"role": "user", "content": "What is an API?"}],
    "max_tokens": 300
  }'
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.mautoken.cloud/v1",
    api_key=os.environ["MAUTOKEN_API_KEY"],
)

resp = client.chat.completions.create(
    model="MODEL_ID",
    messages=[{"role": "user", "content": "What is an API?"}],
    max_tokens=300,
)
print(resp.choices[0].message.content)
import OpenAI from "openai";

const client = new OpenAI({
  baseURL: "https://api.mautoken.cloud/v1",
  apiKey: process.env.MAUTOKEN_API_KEY,
});

const resp = await client.chat.completions.create({
  model: "MODEL_ID",
  messages: [{ role: "user", content: "What is an API?" }],
  max_tokens: 300,
});
console.log(resp.choices[0].message.content);

Replace MODEL_ID with a model name from the Models & pricing page in the dashboard.

Built so the bill never surprises you.

See where every Rupiah goes

Cost per day, per model, and per key. Download a CSV for your books.

Stacked bar chart of cost per day by model, with a legend and a table view toggle

Limits you control

Every key has its own limits, so a wasteful tool cannot drain your balance.

  • Spend limit
  • Requests per minute
  • Expiry date
  • Allowed models

Pay the way you already do

Prepaid balance in Rupiah, no subscription. Payments run through DOKU.

  • QRIS
  • Virtual account
  • E-wallet

A ready-to-use chat app

Try models without writing code, with the same account and the same balance. Conversation history is kept in your account and can be deleted at any time.

Open chat
A MauToken chat conversation: a question, an answer with a Python code sample, and the message box

Balance is held first, the difference comes back.

Before a request runs, part of your balance is held as a guarantee. When it finishes, only the tokens actually used are charged.

  1. Hold

    The highest possible cost of the request is held from your balance.

  2. Run

    The model answers. Streaming is passed through as is.

  3. Settle

    The real cost is taken from the hold and the rest returns instantly.

  • Errors before the first byte (502, 503, 504) are never billed.
  • Prompt and response content is not stored in billing logs.

Frequently asked questions

Is it compatible with the OpenAI and Anthropic SDKs?

Yes. The /v1/chat/completions endpoint follows the OpenAI format and /v1/messages follows the Anthropic format, both with streaming. Just change the base URL and API key.

How do I top up?

From the Balance page in the dashboard. Available methods are listed there, and your balance updates automatically once payment is confirmed.

What does each model cost?

Prices in Rupiah per 1 million tokens are shown on the Models & pricing page and in GET /v1/models. Prices can change, and a change applies to later requests.

What happens if my balance is too low?

The request is rejected with a 402 before it is forwarded to the model, so you are never billed for an answer that was never delivered.

Are my prompts stored?

Not in our logs. We record request metadata (model, token counts, cost, status, time) for billing. Requests are forwarded to the model provider, which has its own policy. The exception is our chat app: its conversation history is stored on our servers so you can open it from any device, and you can delete it at any time.

What is not supported yet?

The OpenAI Responses API, embeddings, images, audio, fine-tuning, batch, and file uploads are not available. Calling directly from a browser is also unsupported: call from your server.

Start with one API key.

Sign up, top up, and create your first key.