One endpoint for 400+ language models, billed in toman
Change base_url and nothing else. Toman wallet, API keys, real streaming, models from OpenAI, Anthropic, Google and DeepSeek.
- Toman · no foreign card
- OpenAI SDK
- 50,000 toman
The only line that changes
https://api.uttapen.ir/v1curl https://api.uttapen.ir/v1/chat/completions \
-H "Authorization: Bearer sk-up-…" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-5",
"messages": [{"role": "user", "content": "Introduce yourself in one sentence."}],
"stream": true
}'from openai import OpenAI
client = OpenAI(
base_url="https://api.uttapen.ir/v1",
api_key="sk-up-…",
)
stream = client.chat.completions.create(
model="openai/gpt-5",
messages=[{"role": "user", "content": "Introduce yourself in one sentence."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="", flush=True)import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.uttapen.ir/v1",
apiKey: "sk-up-…",
});
const stream = await client.chat.completions.create({
model: "openai/gpt-5",
messages: [{ role: "user", content: "Introduce yourself in one sentence." }],
stream: true,
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}<?php
// composer require openai-php/client guzzlehttp/guzzle
$client = OpenAI::factory()
->withBaseUri('https://api.uttapen.ir/v1')
->withApiKey('sk-up-…')
->make();
$result = $client->chat()->create([
'model' => 'openai/gpt-5',
'messages' => [['role' => 'user', 'content' => 'Introduce yourself in one sentence.']],
]);
echo $result->choices[0]->message->content;package main
import (
"context"
"fmt"
"github.com/openai/openai-go"
"github.com/openai/openai-go/option"
)
func main() {
client := openai.NewClient(
option.WithBaseURL("https://api.uttapen.ir/v1"),
option.WithAPIKey("sk-up-…"),
)
resp, err := client.Chat.Completions.New(context.Background(), openai.ChatCompletionNewParams{
Model: "openai/gpt-5",
Messages: []openai.ChatCompletionMessageParamUnion{openai.UserMessage("Introduce yourself in one sentence.")},
})
if err != nil {
panic(err)
}
fmt.Println(resp.Choices[0].Message.Content)
}The same code works with stream=True, tools and response_format with no further changes.
Models people actually use
Price per 1M tokens in toman, at today's rate.
- GPT-5openai/gpt-5400,000 ctxInput164,844Output1,318,750
- Claude Sonnet 4.5anthropic/claude-sonnet-4.51,000,000 ctxInput395,625Output1,978,125
- Gemini 2.5 Progoogle/gemini-2.5-pro1,048,576 ctxInput164,844Output1,318,750
- DeepSeek V3deepseek/deepseek-chat163,840 ctxInput42,200Output117,369
- Grok 4.20x-ai/grok-4.202,000,000 ctxInput164,844Output329,688
- Qwen3 Coder 480B A35Bqwen/qwen3-coder262,144 ctxInput39,563Output131,875
- GPT-5 Miniopenai/gpt-5-mini400,000 ctxInput32,969Output263,750
- Gemini 2.5 Flashgoogle/gemini-2.5-flash1,048,576 ctxInput39,563Output329,688
430 models from 51 providers, every one priced in toman.
Three steps to your first request
- 1
Sign up with a mobile number
An SMS code. No email, no international card.
- 2
Top up the toman wallet
A local payment gateway, with an official invoice for every top-up.
- 3
Create a key and change base_url
The official OpenAI SDK; the rest of your code stays as it is.
- You pay for the tokens you used
- Every request is billed against the usage it actually reported. A failed request costs nothing, and every line is visible in your usage panel.
- Prompts and answers are never stored
- Only metadata: model, tokens, cost, timing. The text of an API request never reaches a log or a database.
- Servers in Iran, models abroad
- Panel, wallet and keys run inside Iran; model calls leave over a private route. No VPN, no foreign card.
Ready?
Sign up with a phone number, top up from 50,000 toman, key in 30 seconds.