Concepts
When a payment fails
A card gets declined, or expires. Here's what happens, day by day, and what your app should do if a check stops answering.
The day it fails
Nothing changes for your app. Vindex keeps screening as normal while Stripe retries the payment over the next two weeks.
- The card holder and the workspace's owners get an email, "We couldn't take your payment", with the date the workspace pauses if it still isn't paid: 14 days after the first failed attempt.
- Owners and admins see a banner on every dashboard page, with Update card.
GET /v1/plansaysstate: "past_due", andpauses_atis that date.
Update the card in the dashboard under Settings, Plan & billing (Manage in Stripe). Stripe charges the new card on its next try, and once the payment goes through, that's the end of it.
14 days on: paused
If the payment still hasn't gone through by pauses_at, the workspace pauses. Every POST /v1/check answers 402 subscription_paused, from live and test keys alike, and nothing is screened or logged:
{
"type": "https://api.getvindex.com/problems/subscription_paused",
"title": "Workspace paused",
"status": 402,
"detail": "Screening is paused: a payment has been failing since 1 October 2026, and the workspace paused on 15 October 2026. Update the card in Settings, Plan & billing; checks start again within about two minutes of the payment going through.",
"code": "subscription_paused",
"upgrade_url": "https://app.getvindex.com/settings#billing",
"plan": "growth",
"state": "paused",
"paused_since": "2026-10-15T01:00:00.000Z"
}Everything else keeps working: the dashboard, reading decisions and the review queue, rules, keys and settings. Pay, and checks start again within about two minutes.
If it's never paid: read-only
When Stripe stops retrying, it cancels the subscription (or marks it unpaid), and the plan ends. A plan you cancel yourself ends the same way, when the cancellation takes effect. From then on the workspace is read-only:
POST /v1/checkanswers402 subscription_inactive;- so does anything that sets something new up: adding or publishing a policy, adding or changing a rule, making a key, inviting someone;
- everything you already have can still be read, from the dashboard and with your keys: decisions, explanations, the review queue, usage.
Winding down still works too. You can revoke keys, delete rules, rule on items already in the queue, change settings and delete the workspace. Prompts are kept as long as the plan you had kept them (Plans & limits).
Choose a plan in Settings, Plan & billing to start screening again.
What your app should do with a 402
Treat it as "not screened". Don't retry in a loop: a 402 stays a 402 until someone pays or picks a plan. Hold the generation, and tell whoever looks after billing.
// check.mjs · Node 18+ · VINDEX_KEY=vx_live_... node check.mjs "a prompt"
const res = await fetch("https://api.getvindex.com/v1/check", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.VINDEX_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({ input: { prompt: process.argv[2] ?? "a lighthouse at dusk, oil painting" } }),
});
if (res.status === 402) {
const problem = await res.json();
// subscription_paused, subscription_inactive or plan_required: nothing was screened.
console.error(`not screened (${problem.code}): ${problem.upgrade_url}`);
process.exit(1); // hold the generation
}
const decision = await res.json();
console.log(decision.outcome);