Start adding or replacing the team's payment method

post/v1/tenants/{tenant_id}/billing-profile/payment-method/setup
Requires an API key

Signed-in tenant-admin of the project (and so of any project of the team) or Ivora staff; API keys are refused. Returns a Stripe-hosted setup page on Ivora's own Stripe account that saves a card for the project's team without charging it; it returns to the Platform's billing page (server-selected). Call the sync endpoint afterwards. Each call returns a new page; a card saved there replaces the team's current one for all of its projects.

Path parameters

  • tenant_idintegerRequired

Returns · 200

  • urlstringRequired
    Stripe-hosted page that saves a card for the team without charging it; open it now.
  • expires_atinteger | null
    Unix time the setup page expires.
  • billing_profileBillingProfileRecordRequired
    Child attributes
    • tenant_idintegerRequired
    • rate_cents_per_kwhstringRequired
      Ivora's CSMS usage fee for this project in US cents per kWh of charging, a decimal string: the project's override, else the team's rate (default 1.00).
    • rate_sourceenumRequired
      team: the team's default rate. project: a per-project override set by Ivora.
      One of team, project
    • currencystring
      Default "usd"
    • invoicingstring
      Invoiced monthly to the team's payment method, one line per project.
      Default "monthly"
    • teamBillingTeamSummaryRequired
      Child attributes
      • idstring | null
        The team billing account (team_...); null until it is first stored (the first card setup or staff change).
      • namestringRequired
      • rate_cents_per_kwhstringRequired
        The team's default usage fee in US cents per kWh, a decimal string (default 1.00).
      • discount_percentinteger
        The team's discount in percent (0 to 100, default 0), set by Ivora: its monthly invoice shows usage at the normal rate, discounted. 100 needs no payment method but is still invoiced (at $0); a waived team gets no invoice at all.
        Default 0 · Minimum 0 · Maximum 100
      • tenant_idsarray of integerRequired
        The team's projects (tenants); one invoice per team per month with a line per project.
    • statusenumRequired
      active: the team has a usable card on file. grace: no card yet, until grace_ends_at. enterprise: invoiced with net terms; no card needed, and an overdue invoice never blocks setup by itself. suspended: Ivora suspended the team's new CSMS setup and control (402 billing_suspended). past_due: a monthly invoice payment failed (past_due_since); new CSMS setup and control answer 402 payment_method_required 14 days later until it is paid. payment_method_required: new CSMS setup and control answer 402 payment_method_required. waived: Ivora waived the team's requirement and invoice. exempt: an Ivora internal team or the bench tenant. discounted: no card on file and a 100% discount; invoiced at $0 and no card is needed.
      One of active, grace, past_due, payment_method_required, waived, exempt, discounted, enterprise, suspended
    • csms_setup_allowedbooleanRequired
      Whether new CSMS setup and control (creating stations, locations and CSMS keys, commands, creating bills and external sessions) are allowed. Reads, OCPP traffic, stops and starting an existing bill or session are never blocked.
    • waivedbooleanRequired
      Ivora waived the team's payment method requirement; the team gets no invoice.
    • discount_percentinteger
      The team's discount in percent (0 to 100, default 0), set by Ivora: its monthly invoice shows usage at the normal rate, discounted. 100 needs no payment method but is still invoiced (at $0); a waived team gets no invoice at all.
      Default 0 · Minimum 0 · Maximum 100
    • exemptenum | null
      One of bench, internal
    • grace_ends_atstring | null
      End of the team's grace period (teams of tenants that existed before the fee: 30 days after its release).
    • past_due_sincestring | null
      When a payment of the team's monthly usage-fee invoice first failed; cleared once the unpaid invoices are paid.
    • payment_methodobject | null
      The team's default card.
      Child attributes
      • brandstring | null
        Card brand, such as visa.
      • last4string | null
      • exp_monthinteger | null
      • exp_yearinteger | null
      • expiredbooleanRequired
        The card's expiry month has passed; an expired card does not count as a payment method on file.
    • billing_modeenum
      self_serve: the card on file is charged automatically. enterprise (set by Ivora): a monthly invoice with net terms, paid by bank debit, bank transfer or as invoice_terms allow; no card needed.
      One of self_serve, enterprise · Default "self_serve"
    • invoice_termsobject | null
      enterprise only. The team's billing contacts, PO number and bank transfer instructions are on GET /v1/teams/{team_id}/billing.
      Child attributes
      • net_terms_daysintegerRequired
        Invoices are due this many days after they are sent.
      • payment_methodsarray of stringRequired
        How an invoice can be paid: us_bank_account (ACH debit), customer_balance (bank transfer: ACH credit or wire), acss_debit (Canadian pre-authorized debit in USD), card. Every invoice is in USD.
      • collectionenumRequired
        auto_debit: the verified bank account is debited on the due date. invoice_only: pay each invoice by its due date.
        One of auto_debit, invoice_only
    • bank_accountobject | null
      The team's bank account for enterprise invoices (ACH or pre-authorized debit).
      Child attributes
      • typeenumRequired
        us_bank_account: ACH Direct Debit (US). acss_debit: Canadian pre-authorized debit, in US dollars (a USD account at a Canadian bank).
        One of us_bank_account, acss_debit
      • bank_namestring | null
      • last4string | null
      • statusenumRequired
        verified: the mandate is active and an enterprise invoice is debited on its due date. pending_verification: confirm the microdeposits Stripe sent before it can be debited.
        One of verified, pending_verification
    • setup_pendingbooleanRequired
      A payment method setup was started for the team and not yet synchronized.
    • payment_modeenumRequired
      Stripe mode of Ivora's platform account here; only production is live.
      One of test, live
    • updated_atstring | null
    • current_monthobject | null
      The project's usage so far this UTC calendar month and its estimated usage fee, by the monthly invoice's rule; null when the CSMS cannot be read right now.
      Child attributes
      • periodstringRequired
        The current UTC calendar month, YYYY-MM.
      • period_startstringRequired
        Start of the month in UTC (inclusive), such as 2026-10-01T00:00:00+00:00.
      • period_endstringRequired
        Start of the next month in UTC (exclusive).
      • billable_fromstringRequired
        When the team's usage starts to be billed: the later of the usage fee's release and the end of the team's grace period. Sessions that ended before it are never invoiced.
      • energy_kwhstringRequired
        kWh of the project's completed charging sessions that ended this month (each session's whole energy, as the invoice counts it), a decimal string as the core records kWh, such as "6.941"; "0" without sessions. Sessions still running count when they end.
      • transactionsintegerRequired
        Number of those charging sessions (transactions).
      • billable_kwhstringRequired
        The part of energy_kwh that ended at or after billable_from: what the invoice bills.
      • billable_transactionsintegerRequired
      • held_transactionsintegerRequired
        Billable sessions with an implausible reading (negative or above 1000 kWh), left out of the estimate; they hold the team's invoice until Ivora corrects them.
      • invoicedbooleanRequired
        False when this usage is not invoiced: see not_invoiced_reason; estimated_minor is then 0.
      • not_invoiced_reasonenum | nullRequired
        internal: an Ivora internal team. bench: Ivora's test bench project. waived: the team's fee is waived. grace: the team's grace period runs until billable_from.
        One of internal, bench, waived, grace
      • rate_cents_per_kwhstringRequired
        The project's effective rate the estimate uses.
      • usage_minorintegerRequired
        The project's invoice line so far in US cents: billable_kwh x rate_cents_per_kwh, rounded half up.
      • discount_percentintegerRequired
        The team's discount the estimate applies.
        Minimum 0 · Maximum 100
      • discount_minorintegerRequired
        usage_minor x discount_percent / 100, rounded half up. The invoice rounds the discount once over all of the team's projects, so it can differ by a cent.
      • estimated_minorintegerRequired
        Estimated usage fee so far this month in US cents: usage_minor - discount_minor. The team's whole month (every project and any carried balance) is GET /v1/tenants/{tenant_id}/billing-profile/usage; the monthly invoice is final.
      • currencystring
        Default "usd"
      • as_ofstringRequired
        When the usage was read from the CSMS; reads are cached up to 60 seconds.
