diff --git a/models/alibaba/qwen-2.5-72b-instruct.toml b/models/alibaba/qwen-2.5-72b-instruct.toml
new file mode 100644
index 00000000000..22e74c74706
--- /dev/null
+++ b/models/alibaba/qwen-2.5-72b-instruct.toml
@@ -0,0 +1,24 @@
+# Sources:
+# https://huggingface.co/Qwen/Qwen2.5-72B-Instruct (first-party weights card, 2024-09-19)
+# https://openrouter.ai/qwen/qwen-2.5-72b-instruct (serving/pricing surface)
+
+name = "Qwen2.5 72B Instruct"
+description = "Qwen instruction model for multilingual chat, reasoning, and tool use"
+family = "qwen"
+release_date = "2024-09-19"
+last_updated = "2024-09-19"
+attachment = false
+reasoning = false
+temperature = true
+tool_call = true
+structured_output = true
+knowledge = "2024-06-30"
+open_weights = true
+
+[limit]
+context = 32_768
+output = 16_384
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/models/mistral/mistral-large-2407.toml b/models/mistral/mistral-large-2407.toml
new file mode 100644
index 00000000000..2d3aa7bc775
--- /dev/null
+++ b/models/mistral/mistral-large-2407.toml
@@ -0,0 +1,25 @@
+# Sources:
+# https://mistral.ai/news/mistral-large-2407 (first-party announcement, 2024-11-19)
+# Weights are under the Mistral Research License (not open source) -> open_weights = false
+# https://openrouter.ai/mistral/mistral-large-2407 (serving/pricing surface)
+
+name = "Mistral Large 2407"
+description = "Flagship Mistral model for advanced reasoning, coding, and multilingual work"
+family = "mistral-large"
+release_date = "2024-11-19"
+last_updated = "2024-11-19"
+attachment = true
+reasoning = false
+temperature = true
+tool_call = true
+structured_output = true
+knowledge = "2024-03-31"
+open_weights = false
+
+[limit]
+context = 131_072
+output = 104_857
+
+[modalities]
+input = ["text", "pdf"]
+output = ["text"]
diff --git a/models/mistral/mistral-medium-2508.toml b/models/mistral/mistral-medium-2508.toml
new file mode 100644
index 00000000000..c71187c3142
--- /dev/null
+++ b/models/mistral/mistral-medium-2508.toml
@@ -0,0 +1,24 @@
+# Sources:
+# https://mistral.ai/news/mistral-medium-3.1
+# https://openrouter.ai/mistralai/mistral-medium-3.1
+
+name = "Mistral Medium 3.1"
+description = "Mistral model for multilingual chat, reasoning, and tool-assisted workflows"
+family = "mistral-medium"
+release_date = "2025-08-13"
+last_updated = "2025-08-13"
+attachment = true
+reasoning = false
+temperature = true
+tool_call = true
+structured_output = true
+knowledge = "2025-06-30"
+open_weights = false
+
+[limit]
+context = 262_144
+output = 262_144
+
+[modalities]
+input = ["text", "image", "pdf"]
+output = ["text"]
diff --git a/models/moonshotai/kimi-k2.toml b/models/moonshotai/kimi-k2.toml
new file mode 100644
index 00000000000..8ec05ebfbfe
--- /dev/null
+++ b/models/moonshotai/kimi-k2.toml
@@ -0,0 +1,24 @@
+# Sources:
+# https://huggingface.co/moonshotai/Kimi-K2-Instruct (first-party weights card, 2025-07-11)
+# https://openrouter.ai/moonshotai/kimi-k2 (serving/pricing surface)
+
+name = "Kimi K2 0711"
+description = "Kimi model for long-context chat, coding, and agentic reasoning"
+family = "kimi-k2"
+release_date = "2025-07-11"
+last_updated = "2025-07-11"
+attachment = false
+reasoning = false
+temperature = true
+tool_call = true
+structured_output = false
+knowledge = "2024-12-31"
+open_weights = true
+
+[limit]
+context = 131_072
+output = 98_304
+
+[modalities]
+input = ["text"]
+output = ["text"]
diff --git a/providers/topupsaja/logo.svg b/providers/topupsaja/logo.svg
new file mode 100644
index 00000000000..3af86891b18
--- /dev/null
+++ b/providers/topupsaja/logo.svg
@@ -0,0 +1,3 @@
+
diff --git a/providers/topupsaja/models/ts/claude-opus-4.7.toml b/providers/topupsaja/models/ts/claude-opus-4.7.toml
new file mode 100644
index 00000000000..c63733f0ec8
--- /dev/null
+++ b/providers/topupsaja/models/ts/claude-opus-4.7.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "anthropic/claude-opus-4-7"
+
+structured_output = true
+
+[cost]
+input = 25
+output = 125
+cache_read = 2.5
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/claude-opus-4.8.toml b/providers/topupsaja/models/ts/claude-opus-4.8.toml
new file mode 100644
index 00000000000..cfbe6be5a8a
--- /dev/null
+++ b/providers/topupsaja/models/ts/claude-opus-4.8.toml
@@ -0,0 +1,21 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "anthropic/claude-opus-4-8"
+
+temperature = true
+structured_output = true
+
+[cost]
+input = 25
+output = 125
+cache_read = 2.5
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/claude-sonnet-5.toml b/providers/topupsaja/models/ts/claude-sonnet-5.toml
new file mode 100644
index 00000000000..00350a0486a
--- /dev/null
+++ b/providers/topupsaja/models/ts/claude-sonnet-5.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "anthropic/claude-sonnet-5"
+
+structured_output = true
+
+[cost]
+input = 12
+output = 60
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/claude-sonnet-latest.toml b/providers/topupsaja/models/ts/claude-sonnet-latest.toml
new file mode 100644
index 00000000000..31e7f793354
--- /dev/null
+++ b/providers/topupsaja/models/ts/claude-sonnet-latest.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "anthropic/claude-sonnet-5"
+
+structured_output = true
+
+name = "Claude Sonnet Latest"
+
+[cost]
+input = 12
+output = 60
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-chat.toml b/providers/topupsaja/models/ts/deepseek-chat.toml
new file mode 100644
index 00000000000..464467af1be
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-chat.toml
@@ -0,0 +1,13 @@
+base_model = "deepseek/deepseek-chat"
+
+structured_output = true
+attachment = false
+
+[cost]
+input = 1.92
+output = 5.34
+cache_read = 0.96
+
+[limit]
+context = 163840
+output = 16384
diff --git a/providers/topupsaja/models/ts/deepseek-r1.toml b/providers/topupsaja/models/ts/deepseek-r1.toml
new file mode 100644
index 00000000000..22161a2e30e
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-r1.toml
@@ -0,0 +1,16 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "deepseek/deepseek-r1"
+
+reasoning_options = []
+
+structured_output = false
+
+[cost]
+input = 4.2
+output = 15
+cache_read = 2.1
+
+[limit]
+context = 64000
+output = 16000
diff --git a/providers/topupsaja/models/ts/deepseek-v4-flash-0731-batch.toml b/providers/topupsaja/models/ts/deepseek-v4-flash-0731-batch.toml
new file mode 100644
index 00000000000..a15cf6401e8
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-flash-0731-batch.toml
@@ -0,0 +1,24 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-flash-0731"
+
+name = "DeepSeek: DeepSeek V4 Flash 0731 (batch)"
+
+[cost]
+input = 0.77
+output = 2.31
+cache_read = 0.025
+
+[limit]
+context = 1048576
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-flash-0731.toml b/providers/topupsaja/models/ts/deepseek-v4-flash-0731.toml
new file mode 100644
index 00000000000..e317e16e9bd
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-flash-0731.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-flash-0731"
+
+[cost]
+input = 0.42
+output = 0.84
+cache_read = 0.084
+
+[limit]
+context = 1310720
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-flash-latest.toml b/providers/topupsaja/models/ts/deepseek-v4-flash-latest.toml
new file mode 100644
index 00000000000..f365a4a9866
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-flash-latest.toml
@@ -0,0 +1,23 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-flash-0731"
+
+name = "DeepSeek V4 Flash Latest"
+
+[cost]
+input = 0.379
+output = 1.137
+cache_read = 0.012
+
+[limit]
+context = 1310720
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-flash-vision-exp-batch.toml b/providers/topupsaja/models/ts/deepseek-v4-flash-vision-exp-batch.toml
new file mode 100644
index 00000000000..2c7ef13d4bf
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-flash-vision-exp-batch.toml
@@ -0,0 +1,24 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-flash-vision-exp"
+
+name = "DeepSeek: DeepSeek V4 Flash Vision Exp (batch)"
+
+[cost]
+input = 0.77
+output = 2.31
+cache_read = 0.025
+
+[limit]
+context = 1048576
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-flash-vision-exp.toml b/providers/topupsaja/models/ts/deepseek-v4-flash-vision-exp.toml
new file mode 100644
index 00000000000..e9259f66e9d
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-flash-vision-exp.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-flash-vision-exp"
+
+[cost]
+input = 1.509
+output = 4.528
+cache_read = 0.048
+
+[limit]
+context = 1048576
+output = 262144
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-pro-0813-batch.toml b/providers/topupsaja/models/ts/deepseek-v4-pro-0813-batch.toml
new file mode 100644
index 00000000000..1a6e1641466
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-pro-0813-batch.toml
@@ -0,0 +1,24 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-pro-0813"
+
+name = "DeepSeek: DeepSeek V4 Pro 0813 (batch)"
+
+[cost]
+input = 3.96
+output = 11.88
+cache_read = 0.132
+
+[limit]
+context = 1048576
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-pro-0813.toml b/providers/topupsaja/models/ts/deepseek-v4-pro-0813.toml
new file mode 100644
index 00000000000..f602b3266ed
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-pro-0813.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-pro-0813"
+
+[cost]
+input = 3.469
+output = 10.407
+cache_read = 0.11
+
+[limit]
+context = 1048576
+output = 393216
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/deepseek-v4-pro.toml b/providers/topupsaja/models/ts/deepseek-v4-pro.toml
new file mode 100644
index 00000000000..c61a3510ad8
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4-pro.toml
@@ -0,0 +1,25 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4-pro"
+
+[cost]
+input = 9.6
+output = 19.2
+cache_read = 0.81
+
+[limit]
+context = 1048576
+output = 393216
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["high", "xhigh"]
+
+[interleaved]
+field = "reasoning_content"
diff --git a/providers/topupsaja/models/ts/deepseek-v4.1-flash.toml b/providers/topupsaja/models/ts/deepseek-v4.1-flash.toml
new file mode 100644
index 00000000000..aa148c94688
--- /dev/null
+++ b/providers/topupsaja/models/ts/deepseek-v4.1-flash.toml
@@ -0,0 +1,21 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "deepseek/deepseek-v4.1-flash"
+
+[cost]
+input = 1.05
+output = 4.2
+cache_read = 0.021
+
+[limit]
+context = 1048576
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/gemini-3.5-flash-lite.toml b/providers/topupsaja/models/ts/gemini-3.5-flash-lite.toml
new file mode 100644
index 00000000000..a94f275a95a
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.5-flash-lite.toml
@@ -0,0 +1,12 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.5-flash-lite"
+
+[cost]
+input = 2.1
+output = 17.5
+cache_read = 0.21
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-3.5-flash.toml b/providers/topupsaja/models/ts/gemini-3.5-flash.toml
new file mode 100644
index 00000000000..396bcc6cdbc
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.5-flash.toml
@@ -0,0 +1,12 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.5-flash"
+
+[cost]
+input = 9
+output = 54
+cache_read = 0.9
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-3.6-flash-batch.toml b/providers/topupsaja/models/ts/gemini-3.6-flash-batch.toml
new file mode 100644
index 00000000000..44cbe796408
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.6-flash-batch.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.6-flash"
+
+name = "Google: Gemini 3.6 Flash (batch)"
+
+[cost]
+input = 2.25
+output = 11.25
+cache_read = 0.225
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-3.7-flash-batch.toml b/providers/topupsaja/models/ts/gemini-3.7-flash-batch.toml
new file mode 100644
index 00000000000..70d9db355a7
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.7-flash-batch.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.7-flash"
+
+name = "Google: Gemini 3.7 Flash (batch)"
+
+[cost]
+input = 2.25
+output = 11.25
+cache_read = 0.225
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-3.7-flash.toml b/providers/topupsaja/models/ts/gemini-3.7-flash.toml
new file mode 100644
index 00000000000..4c6af7d479e
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.7-flash.toml
@@ -0,0 +1,12 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.7-flash"
+
+[cost]
+input = 4.5
+output = 22.5
+cache_read = 0.45
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-3.8-flash-batch.toml b/providers/topupsaja/models/ts/gemini-3.8-flash-batch.toml
new file mode 100644
index 00000000000..6799b3506b2
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.8-flash-batch.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.8-flash"
+
+name = "Google: Gemini 3.8 Flash (batch)"
+
+[cost]
+input = 2.25
+output = 11.25
+cache_read = 0.225
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-3.8-flash.toml b/providers/topupsaja/models/ts/gemini-3.8-flash.toml
new file mode 100644
index 00000000000..c05153b777f
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-3.8-flash.toml
@@ -0,0 +1,12 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.8-flash"
+
+[cost]
+input = 4.5
+output = 22.5
+cache_read = 0.45
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-flash-latest.toml b/providers/topupsaja/models/ts/gemini-flash-latest.toml
new file mode 100644
index 00000000000..1c2a7237544
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-flash-latest.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.5-flash"
+
+name = "Gemini Flash Latest"
+
+[cost]
+input = 4.5
+output = 22.5
+cache_read = 0.45
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high"]
diff --git a/providers/topupsaja/models/ts/gemini-pro-latest.toml b/providers/topupsaja/models/ts/gemini-pro-latest.toml
new file mode 100644
index 00000000000..e77af4ae6f1
--- /dev/null
+++ b/providers/topupsaja/models/ts/gemini-pro-latest.toml
@@ -0,0 +1,17 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "google/gemini-3.1-pro-preview"
+
+name = "Gemini Pro Latest"
+
+[cost]
+input = 12
+output = 72
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high"]
+
+[interleaved]
+field = "reasoning_details"
diff --git a/providers/topupsaja/models/ts/glm-4.6.toml b/providers/topupsaja/models/ts/glm-4.6.toml
new file mode 100644
index 00000000000..692b9125e21
--- /dev/null
+++ b/providers/topupsaja/models/ts/glm-4.6.toml
@@ -0,0 +1,19 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "zhipuai/glm-4.6"
+
+structured_output = true
+
+[cost]
+input = 2.58
+output = 10.5
+cache_read = 0.48
+
+[limit]
+output = 16384
+
+[[reasoning_options]]
+type = "toggle"
diff --git a/providers/topupsaja/models/ts/glm-5.3-flash-batch.toml b/providers/topupsaja/models/ts/glm-5.3-flash-batch.toml
new file mode 100644
index 00000000000..d730f166627
--- /dev/null
+++ b/providers/topupsaja/models/ts/glm-5.3-flash-batch.toml
@@ -0,0 +1,21 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "zhipuai/glm-5.3-flash"
+
+name = "Z.ai: GLM 5.3 Flash (batch)"
+
+[cost]
+input = 0.525
+output = 1.75
+cache_read = 0.105
+
+[limit]
+context = 1048576
+output = 943718
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
+
+[modalities]
+input = ["text", "image", "video"]
diff --git a/providers/topupsaja/models/ts/glm-flash-latest.toml b/providers/topupsaja/models/ts/glm-flash-latest.toml
new file mode 100644
index 00000000000..b8e0e91c692
--- /dev/null
+++ b/providers/topupsaja/models/ts/glm-flash-latest.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "zhipuai/glm-5.3-flash"
+
+name = "GLM Flash Latest"
+
+[cost]
+input = 0.525
+output = 1.75
+cache_read = 0.105
+
+[limit]
+context = 1310720
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
+
+[modalities]
+input = ["text", "image", "video"]
diff --git a/providers/topupsaja/models/ts/gpt-4.1-mini.toml b/providers/topupsaja/models/ts/gpt-4.1-mini.toml
new file mode 100644
index 00000000000..b4561ec58a0
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-4.1-mini.toml
@@ -0,0 +1,6 @@
+base_model = "openai/gpt-4.1-mini"
+
+[cost]
+input = 2.4
+output = 9.6
+cache_read = 0.6
diff --git a/providers/topupsaja/models/ts/gpt-4.1-nano.toml b/providers/topupsaja/models/ts/gpt-4.1-nano.toml
new file mode 100644
index 00000000000..8e87841b377
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-4.1-nano.toml
@@ -0,0 +1,9 @@
+base_model = "openai/gpt-4.1-nano"
+
+[cost]
+input = 0.7
+output = 2.8
+cache_read = 0.175
+
+[modalities]
+input = ["image", "text", "pdf"]
diff --git a/providers/topupsaja/models/ts/gpt-4.1.toml b/providers/topupsaja/models/ts/gpt-4.1.toml
new file mode 100644
index 00000000000..e464525c383
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-4.1.toml
@@ -0,0 +1,6 @@
+base_model = "openai/gpt-4.1"
+
+[cost]
+input = 12
+output = 48
+cache_read = 3
diff --git a/providers/topupsaja/models/ts/gpt-4o-mini.toml b/providers/topupsaja/models/ts/gpt-4o-mini.toml
new file mode 100644
index 00000000000..7ba603f01ff
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-4o-mini.toml
@@ -0,0 +1,6 @@
+base_model = "openai/gpt-4o-mini"
+
+[cost]
+input = 1.05
+output = 4.2
+cache_read = 0.525
diff --git a/providers/topupsaja/models/ts/gpt-4o.toml b/providers/topupsaja/models/ts/gpt-4o.toml
new file mode 100644
index 00000000000..5df4b576f18
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-4o.toml
@@ -0,0 +1,6 @@
+base_model = "openai/gpt-4o"
+
+[cost]
+input = 15
+output = 60
+cache_read = 7.5
diff --git a/providers/topupsaja/models/ts/gpt-5.6-terra-pro.toml b/providers/topupsaja/models/ts/gpt-5.6-terra-pro.toml
new file mode 100644
index 00000000000..ae31724abd5
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-5.6-terra-pro.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "openai/gpt-5.6-terra"
+
+name = "GPT-5.6 Terra Pro"
+
+[cost]
+input = 12
+output = 72
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/gpt-5.6-terra.toml b/providers/topupsaja/models/ts/gpt-5.6-terra.toml
new file mode 100644
index 00000000000..9ab043c6ebe
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-5.6-terra.toml
@@ -0,0 +1,12 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "openai/gpt-5.6-terra"
+
+[cost]
+input = 12
+output = 72
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/gpt-sol-latest.toml b/providers/topupsaja/models/ts/gpt-sol-latest.toml
new file mode 100644
index 00000000000..3495b2ec2d1
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-sol-latest.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "openai/gpt-5.6-sol"
+
+name = "GPT Sol Latest"
+
+[cost]
+input = 12
+output = 60
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/gpt-terra-latest.toml b/providers/topupsaja/models/ts/gpt-terra-latest.toml
new file mode 100644
index 00000000000..54ca862db40
--- /dev/null
+++ b/providers/topupsaja/models/ts/gpt-terra-latest.toml
@@ -0,0 +1,14 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "openai/gpt-5.6-terra"
+
+name = "GPT Terra Latest"
+
+[cost]
+input = 12
+output = 72
+cache_read = 1.2
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/grok-4.5.toml b/providers/topupsaja/models/ts/grok-4.5.toml
new file mode 100644
index 00000000000..4c23b6f8a32
--- /dev/null
+++ b/providers/topupsaja/models/ts/grok-4.5.toml
@@ -0,0 +1,18 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "xai/grok-4.5"
+
+[cost]
+input = 12
+output = 36
+cache_read = 1.8
+
+[limit]
+output = 450000
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high"]
+
+[modalities]
+input = ["text", "image", "pdf"]
diff --git a/providers/topupsaja/models/ts/grok-4.6.toml b/providers/topupsaja/models/ts/grok-4.6.toml
new file mode 100644
index 00000000000..cc4572e46bc
--- /dev/null
+++ b/providers/topupsaja/models/ts/grok-4.6.toml
@@ -0,0 +1,18 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "xai/grok-4.6"
+
+[cost]
+input = 12
+output = 36
+cache_read = 3
+
+[limit]
+output = 450000
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high", "xhigh"]
+
+[modalities]
+input = ["text", "image", "pdf"]
diff --git a/providers/topupsaja/models/ts/grok-build-0.1.toml b/providers/topupsaja/models/ts/grok-build-0.1.toml
new file mode 100644
index 00000000000..1d73f7a89e2
--- /dev/null
+++ b/providers/topupsaja/models/ts/grok-build-0.1.toml
@@ -0,0 +1,13 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "xai/grok-build-0.1"
+
+reasoning_options = []
+
+[cost]
+input = 6
+output = 12
+cache_read = 1.2
+
+[limit]
+output = 230400
diff --git a/providers/topupsaja/models/ts/grok-latest.toml b/providers/topupsaja/models/ts/grok-latest.toml
new file mode 100644
index 00000000000..f255ac38ed0
--- /dev/null
+++ b/providers/topupsaja/models/ts/grok-latest.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "xai/grok-4.6"
+
+name = "Grok Latest"
+
+[cost]
+input = 12
+output = 36
+cache_read = 3
+
+[limit]
+output = 450000
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "high", "xhigh"]
+
+[modalities]
+input = ["text", "image", "pdf"]
diff --git a/providers/topupsaja/models/ts/hy4-preview.toml b/providers/topupsaja/models/ts/hy4-preview.toml
new file mode 100644
index 00000000000..d38d1c0e566
--- /dev/null
+++ b/providers/topupsaja/models/ts/hy4-preview.toml
@@ -0,0 +1,17 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "tencent/hy4-preview"
+
+structured_output = true
+
+[cost]
+input = 5.004
+output = 15.006
+cache_read = 0.252
+
+[limit]
+context = 1048576
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "low", "high"]
diff --git a/providers/topupsaja/models/ts/kimi-k2.5.toml b/providers/topupsaja/models/ts/kimi-k2.5.toml
new file mode 100644
index 00000000000..1e85be47bba
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-k2.5.toml
@@ -0,0 +1,25 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "moonshotai/kimi-k2.5"
+
+temperature = true
+
+[cost]
+input = 2.7
+output = 13.5
+cache_read = 0.42
+
+[limit]
+output = 235929
+
+[[reasoning_options]]
+type = "toggle"
+
+[modalities]
+input = ["text", "image"]
+
+[interleaved]
+field = "reasoning_details"
diff --git a/providers/topupsaja/models/ts/kimi-k2.6.toml b/providers/topupsaja/models/ts/kimi-k2.6.toml
new file mode 100644
index 00000000000..831bf9c86d0
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-k2.6.toml
@@ -0,0 +1,23 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "moonshotai/kimi-k2.6"
+
+[cost]
+input = 5.7
+output = 24
+cache_read = 0.96
+
+[limit]
+output = 235929
+
+[[reasoning_options]]
+type = "toggle"
+
+[modalities]
+input = ["text", "image"]
+
+[interleaved]
+field = "reasoning_details"
diff --git a/providers/topupsaja/models/ts/kimi-k2.7-code.toml b/providers/topupsaja/models/ts/kimi-k2.7-code.toml
new file mode 100644
index 00000000000..f442580ce3c
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-k2.7-code.toml
@@ -0,0 +1,18 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "moonshotai/kimi-k2.7-code"
+
+reasoning_options = []
+
+temperature = true
+
+[cost]
+input = 4.237
+output = 19.26
+cache_read = 1.08
+
+[limit]
+output = 235929
+
+[modalities]
+input = ["text", "image"]
diff --git a/providers/topupsaja/models/ts/kimi-k2.toml b/providers/topupsaja/models/ts/kimi-k2.toml
new file mode 100644
index 00000000000..244ebd9ddcc
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-k2.toml
@@ -0,0 +1,6 @@
+base_model = "moonshotai/kimi-k2"
+
+[cost]
+input = 3.42
+output = 13.8
+cache_read = 1.71
diff --git a/providers/topupsaja/models/ts/kimi-k3-batch.toml b/providers/topupsaja/models/ts/kimi-k3-batch.toml
new file mode 100644
index 00000000000..b46b246c6dd
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-k3-batch.toml
@@ -0,0 +1,25 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "moonshotai/kimi-k3"
+
+temperature = true
+
+name = "MoonshotAI: Kimi K3 (batch)"
+
+[cost]
+input = 18
+output = 90
+cache_read = 1.8
+
+[limit]
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/kimi-k3.toml b/providers/topupsaja/models/ts/kimi-k3.toml
new file mode 100644
index 00000000000..abda963f72c
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-k3.toml
@@ -0,0 +1,23 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "moonshotai/kimi-k3"
+
+temperature = true
+
+[cost]
+input = 11.7
+output = 65.52
+cache_read = 1.357
+
+[limit]
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/kimi-latest.toml b/providers/topupsaja/models/ts/kimi-latest.toml
new file mode 100644
index 00000000000..910fbdd0248
--- /dev/null
+++ b/providers/topupsaja/models/ts/kimi-latest.toml
@@ -0,0 +1,25 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "moonshotai/kimi-k3"
+
+temperature = true
+
+name = "Kimi Latest"
+
+[cost]
+input = 11.7
+output = 65.52
+cache_read = 1.357
+
+[limit]
+output = 943718
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "high", "max"]
diff --git a/providers/topupsaja/models/ts/llama-3.1-70b-instruct.toml b/providers/topupsaja/models/ts/llama-3.1-70b-instruct.toml
new file mode 100644
index 00000000000..01d553a1b7e
--- /dev/null
+++ b/providers/topupsaja/models/ts/llama-3.1-70b-instruct.toml
@@ -0,0 +1,12 @@
+base_model = "meta/llama-3.1-70b-instruct"
+
+structured_output = true
+
+[cost]
+input = 2.4
+output = 2.4
+cache_read = 1.2
+
+[limit]
+context = 131072
+output = 16384
diff --git a/providers/topupsaja/models/ts/llama-3.3-70b-instruct.toml b/providers/topupsaja/models/ts/llama-3.3-70b-instruct.toml
new file mode 100644
index 00000000000..9b27747e303
--- /dev/null
+++ b/providers/topupsaja/models/ts/llama-3.3-70b-instruct.toml
@@ -0,0 +1,12 @@
+base_model = "meta/llama-3.3-70b-instruct"
+
+structured_output = true
+
+[cost]
+input = 0.7
+output = 2.24
+cache_read = 0.35
+
+[limit]
+context = 131072
+output = 16384
diff --git a/providers/topupsaja/models/ts/longcat-2.0.toml b/providers/topupsaja/models/ts/longcat-2.0.toml
new file mode 100644
index 00000000000..cb727e00ca6
--- /dev/null
+++ b/providers/topupsaja/models/ts/longcat-2.0.toml
@@ -0,0 +1,24 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+# Budget: reasoning.max_tokens =
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "meituan/longcat-2.0"
+
+structured_output = false
+
+[cost]
+input = 2.1
+output = 8.4
+cache_read = 0.042
+
+[limit]
+context = 1048756
+output = 262144
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "budget_tokens"
diff --git a/providers/topupsaja/models/ts/mimo-v2.5-pro.toml b/providers/topupsaja/models/ts/mimo-v2.5-pro.toml
new file mode 100644
index 00000000000..05ffc772bd0
--- /dev/null
+++ b/providers/topupsaja/models/ts/mimo-v2.5-pro.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "xiaomi/mimo-v2.5-pro"
+
+structured_output = true
+
+[cost]
+input = 2.61
+output = 5.22
+cache_read = 0.022
+
+[limit]
+context = 1050000
+
+[[reasoning_options]]
+type = "toggle"
+
+[interleaved]
+field = "reasoning_content"
diff --git a/providers/topupsaja/models/ts/mimo-v2.5.toml b/providers/topupsaja/models/ts/mimo-v2.5.toml
new file mode 100644
index 00000000000..a3a8d403ba1
--- /dev/null
+++ b/providers/topupsaja/models/ts/mimo-v2.5.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "xiaomi/mimo-v2.5"
+
+structured_output = true
+
+[cost]
+input = 0.98
+output = 1.96
+cache_read = 0.02
+
+[limit]
+context = 1050000
+
+[[reasoning_options]]
+type = "toggle"
+
+[interleaved]
+field = "reasoning_details"
diff --git a/providers/topupsaja/models/ts/minimax-m3-batch.toml b/providers/topupsaja/models/ts/minimax-m3-batch.toml
new file mode 100644
index 00000000000..1903c256c02
--- /dev/null
+++ b/providers/topupsaja/models/ts/minimax-m3-batch.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "minimax/MiniMax-M3"
+
+structured_output = true
+
+name = "MiniMax: MiniMax M3 (batch)"
+
+[cost]
+input = 2.1
+output = 8.4
+cache_read = 0.42
+
+[limit]
+context = 524288
+output = 471859
+
+[[reasoning_options]]
+type = "toggle"
diff --git a/providers/topupsaja/models/ts/minimax-m3.toml b/providers/topupsaja/models/ts/minimax-m3.toml
new file mode 100644
index 00000000000..6840e96082b
--- /dev/null
+++ b/providers/topupsaja/models/ts/minimax-m3.toml
@@ -0,0 +1,16 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "minimax/MiniMax-M3"
+
+structured_output = true
+
+[cost]
+input = 2.1
+output = 8.4
+cache_read = 0.42
+
+[[reasoning_options]]
+type = "toggle"
diff --git a/providers/topupsaja/models/ts/mistral-large-2407.toml b/providers/topupsaja/models/ts/mistral-large-2407.toml
new file mode 100644
index 00000000000..171807812fe
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-large-2407.toml
@@ -0,0 +1,6 @@
+base_model = "mistral/mistral-large-2407"
+
+[cost]
+input = 12
+output = 36
+cache_read = 1.2
diff --git a/providers/topupsaja/models/ts/mistral-large-2512.toml b/providers/topupsaja/models/ts/mistral-large-2512.toml
new file mode 100644
index 00000000000..8a96e8b6ba9
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-large-2512.toml
@@ -0,0 +1,9 @@
+base_model = "mistral/mistral-large-2512"
+
+[cost]
+input = 3.3
+output = 9.9
+cache_read = 0.33
+
+[limit]
+output = 209715
diff --git a/providers/topupsaja/models/ts/mistral-medium-3-5-batch.toml b/providers/topupsaja/models/ts/mistral-medium-3-5-batch.toml
new file mode 100644
index 00000000000..41f5555e630
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-medium-3-5-batch.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "mistral/mistral-medium-2604"
+
+name = "Mistral: Mistral Medium 3.5 (batch)"
+
+[cost]
+input = 4.5
+output = 22.5
+cache_read = 2.25
+
+[limit]
+output = 209715
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "high"]
+
+[modalities]
+input = ["text", "image", "pdf"]
diff --git a/providers/topupsaja/models/ts/mistral-medium-3-5.toml b/providers/topupsaja/models/ts/mistral-medium-3-5.toml
new file mode 100644
index 00000000000..43bf1f245e4
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-medium-3-5.toml
@@ -0,0 +1,18 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "mistral/mistral-medium-2604"
+
+[cost]
+input = 9
+output = 45
+cache_read = 4.5
+
+[limit]
+output = 209715
+
+[[reasoning_options]]
+type = "effort"
+values = ["none", "high"]
+
+[modalities]
+input = ["text", "image", "pdf"]
diff --git a/providers/topupsaja/models/ts/mistral-medium-3.1.toml b/providers/topupsaja/models/ts/mistral-medium-3.1.toml
new file mode 100644
index 00000000000..c87212ffc4d
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-medium-3.1.toml
@@ -0,0 +1,10 @@
+base_model = "mistral/mistral-medium-2508"
+
+[cost]
+input = 2.4
+output = 12
+cache_read = 0.24
+
+[limit]
+context = 131072
+output = 104857
diff --git a/providers/topupsaja/models/ts/mistral-medium-3.toml b/providers/topupsaja/models/ts/mistral-medium-3.toml
new file mode 100644
index 00000000000..80d59c87df2
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-medium-3.toml
@@ -0,0 +1,14 @@
+base_model = "mistral/mistral-medium-2505"
+
+structured_output = true
+
+[cost]
+input = 2.4
+output = 12
+cache_read = 0.24
+
+[limit]
+output = 104857
+
+[modalities]
+input = ["text", "image", "pdf"]
diff --git a/providers/topupsaja/models/ts/mistral-small-3.1-24b-instruct.toml b/providers/topupsaja/models/ts/mistral-small-3.1-24b-instruct.toml
new file mode 100644
index 00000000000..c5a0a75ba37
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-small-3.1-24b-instruct.toml
@@ -0,0 +1,12 @@
+base_model = "mistral/mistral-small-3-1-24b-instruct-2503"
+
+structured_output = false
+tool_call = false
+
+[cost]
+input = 2.106
+output = 3.33
+cache_read = 1.053
+
+[limit]
+output = 102400
diff --git a/providers/topupsaja/models/ts/mistral-small-3.2-24b-instruct.toml b/providers/topupsaja/models/ts/mistral-small-3.2-24b-instruct.toml
new file mode 100644
index 00000000000..197c446986a
--- /dev/null
+++ b/providers/topupsaja/models/ts/mistral-small-3.2-24b-instruct.toml
@@ -0,0 +1,15 @@
+base_model = "mistral/mistral-small-2506"
+
+structured_output = true
+attachment = true
+
+[cost]
+input = 0.656
+output = 1.75
+cache_read = 0.328
+
+[limit]
+context = 256000
+
+[modalities]
+input = ["image", "text"]
diff --git a/providers/topupsaja/models/ts/muse-spark-1.3-contributor.toml b/providers/topupsaja/models/ts/muse-spark-1.3-contributor.toml
new file mode 100644
index 00000000000..6785e2dbb71
--- /dev/null
+++ b/providers/topupsaja/models/ts/muse-spark-1.3-contributor.toml
@@ -0,0 +1,17 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "meta/muse-spark-1.3"
+
+name = "Meta: Muse Spark 1.3 Contributor"
+
+[cost]
+input = 0.7
+output = 1.4
+cache_read = 0.014
+
+[limit]
+output = 943718
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high", "xhigh"]
diff --git a/providers/topupsaja/models/ts/muse-spark-1.3.toml b/providers/topupsaja/models/ts/muse-spark-1.3.toml
new file mode 100644
index 00000000000..db9a395fd70
--- /dev/null
+++ b/providers/topupsaja/models/ts/muse-spark-1.3.toml
@@ -0,0 +1,15 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "meta/muse-spark-1.3"
+
+[cost]
+input = 7.5
+output = 25.5
+cache_read = 0.9
+
+[limit]
+output = 943718
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high", "xhigh", "max"]
diff --git a/providers/topupsaja/models/ts/qwen-2.5-72b-instruct.toml b/providers/topupsaja/models/ts/qwen-2.5-72b-instruct.toml
new file mode 100644
index 00000000000..0d2d7b42d57
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen-2.5-72b-instruct.toml
@@ -0,0 +1,6 @@
+base_model = "alibaba/qwen-2.5-72b-instruct"
+
+[cost]
+input = 2.16
+output = 2.4
+cache_read = 1.08
diff --git a/providers/topupsaja/models/ts/qwen3.6-plus.toml b/providers/topupsaja/models/ts/qwen3.6-plus.toml
new file mode 100644
index 00000000000..26d1f9d6c29
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.6-plus.toml
@@ -0,0 +1,16 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "alibaba/qwen3.6-plus"
+
+structured_output = true
+
+[cost]
+input = 1.95
+output = 11.7
+cache_read = 0.975
+
+[[reasoning_options]]
+type = "toggle"
diff --git a/providers/topupsaja/models/ts/qwen3.7-flash.toml b/providers/topupsaja/models/ts/qwen3.7-flash.toml
new file mode 100644
index 00000000000..deaf068fc65
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.7-flash.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+# Budget: reasoning.max_tokens =
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "alibaba/qwen3.7-flash"
+
+structured_output = false
+
+[cost]
+input = 0.21
+output = 0.91
+cache_read = 0.042
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "budget_tokens"
diff --git a/providers/topupsaja/models/ts/qwen3.7-max.toml b/providers/topupsaja/models/ts/qwen3.7-max.toml
new file mode 100644
index 00000000000..26e1e0eeef9
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.7-max.toml
@@ -0,0 +1,19 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "alibaba/qwen3.7-max"
+
+structured_output = true
+
+[cost]
+input = 8.85
+output = 26.55
+cache_read = 1.77
+
+[limit]
+output = 131072
+
+[[reasoning_options]]
+type = "toggle"
diff --git a/providers/topupsaja/models/ts/qwen3.7-plus.toml b/providers/topupsaja/models/ts/qwen3.7-plus.toml
new file mode 100644
index 00000000000..f8d0127c971
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.7-plus.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "alibaba/qwen3.7-plus"
+
+structured_output = true
+
+[cost]
+input = 1.92
+output = 7.68
+cache_read = 0.384
+
+[limit]
+output = 131072
+
+[[reasoning_options]]
+type = "toggle"
+
+[modalities]
+input = ["text", "image"]
diff --git a/providers/topupsaja/models/ts/qwen3.8-2.4t-a95b-batch.toml b/providers/topupsaja/models/ts/qwen3.8-2.4t-a95b-batch.toml
new file mode 100644
index 00000000000..056a66da9f3
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.8-2.4t-a95b-batch.toml
@@ -0,0 +1,18 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "alibaba/qwen3.8-2.4t-a95b"
+
+name = "Qwen: Qwen3.8 2.4T A95B (batch)"
+
+[cost]
+input = 12
+output = 36
+cache_read = 1.5
+
+[limit]
+context = 1010000
+output = 909000
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "xhigh"]
diff --git a/providers/topupsaja/models/ts/qwen3.8-2.4t-a95b.toml b/providers/topupsaja/models/ts/qwen3.8-2.4t-a95b.toml
new file mode 100644
index 00000000000..d6cb2abd9d0
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.8-2.4t-a95b.toml
@@ -0,0 +1,15 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "alibaba/qwen3.8-2.4t-a95b"
+
+[cost]
+input = 12
+output = 36
+cache_read = 1.5
+
+[limit]
+context = 1048576
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "xhigh"]
diff --git a/providers/topupsaja/models/ts/qwen3.8-27b.toml b/providers/topupsaja/models/ts/qwen3.8-27b.toml
new file mode 100644
index 00000000000..ec88a76390f
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.8-27b.toml
@@ -0,0 +1,22 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "alibaba/qwen3.8-27b"
+
+[cost]
+input = 1.498
+output = 17.85
+cache_read = 1.05
+
+[limit]
+context = 1000000
+output = 131072
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "effort"
+values = ["low", "medium", "xhigh"]
diff --git a/providers/topupsaja/models/ts/qwen3.8-flash.toml b/providers/topupsaja/models/ts/qwen3.8-flash.toml
new file mode 100644
index 00000000000..bedf39d3ecb
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.8-flash.toml
@@ -0,0 +1,20 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+# Budget: reasoning.max_tokens =
+
+# Toggle: reasoning.enabled = true|false
+# https://openrouter.ai/docs/guides/best-practices/reasoning-tokens
+
+base_model = "alibaba/qwen3.8-flash"
+
+temperature = true
+
+[cost]
+input = 1.05
+output = 3.29
+cache_read = 0.112
+
+[[reasoning_options]]
+type = "toggle"
+
+[[reasoning_options]]
+type = "budget_tokens"
diff --git a/providers/topupsaja/models/ts/qwen3.8-max-0902.toml b/providers/topupsaja/models/ts/qwen3.8-max-0902.toml
new file mode 100644
index 00000000000..e9150666d72
--- /dev/null
+++ b/providers/topupsaja/models/ts/qwen3.8-max-0902.toml
@@ -0,0 +1,17 @@
+# TopUpSaja relays request bodies verbatim to OpenRouter /chat/completions
+
+base_model = "alibaba/qwen3.8-max-0902"
+
+structured_output = true
+
+[cost]
+input = 12
+output = 36
+cache_read = 1.5
+
+[[reasoning_options]]
+type = "effort"
+values = ["minimal", "low", "medium", "high", "xhigh"]
+
+[modalities]
+input = ["text", "image", "video"]
diff --git a/providers/topupsaja/models/ts/voxtral-small-24b-2507.toml b/providers/topupsaja/models/ts/voxtral-small-24b-2507.toml
new file mode 100644
index 00000000000..c80082281d4
--- /dev/null
+++ b/providers/topupsaja/models/ts/voxtral-small-24b-2507.toml
@@ -0,0 +1,14 @@
+base_model = "mistral/voxtral-small-24b-2507"
+
+structured_output = true
+
+[cost]
+input = 0.7
+output = 2.1
+cache_read = 0.07
+
+[limit]
+output = 26214
+
+[modalities]
+input = ["text", "audio", "pdf"]
diff --git a/providers/topupsaja/provider.toml b/providers/topupsaja/provider.toml
new file mode 100644
index 00000000000..781ce3369d9
--- /dev/null
+++ b/providers/topupsaja/provider.toml
@@ -0,0 +1,5 @@
+name = "TopUpSaja"
+npm = "@ai-sdk/openai-compatible"
+api = "https://api.topupsaja.com/v1"
+env = ["TOPUPSAJA_API_KEY"]
+doc = "https://topupsaja.com/docs"