InfraNest Billing API

The Billing API from InfraNest — 7 operation(s) for billing.

Operations 7

GET /api/organizations/{organization_id}/subscription Get the subscription #
GET /api/organizations/{organization_id}/subscription/impact Preview what a plan change would lock #
GET /api/organizations/{organization_id}/subscription/addons List add-ons #
GET /api/organizations/{organization_id}/subscription/insights Read what the plan page knows about this organization #
GET /api/organizations/{organization_id}/invoices List invoices #
GET /api/organizations/{organization_id}/credit-notes List credit notes #
GET /api/organizations/{organization_id}/account-credit Get account credit #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/infranest:infranest-billing-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

infranest-billing-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: InfraNest Billing API
  description: Domains, DNS, cloud servers, certificates and uptime monitoring in one API, across the registrars, DNS hosts and clouds you already use, such as Cloudflare, Route 53, Hetzner and GoDaddy. Start in a free sandbox with sample data, use scoped tokens, try DNS changes as a dry run first, and retry safely with idempotency keys.
  version: 1.0.0
  x-logo:
    url: https://developers.infranest.io/logo.svg
    altText: InfraNest
  contact:
    name: InfraNest
    url: https://developers.infranest.io
  termsOfService: https://infranest.io/terms
servers:
- url: https://api.infranest.io
security:
- default: []
tags:
- name: Billing
  description: ''