POST /v1/tenants/{tenant_id}/billing-profile/payment-method/setup
curl --fail-with-body -X POST "https://api.ivoracharge.com/v1/tenants/1042/billing-profile/payment-method/setup" \
  -H "Authorization: Bearer $IVORA_API_KEY"
Response · 200
{
  "url": "https://app.example.com/ivora/webhooks",
  "expires_at": 1,
  "billing_profile": {
    "tenant_id": 1042,
    "rate_cents_per_kwh": "string",
    "rate_source": "team",
    "currency": "usd",
    "invoicing": "monthly",
    "team": {
      "id": "id_0123456789abcdef",
      "name": "bay-01",
      "rate_cents_per_kwh": "string",
      "discount_percent": 0,
      "tenant_ids": [
        1042
      ]
    },
    "status": "active",
    "csms_setup_allowed": false,
    "waived": false,
    "discount_percent": 0,
    "exempt": "bench",
    "grace_ends_at": "2026-09-30T17:00:00Z",
    "past_due_since": "string",
    "payment_method": {
      "brand": "string",
      "last4": "string",
      "exp_month": 1,
      "exp_year": 1,
      "expired": false
    },
    "billing_mode": "self_serve",
    "invoice_terms": {
      "net_terms_days": 1,
      "payment_methods": [
        "string"
      ],
      "collection": "auto_debit"
    },
    "bank_account": {
      "type": "us_bank_account",
      "bank_name": "string",
      "last4": "string",
      "status": "verified"
    },
    "setup_pending": false,
    "payment_mode": "test",
    "updated_at": "2026-09-30T17:00:00Z",
    "current_month": {
      "period": "string",
      "period_start": "string",
      "period_end": "string",
      "billable_from": "string",
      "energy_kwh": "string",
      "transactions": 1,
      "billable_kwh": "string",
      "billable_transactions": 1,
      "held_transactions": 1,
      "invoiced": false,
      "not_invoiced_reason": "internal",
      "rate_cents_per_kwh": "string",
      "usage_minor": 1250,
      "discount_percent": 0,
      "discount_minor": 1250,
      "estimated_minor": 1250,
      "currency": "usd",
      "as_of": "string"
    }
  }
}
Try it is not available here yetRequests from this page are off until the production API at https://api.ivoracharge.com is public. Use the code samples from your application server; Ivora grants production access. Keys are created in Developer tools.