Organizations, members, API keys, and the audit trail moved to their own pages:
vetta org, vetta keys, and vetta audit. There is no vetta billing group — the plan is vetta plan, the balance is vetta credits, and the card, the invoices and cancellation all live behind vetta plan portal.Commands
The plan
An organization starts with no plan, and a plan is what makes it usable:GET /v1/agents, POST /v1/sessions and everything else outside billing answer 402 subscription_required until one is active. Creating an organization does not start one, and neither does a credit balance — a full balance with no plan is still refused.
There are two plans. Standard is 200 per month, and each paid period grants 200 USD of credit. So the plan buys the right to run; the credit it grants is what the running costs. Included credit rolls over — it stays in the prepaid balance and never expires.
plan show
plan is standard or pro (null before the first subscription). A free trial reads status: "active" with trial_end set — there is no separate trial status — and pending_plan names a downgrade scheduled for current_period_end. trial_eligible says whether plan subscribe would start the free trial.
cancel_at_period_end is true once a cancellation has been asked for: the organization stays usable until current_period_end and is refused after it. This command answers whether or not a plan exists, so it is always safe to run — it is the one thing a lapsed organization can still ask.
plan subscribe
The free trial. On Standard, when
trial_eligible is true, the checkout starts a 7-day free trial: a card is required, 20 per month with the full $20 of credit unless you cancel first (vetta plan portal). One trial per organization and one per person; otherwise the same checkout bills on the day.
action_url is a hosted checkout page. Open it in a browser and pay it there — a card cannot be typed into a terminal, so this is the one step the CLI hands back to you. Copy the URL whole; it is printed on one line and unwrapped for exactly that reason.
subscribe while a plan is already active is refused with state_conflict — a second checkout would be a second plan billed; use vetta plan change to switch tiers. To cancel, use vetta plan portal below — vetta plan has no cancel command, and a cancellation takes effect at the end of the period already paid for either way.
plan change
Upgrading to Pro takes effect at once on the card already on file: the difference for the rest of the month is charged now and the billing date stays the same. Upgrading during the free trial ends the trial and charges $200 now. Moving back to Standard takes effect at
current_period_end — nothing is refunded, the Pro credit already granted is kept, and until then plan show reads plan: "pro" with pending_plan: "standard". Running --plan pro again before then takes the downgrade back. An organization with no active plan is refused with state_conflict; start one with plan subscribe. So is a plan already set to cancel at the end of its period.
plan portal
subscribe, it hands back a URL for a browser: none of those three is a thing a terminal can do.
subscribe it changes nothing by itself: whatever you do on that page arrives back as a confirmed event a moment later, so run vetta plan show to see the result.
An organization that has never held a plan has no account to manage, and the command says so rather than opening an empty page:
When a command is refused
Any command on an organization with no plan fails like this, and names the command that fixes it:code, so case statements that branch on it keep working; the remedy is a second line on stderr. Exit code is 1 — see exit codes.
The balance
What the plan does not cover: every token an agent spends is debited from the prepaid balance below.insufficient_credits (402) means top up; subscription_required (402) means the plan above.
show
mode is test for an sk_test_… credential and live for sk_live_…. A test-mode balance is not real money.
topup
ledger
Each entry carries full attribution and a
line_items breakdown by pricing tier, so a charge can always be traced to the run that caused it.
Money is exact.
--usd takes a decimal-dollar string and is converted client-side to integer micro-USD. JSON output amounts are integer *_micro_usd (1 USD = 1_000_000 micro-USD) so a script’s arithmetic never rounds; --human renders dollars for reading.