paths:
  /api/organizations/{organization_id}/subscription:
    get:
      summary: Get the subscription
      operationId: getApiOrganizationsOrganization_idSubscription
      description: The organization’s subscription and plan, the plan whose limits currently apply, whether a free trial is still available and any discount in force. Read-only; returns 404 when there is no subscription.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                id: 1
                organization_id: 1
                plan_id: 2
                status: active
                provider: stripe
                provider_subscription_id: sub_demo_northwind
                trial_ends_at: null
                current_period_start: '2026-01-01T00:00:00.000000Z'
                current_period_end: '2026-02-15T12:00:00.000000Z'
                canceled_at: null
                created_at: '2026-01-15T12:00:00.000000Z'
                updated_at: '2026-01-15T12:00:00.000000Z'
                cancel_at_period_end: false
                stripe_price_id: null
                currency: eur
                trial_reminder_sent_at: null
                renewal_reminder_sent_at: null
                card_expiry_reminder_sent_at: null
                addons: []
                card_on_file: false
                trial_recap_sent_at: null
                trial_last_call_sent_at: null
                trial_first_steps_sent_at: null
                trial_ended_at: null
                trial_reactivation_sent_at: null
                recap_period_start: null
                renewal_recap_sent_for: null
                discount_code: null
                discount_percent: null
                discount_amount_off: null
                discount_duration: null
                discount_starts_at: null
                discount_ends_at: null
                discount_label: null
                grace_reminder_sent_at: null
                stay_offer_used_at: null
                paused_until: null
                pause_used_at: null
                pause_limits: null
                pause_reminder_sent_at: null
                pending_plan_id: null
                pending_cadence: null
                pending_change_at: null
                stripe_schedule_id: null
                collection_method: null
                plan:
                  id: 2
                  name: Pro
                  slug: pro
                  description: For freelancers & solo devs — faster checks, cloud, API and automations.
                  limits:
                    api: true
                    rate:
                      manual_sync_per_hour: 30
                      domain_checks_per_hour: 100
                      monitor_checks_per_hour: 120
                      provider_api_per_minute: 300
                    cloud: true
                    api.mcp: true
                    domains: 100
                    servers: 10
                    api.read: true
                    monitors: 50
                    webhooks: true
                    api.write: true
                    dns.drift: true
                    dns_zones: 100
                    drop_catch: true
                    automations: 25
                    data_import: true
                    dynamic_ips: 10
                    certificates: 100
                    status_pages: 3
                    team_members: 3
                    cloud.backups: true
                    cloud.volumes: true
                    dns.templates: true
                    organizations: 1
                    api.tokens_max: 5
                    cloud.firewalls: true
                    cloud.snapshots: true
                    watched_domains: 50
                    cloud.volumes_max: 10
                    external_monitors: 5
                    dropcatch.register: true
                    cloud.firewalls_max: 5
                    audit.retention_days: 30
                    domains.registration: true
                    monitor_min_interval: 60
                    monitoring.incidents: true
                    reputation.check_days: 7
                    monitoring.maintenance: true
                    cloud.load_balancers_max: 0
                    monitoring.calendar_feed: true
                    monitoring.retention_days: 90
                    monitoring.uptime_targets: true
                    status_page_custom_domain: true
                    dns.history_retention_days: 90
                    automations.automatic_fixes: true
                    automations.premium_actions: true
                    integrations.connections_max: 5
                  price_monthly: 2250
                  price_yearly: 22800
                  active: true
                  created_at: '2026-01-15T12:00:00.000000Z'
                  updated_at: '2026-01-15T12:00:00.000000Z'
                  is_public: true
                  sort_order: 2
                  stripe_product_id: null
                  stripe_prices: null
                  prices:
                    eur:
                      yearly: 22800
                      monthly: 2250
                  trial_days: 0
                  recommended: false
                  name_i18n: null
                  description_i18n: null
                  badge: null
                  tagline_i18n:
                    de: Freelancer & Solo-Entwickler
                    en: Freelancers & solo devs
                    fr: Freelances & développeurs solo
                    nl: Freelancers & solo-ontwikkelaars
                  highlights_i18n:
                    de:
                    - Alles in Free
                    - 100 Domains
                    en:
                    - Everything in Free
                    - 100 domains
                    fr:
                    - Tout dans Free
                    - 100 domaines
                    nl:
                    - Alles in Free
                    - 100 domeinen
                  contact_sales: false
                  contact_url: null
                effective_plan_id: 2
                effective_plan_slug: pro
                plan_source: subscription
                inherited_from: null
                covers: []
                promotion_eligible: false
                trial_available: false
                referral_welcome: null
                suggested_promotion_code: null
                discount: null
                fitting_plan_id: 3
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/subscription/impact:
    get:
      summary: Preview what a plan change would lock
      operationId: gETsubscriptionimpactWhatAPlanChangeWouldLockRefuseOrTurnOffBeforeItIsConfirmed3585
      description: 'What changes for this organization if it moves to another plan: the items over a limit that would be locked (with the first few named), the counts that stay but cannot grow, monitors that would check less often, and the features it would lose. Pass `plan_id` for a plan change, or leave it out to preview where the organization lands when its subscription ends. `lines` words the same changes in `locale` (en, nl, de or fr). Read-only; empty when nothing changes.'
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                rows:
                - type: interval
                  count: 1
                  seconds: 300
                lines:
                - 1 monitor checks every 5 minutes instead of at its own faster interval.
                groups:
                  stops:
                  - 1 monitor checks every 5 minutes instead of at its own faster interval.
                  keeps: null
                  features: null
                locks_on: null
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                plan_id:
                  type:
                  - integer
                  - 'null'
                  description: ''
                  example: 16
                locale:
                  type:
                  - string
                  - 'null'
                  description: ''
                  example: en
                  enum:
                  - en
                  - nl
                  - de
                  - fr
                  - null
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/subscription/addons:
    get:
      summary: List add-ons
      operationId: gETsubscriptionaddonsPublicAddOnsWithPrices+WhichAreActiveForThisOrg177
      description: The add-ons on offer with their prices, each marked `owned` when the organization already has it. Read-only.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example: []
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/subscription/insights:
    get:
      summary: Read what the plan page knows about this organization
      operationId: gETsubscriptioninsightsWhatThePlanPageKnowsAboutThisWorkspace55615562TheMonthsReceiptEvidenceFromItsOwnHistoryWhatEachPlanWouldMeanForWhatItHasAGrowthForecastAndWhatItsTeamAskedForReadOnlyTenMinutesPerWorkspaceAndLanguageBecauseTheReceiptIsAMonthOfRecap
      description: 'Facts specific to this organization, for choosing a plan: `receipt` (what InfraNest did for it in the last 30 days, when it pays), `evidence` (up to two lines from its own history that a bigger plan would have changed; empty while a critical problem is open), `plans` (per plan id: whether everything fits, and if not how many items would lock and the first of them), `forecast` (counts growing steadily toward the current limit, with the weeks left) and `asked` (entitlement keys members asked for in the last 90 days). Worded in `locale` (en, nl, de or fr). Read-only; cached for ten minutes.'
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                receipt:
                - title: 6 outages caught and alerted
                  detail: ''
                  url: http://localhost/monitoring/incidents
                - title: 103,680 checks run across your 13 monitors
                  detail: ''
                  url: http://localhost/monitoring
                evidence: []
                plans:
                  '1':
                    fits: true
                    locks: 0
                    first: null
                  '3':
                    fits: true
                    locks: 0
                    first: null
                forecast: []
                asked: []
                tried: []
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/invoices:
    get:
      summary: List invoices
      operationId: gETinvoicesTheOrgsInvoicesbackfilledFromStripeSoHistoryShows
      description: Your most recent 100 invoices, newest first, with their status, totals, billing period and links to view or download each one. Read-only.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
              - id: 6
                number: INF-2026-0100
                status: paid
                currency: eur
                total: 4719
                tax: 819
                paid_at: '2026-01-02T00:00:00.000000Z'
                hosted_invoice_url: null
                invoice_pdf: null
                period_start: '2026-01-01T00:00:00.000000Z'
                period_end: '2026-01-31T23:59:59.000000Z'
                created_at: '2026-01-01T00:00:00.000000Z'
              - id: 5
                number: INF-2025-0101
                status: paid
                currency: eur
                total: 4719
                tax: 819
                paid_at: '2025-12-02T00:00:00.000000Z'
                hosted_invoice_url: null
                invoice_pdf: null
                period_start: '2025-12-01T00:00:00.000000Z'
                period_end: '2025-12-31T23:59:59.000000Z'
                created_at: '2025-12-01T00:00:00.000000Z'
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/credit-notes:
    get:
      summary: List credit notes
      operationId: gETcreditNotesTheReversingHalfOfTheOrgsBillingHistory642
      description: Credit notes issued against your invoices, with the invoice each one credits, its amounts (negative, in the currency’s smallest unit), how it was settled and a PDF link. Read-only.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example: []
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
  /api/organizations/{organization_id}/account-credit:
    get:
      summary: Get account credit
      operationId: gETaccountCreditMoneyWeOweThemPerCurrency662
      description: Money InfraNest holds for you — for example after a downgrade or a refund — which comes off your next invoice. One balance per currency, in the currency’s smallest unit; empty when you have none. Read-only.
      parameters:
      - in: path
        name: organization_id
        required: true
        description: Your organization's ID.
        schema:
          type: integer
      responses:
        '200':
          description: OK
          content:
            application/json:
              example:
                credit: []
        '401':
          $ref: '#/components/responses/Error401'
        '403':
          $ref: '#/components/responses/Error403'
        '404':
          $ref: '#/components/responses/Error404'
        '429':
          $ref: '#/components/responses/Error429'
      tags:
      - Billing
      x-infranest-scope: billing.read
      x-infranest-token-writable: false
      x-infranest-module: billing
      x-infranest-errors:
      - unauthenticated
      - scope_missing
      - wrong_organization
      - test_token_required
      - test_token_sandbox_only
      - permission_denied
      - not_found
      - rate_limited
