"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:

  1. The bank does not allow online payments abroad. In many apps this option is enabled separately. Some cards do not support it at all.
  2. 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.
  3. 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.
  4. Limits. A daily or monthly limit on online purchases, on purchases in foreign currency, or on operations abroad.
  5. 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".
  6. 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.
  7. Card type. Virtual and prepaid cards are rejected by some recipients more often than ordinary ones.
  8. 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:

MethodHow it works
SBPA 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.
CryptocurrencyUSDT and other coins.
MasterCardCommission 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:

bash
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:

bash
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

  1. Create a key in the dashboard.
  2. Give it a daily and monthly dollar limit.
  3. Run the test request above and look at the spend in "Usage".
  4. Replace model names in configs with identifiers from /v1/models.
  5. 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.

Get API keyDocumentation

api.zukko.pro · fetch_*

Your card was declined OpenRouter: causes and fixes · Zukko