Skip to main content

Credits & Billing

Creating things costs credits. Credits come from a subscription. If you have none, creation fails with a 402.

What things cost

OperationCredits
Create a vault1
Create a stream1
Create a data attachment1
Create a signature1
warning

Setting short_url in the config of a vault or data attachment costs one extra credit. A vault created with a short URL costs 2, not 1. This surcharge is not visible in the request schema and is the usual explanation for a balance dropping faster than expected.

Who pays

Not necessarily the caller.

  • Vaults are charged to the entity of the API key making the call.
  • Streams and data attachments are charged to the vault owner, resolved from the vault.

So if you write into a vault someone else owns and has shared with you, their credits are spent, not yours.

Checking your balance

curl "$FILEDGR_API/balances" \
-H "x-api-key: $FILEDGR_API_KEY" -H "x-api-secret: $FILEDGR_API_SECRET"

Returns the current balance and its timestamps. There is no consumption history or ledger — track your own spend if you need an audit trail.

On renewal the balance is replaced with the period allowance rather than added to it, so unused credits do not roll over. An annual payment sets twelve times the plan's monthly allowance up front.

note

GET /plans defaults to plan_type=CORPORATE. Pass ?plan_type=PERSONAL explicitly if you are looking for personal plans, or the list will look empty.

Two different 402s

The has_subscription field distinguishes them, and they need different handling:

{ "error": "InsufficientCreditsError", "message": "...",
"required": 1.0, "balance": 0.0, "has_subscription": false }
  • has_subscription: false — no active subscription. Subscribe.
  • has_subscription: true — subscribed but out of credits. Wait for renewal or top up.

The credit check is not a guarantee

warning

The pre-flight check fails open. If the billing service is unreachable, or the vault behind a stream cannot be resolved, creation is allowed to proceed and the shortfall is caught later — the resource ends up in an ERROR state instead of being refused up front.

The absence of a 402 therefore does not guarantee the operation will complete. Watch for the *.failed and *.error webhook events, and check entity status when something stalls.

The actual deduction happens asynchronously in a locked transaction after the pre-flight, so two concurrent creates can both pass the check and one can still fail.

Plans and subscriptions

GET /plans list available plans
GET /plans/{plan_id} plan detail
POST /subscriptions subscribe to a plan
GET /subscriptions your subscriptions
GET /subscriptions/{id} subscription detail

One subscription per entity. Attempting a second returns 400 (not 409, despite the conflict semantics).

A subscription moves through FILEDGR_RECEIVEDPAYMENT_PROCESSOR_RECEIVEDPAYMENT_PROCESSOR_COMPLETEDFILEDGR_PROCESSOR_COMPLETED. Credits only arrive at the final state.

warning

The final state serialises as FILEDGR_PROCESSOR_COMPLETED. Some internal code refers to it by the shorter name FILEDGR_COMPLETED — match on the value above, or your poll loop will never terminate.

Payment happens outside the API

Subscription responses carry a links object with subscription_link, and payment_link when there is an outstanding payment. Payment is completed through those links in a browser — there is no API call that settles it.

danger

Subscription links require an email credential on the account. An API key whose holder has no email credential gets a 404 explaining that no links can be issued, which makes subscribing impossible from a pure machine integration. Have a person subscribe through the web app first, then use the API key against the subscribed entity.