Credits & top-ups

View as Markdown

Credits are the currency for all usage. One credit is $0.001. Your plan grants a batch each cycle; this page covers how the balance works, how to buy more, and how to avoid running dry mid-run.

Your balance

A balance has three parts:

  • Monthly credits - the stipend your plan grants each cycle. Resets at renewal.
  • Purchased credits - credits you bought. They carry over between cycles until spent.
  • Outstanding debt - usage already run that hasn’t been settled against credits.

Your effective balance is monthly plus purchased, minus debt. When it reaches zero, new billable work is blocked.

Read the live balance from the usage endpoint:

1const { credits, isBlocked } = await bctrl.usage.get();
2
3credits.monthlyRemaining; // plan credits left this cycle
4credits.purchasedRemaining; // top-up credits left
5credits.effectiveBalance; // available minus outstanding debt
6isBlocked; // true once the effective balance hits zero

Top up

Developer and Business plans can buy credits anytime from the dashboard. Buy any amount; at $0.001 per credit, a $50 top-up adds 50,000 credits. Purchased credits carry over between cycles - only the monthly stipend resets.

Free plans cannot buy credits. They stop billable work when the monthly stipend runs out.

Auto-reload

Auto-reload buys credits for you so a job never stalls on an empty balance. Configure it in the dashboard with three settings:

  • Threshold - the balance at which a reload triggers.
  • Amount - how many credits to buy per reload.
  • Monthly cap - the most auto-reload will spend in a calendar month.

A reload fires when your balance drops below the threshold, or when a run needs funds it doesn’t have. BCTRL buys another batch up to the monthly cap. Available on Developer and Business.

When you run out

PlanWhat happens
FreeBillable work stops until the next cycle.
Developer / BusinessRuns continue on purchased credits or auto-reload. Without either, new billable work is blocked until you top up.

When work is blocked, usage.get() returns isBlocked: true and a blockedReasons list.

Next