"Your card was declined" in OpenRouter: why a card gets rejected
Why a card payment can be rejected on a foreign service, what you can check yourself and how to connect models when payment does not go through.
6 min · · errors · payments
The message "Your card was declined" in OpenRouter appears at the top-up step: you enter a card, the payment form answers with a refusal, and the balance stays at zero. An important note first: we do not represent OpenRouter and do not know its internal rules, so we cannot name a single cause in your specific case. But such a refusal has a typical set of causes, and most can be checked in ten minutes. Below is a checking order and a fallback path if the card does not go through.
Your card was declined: what the message means
This is a payment system response: the charge request was rejected by your card's issuing bank or by the service's payment processor. The service often receives only a generic decline code and shows a generic text, while the detailed reason is known to the bank. So "declined" can mean completely different things: from a mistyped CVC to a ban on payments to foreign recipients on the bank's side.
Distinguish a payment refusal from API unavailability. If you cannot top up at all, it is a payment problem. If you have a balance but requests return an error, that is a different story, covered at the end.
Typical causes of refusal
The list is common to paying on any foreign service:
- The bank does not allow online payments abroad. In many apps this option is enabled separately. Some cards do not support it at all.
- 3-D Secure was not passed. The code did not arrive by SMS or in the app, the entry time ran out, or the code was wrong. The form may show this as a generic refusal.
- The bank's anti-fraud. A first large payment to a foreign service in dollars is often blocked automatically. A call to the bank or confirmation in the app sometimes helps.
- Limits. A daily or monthly limit on online purchases, on purchases in foreign currency, or on operations abroad.
- Insufficient funds after conversion. If the card is in rubles, the bank converts dollars at its own rate and may add a fee. The amount may be short even though the account formally holds "exactly enough".
- Wrong data. Number, expiry, CVC, cardholder name, address and postal code for address verification. Address fields often cause a refusal if they do not match the bank's records.
- Card type. Virtual and prepaid cards are rejected by some recipients more often than ordinary ones.
- Restrictions of the service or its processor. Which issuing countries and payment instruments are accepted is determined by the service. You cannot check this item yourself; read the service's terms or ask its support.
What to check yourself
- Call the bank or open its app and ask why the operation at such a time for such an amount was declined. The bank sees the reason; the service does not.
- Check card settings: online payments, payments abroad, limits, 3-D Secure.
- Try a smaller amount (the minimum top-up) to rule out limits.
- Check the form data and the address in your profile.
- Do not make ten attempts in a row. Frequent refusals can alert the anti-fraud systems of the bank and the service.
- Read the service's terms and help on accepted payment methods and regions, and write to its support if needed.
What not to do: look for schemes with other people's cards, intermediaries of unknown origin and ways around restrictions. This violates payment system rules, does not guarantee a result and may cost you money.
"OpenRouter does not work in Russia": what it can mean
The phrase combines different situations, and telling them apart matters:
- Payment fails. Covered above. The bank or payment processor rejects the operation.
- The site or dashboard does not open. A network problem or access to the service.
- Requests return an error while a balance exists. Open the response body: it usually says what is wrong (no funds, unknown model, a model-provider limit).
- Unstable work of individual models. This may be an outage at the provider of a specific model rather than at the gateway.
Whether a service is available in your region and accepts your payment method can be reliably established only from its own terms and status page. We do not assert that on its behalf.
A fallback: another gateway with clear payment
If the goal is to get working access to models rather than to sort things out with a payment processor, you can connect another OpenAI-compatible gateway. In Zukko, access from Russia is organized through a gateway, and payment goes in three ways:
| Method | How it works |
|---|---|
| SBP | A payment in rubles at the market rate at the moment of payment; the payment page adds 8.5% on top. The billed dollar amount is credited to the balance. |
| Cryptocurrency | USDT and other coins. |
| MasterCard | Commission about 13%, amounts from $2 to $594. |
An SBP example: to get $10 on the balance, the payment is $10 × 1.085 = $10.85 in rubles at the rate at the moment of payment. For MasterCard at about 13%: $10 × 1.13 = $11.30. Top-ups start at $1. Whether your bank accepts a specific card depends on the bank, so SBP or crypto is often more convenient. Step-by-step: paying via SBP.
The method is neither free nor magic: you pay model rates plus the payment page commission. But "the card is not accepted" stops being the single point of failure.
How to move code from OpenRouter
If you already have an application or tool configured for OpenRouter, three things change: the address, the key and the model names. Before, the code held the OpenRouter address and its key; now it looks like this:
from openai import OpenAI
client = OpenAI(
base_url="https://api.zukko.pro/v1",
api_key="fetch_your_key",
)
resp = client.chat.completions.create(
model="claude-sonnet-5-5", # the name may have carried a provider prefix before
messages=[{"role": "user", "content": "Answer in one word: does it work?"}],
)
print(resp.choices[0].message.content)Model names are written differently across gateways: in many gateways the identifier contains a provider prefix, while here it is simply claude-sonnet-5-5, gpt-6.1-sol, deepseek-v4.1-flash. The current list comes from GET https://api.zukko.pro/v1/models:
curl https://api.zukko.pro/v1/models -H "Authorization: Bearer $ZUKKO_API_KEY"If instead of the OpenAI SDK you use a tool with "Base URL" and "API Key" fields, enter the same values. A detailed migration walkthrough: moving from OpenRouter to Zukko, a comparison of approaches: Zukko versus OpenRouter.
Checklist after connecting
- Create a key in the dashboard.
- Give it a daily and monthly dollar limit.
- Run the test request above and look at the spend in "Usage".
- Replace model names in configs with identifiers from
/v1/models. - If a tool complains about the response format, check its documentation: some clients expect fields specific to a particular gateway.
FAQ
Why is the card declined even though there is money on it?
Most often because of a ban on foreign online payments, the bank's anti-fraud or a failed 3-D Secure. The bank sees the reason, so call it.
Can I pay OpenRouter other than by card?
Which payment methods OpenRouter has is determined by the service itself. Check its current help. We do not know and do not assert this.
Which payment methods does Zukko have?
SBP, cryptocurrency and MasterCard cards. Top-ups start at $1.
Can I try it without spending anything?
There is no free access, but there is a one-time $0.50 for subscribing to the Telegram channel @zukkopro, once per Telegram account. That is enough for test requests.
zukko
Pay 25×
less
for Claude Code & ChatGPT
One fetch_* key and base URL api.zukko.pro — for Cursor, Claude Code, Codex, and any SDK.
Related articles
- OpenAI API Keys in the Open: Why You Should Not Use ThemWhere free keys on GitHub come from, why using them is dangerous for you and for the owner, and how to protect your own key from the same leak.
- GLM API Errors: Why the Request Fails and How to Fix ItA wrong model id, an overflowing 128K context, the key, the balance, limits: the typical causes of GLM API errors and a quick way to find yours.
- This organization has been disabled in the Claude API: What to DoAn Anthropic key suddenly answers "organization has been disabled". What the error is, what to check, and how to move the SDK and Claude Code to another provider.
- JetBrains AI Assistant not working: causes and workaroundsAI Assistant will not activate, stays silent or is off for some files. We go through the causes in the JetBrains docs and connect your own models via a gateway.