components:
  responses:
    Error401:
      description: The token is missing, wrong, expired or revoked. The body is an Error; its `code` says which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error404:
      description: Nothing exists at this address, or you cannot see it. The body is an Error; its `code` says which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error429:
      description: 'Too many requests: wait the seconds in Retry-After. The body is an Error; its `code` says which.'
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error403:
      description: The token or your role may not do this here. The body is an Error; its `code` says which.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Error:
      type: object
      required:
      - code
      - message
      - hint
      - retryable
      properties:
        code:
          type: string
          enum:
          - unauthenticated
          - scope_missing
          - session_only
          - not_token_writable
          - write_disabled
          - wrong_organization
          - token_ip_not_allowed
          - test_token_required
          - test_token_sandbox_only
          - api_token_required
          - sandbox_personal
          - sandbox_needs_organization
          - organization_offline
          - permission_denied
          - forbidden
          - organization_suspended
          - read_only_session
          - sso_required
          - two_factor_setup_required
          - password_reset_required
          - email_verification_required
          - plan_limit
          - not_found
          - method_not_allowed
          - conflict
          - validation_failed
          - unprocessable
          - range_too_large
          - rate_limited
          - idempotency_key_reused
          - idempotency_in_progress
          - provider_refused
          - provider_rate_limited
          - provider_unavailable
          - maintenance
          - server_error
          description: 'What kind of error this is. Stable: codes are added, never renamed or removed.'
        message:
          type: string
          description: A sentence for people. May be reworded.
        hint:
          type: string
          description: What to do about it.
        retryable:
          type: boolean
          description: Whether the same request can succeed later unchanged.
        docs_url:
          type: string
          format: uri
        reference:
          type: string
          description: The request ID; also the X-Request-Id header.
        retry_after:
          type: integer
          description: Seconds to wait before retrying.
        required:
          type: string
          description: The missing token scope (scope_missing).
        required_permission:
          type: string
          description: The missing role permission (permission_denied).
        errors:
          type: object
          additionalProperties:
            type: array
            items:
              type: string
  securitySchemes:
    default:
      type: http
      scheme: bearer
      description: Create a token in the app under My account → Developer. Tokens are managed in the app only, never through the API.
externalDocs:
  description: 'InfraNest: domains, DNS, cloud servers, certificates and uptime monitoring in one place'
  url: https://infranest.io