Skip to content

Latest commit

 

History

History
333 lines (267 loc) · 26.5 KB

File metadata and controls

333 lines (267 loc) · 26.5 KB

API Changelog

All notable changes to the LNVPS APIs are documented in this file.

The format is based on Keep a Changelog.

[Unreleased]

[v0.3.0] - 2026-06-17

Added

  • 2026-06-15 - GET /api/admin/v1/users/by-email — find a user by email address

    • Looks up a user via an indexed SHA-256 hash of the (lowercased, trimmed) email and returns the full AdminUserInfo, or a "User not found" error if no match.
    • Query parameter: email (required). Requires the users::view permission.
    • Backed by a new email_hash column on the users table, backfilled for existing users at startup.
  • 2026-04-03 - LNURL-pay endpoints for VM renewal restored

    • GET /.well-known/lnurlp/{id} — LNURL PayResponse for a VM. These endpoints were lost during the Rocket→Axum migration and are now working again (the path-parameter syntax was corrected for Axum).
    • GET /api/v1/vm/{id}/renew-lnurlp?amount={millisats} — returns an invoice to extend the VM via LNURL pay.
  • 2026-02-25 - Resource limits on custom pricing plans, propagated to custom templates

    • POST /api/admin/v1/custom_pricing — Accepts new optional fields: disk_iops_read, disk_iops_write, disk_mbps_read, disk_mbps_write, network_mbps, cpu_limit
    • PATCH /api/admin/v1/custom_pricing/{id} — Accepts the same limit fields; send null to remove a limit
    • GET /api/admin/v1/custom_pricing / GET /api/admin/v1/custom_pricing/{id} — Response now includes limit fields (omitted when uncapped)
    • Limits are copied from the pricing plan into each VmCustomTemplate at VM provisioning time (new VMs and template upgrades)
    • None / omitted = uncapped
  • 2026-02-25 - Template resource limits for fair-use and SLA enforcement (closes #26)

    • POST /api/admin/v1/vm_templates — Accepts new optional fields: disk_iops_read, disk_iops_write, disk_mbps_read, disk_mbps_write, network_mbps, cpu_limit
    • PATCH /api/admin/v1/vm_templates/{id} — Accepts the same limit fields; send null to remove a limit
    • GET /api/admin/v1/vm_templates / GET /api/admin/v1/vm_templates/{id} — Response now includes limit fields (omitted when uncapped)
    • Limits are applied at VM create time and on any VM configure/upgrade:
      • Disk IO: mbps_rd/mbps_wr/iops_rd/iops_wr on the primary disk via Proxmox API
      • Network bandwidth: rate=N on net0 interface
      • CPU limit: cpulimit VM config option (fraction of allocated cores)
    • None / omitted = uncapped (preserves existing behaviour for all current VMs)
  • 2026-02-24 - Cloud image checksum verification and on-demand download (closes #69)

    • POST /api/admin/v1/vm_os_images/{id}/download — Enqueue an immediate download/re-check of an OS image on all hosts (requires vm_os_image::update)
    • PATCH /api/admin/v1/vm_os_images/{id} — Now correctly applies sha2 and sha2_url updates
    • Worker: DownloadOsImages job fetches sha2_url, compares checksum via SSH, and re-downloads stale images; checksum is also passed to Proxmox download-url API for in-flight verification
  • 2026-02-24 - Added company_base_currency field to AdminVmPaymentInfo

    • GET /api/admin/v1/vms/{id}/payments — Response now includes company_base_currency
    • GET /api/admin/v1/vms/{id}/payments/{payment_id} — Response now includes company_base_currency
    • POST /api/admin/v1/vms/{id}/payments/{payment_id}/complete — Response now includes company_base_currency
  • 2026-02-23 - Sponsoring LIR Agreement generation (User API)

    • GET /api/v1/legal/sponsoring-lir-agreement?data={base64url_json} — Renders an unsigned LIR agreement HTML document from base64url-encoded JSON agreement data. Rejects data that carries a cryptographic proof.
    • GET /api/v1/legal/sponsoring-lir-agreement/from-subscription/{subscription_id} (NIP-98 auth) — Generates a cryptographically signed LIR agreement for one of the caller's own subscriptions, populating provider/end-user details from company and billing data. Returns a SignedAgreementUrlResponse.
  • 2026-02-23 - Admin endpoints to manually complete payments

    • POST /api/admin/v1/vms/{id}/payments/{payment_id}/complete — Mark a VM payment as paid, extend VM expiry, and dispatch provisioning (requires payments::update)
    • POST /api/admin/v1/subscription_payments/{id}/complete — Mark a subscription payment as paid, extend subscription by 30 days, and activate it (requires subscription_payments::update)

Changed

  • 2026-02-25 - Email verification is now required before creating a VM (closes #92)
    • POST /api/v1/vm — Returns 400 with error message if the user's email is not verified
    • POST /api/v1/vm/custom-template — Same gate applied
  • 2026-04-03 - Unpaid VMs with a non-expired pending payment are no longer auto-deleted
    • The worker cleanup loop now skips deletion of unpaid VMs that still have a pending (non-expired) payment, giving slower payment methods (e.g. Revolut) time to settle before the VM is removed.

Fixed

  • 2026-06-16 - VM→subscription backfill now runs reliably at startup

    • The backfill is executed during app startup, after schema migrations and before any VM read, and preserves each VM's existing expiry and auto-renewal preference. The legacy vm.expires / vm.created columns are no longer dropped before the backfill runs, which previously caused the backfill to fail for every VM and break all VM reads. (No external API surface change — listed for operator awareness.)
  • 2026-04-26 - Region capacity no longer reports IP ranges as full incorrectly

    • GET /api/v1/vm/templates and region availability — the gateway IP is now only counted as a used address when it actually falls within the allocation CIDR. Previously a gateway outside the range inflated the used-IP count and could falsely report a region/range as full while free IPs remained.
  • 2026-04-02 - Payments for already-deleted VMs are handled gracefully

    • POST /api/v1/vm/{id}/renew and payment confirmation — a payment that arrives for a VM auto-deleted before the (slow) payment settled now un-deletes the VM and applies the payment instead of erroring; the VM is then re-provisioned by the next check. Renewal/invoice creation for VMs that remain deleted is rejected with "VM not found".
    • A race where a VM paid between the cleanup snapshot and the deletion step could be deleted is fixed by re-reading VM state immediately before deletion.
  • 2026-02-23 - Fixed inability to unset cpu_mfg, cpu_arch, cpu_features fields via PATCH endpoints

    • PATCH /api/admin/v1/vm_templates/{id} — Now supports setting cpu_mfg, cpu_arch, cpu_features to null to clear values
    • PATCH /api/admin/v1/custom_pricing/{id} — Now supports setting cpu_mfg, cpu_arch, cpu_features to null to clear values
    • PATCH /api/admin/v1/hosts/{id} — Now supports setting cpu_mfg, cpu_arch, cpu_features to null to clear values
    • Previously, sending null for these fields was treated the same as omitting them (no change)

Added

  • 2026-03-10 - "creating" VM state for cleaner first-provision UX (closes #119)

    • GET /api/v1/vm, GET /api/v1/vm/{id}status.state now transitions to "creating" immediately after the first payment is confirmed and before the VM is provisioned on the host. The state is replaced by a real host state ("running", "stopped", etc.) once provisioning completes.
    • GET /api/admin/v1/vms, GET /api/admin/v1/vms/{id} — Same "creating" state visible in the admin API.
    • This gives frontends a meaningful status to display instead of a stale "stopped" state during initial provisioning.
  • 2026-03-10 - WebSocket console endpoint for VM serial terminal access (User API)

    • ANY /api/v1/vm/{id}/console (WebSocket upgrade) — Bidirectional relay between the client and the VM's serial console via the host provisioner. Authentication is passed via query parameter ?auth=<base64_nip98_event>.
  • 2026-03-10 - Stripe payment completion handling implemented

    • POST /api/v1/webhook/stripe — Incoming Stripe payment_intent.succeeded webhooks are now verified and processed, marking the matching subscription payment paid and running the standard completion pipeline.
    • Note: Stripe payment creation (checkout/intent creation for method=stripe on VM purchase, renewal, upgrade, and subscription renewal) is not yet implemented — those endpoints return an error for method=stripe. Only completion of externally-created Stripe payments is wired up.
  • 2026-03-10 - LNURL added as a payment method variant

    • GET /api/v1/payment/methods — Response may now include { "name": "lnurl", ... } when Lightning is enabled
  • 2026-03-10 - Upgrade added as a SubscriptionPayment.payment_type variant

    • GET /api/v1/subscriptions/{id}/payments — Payments created for VM upgrades now carry payment_type: "Upgrade"
    • Previously only Purchase and Renewal were possible
  • 2026-03-10 - processing_fee field added to SubscriptionPayment user API response

    • GET /api/v1/subscriptions/{id}/payments — Each payment now includes processing_fee: { currency, amount }

Changed

  • 2026-03-10 - VmRunningStates enum simplified — "starting" and "deleting" removed

    • GET /api/v1/vm, GET /api/v1/vm/{id}status.state now has four possible values: "unknown" (default before first poll), "running", "stopped", "creating". The former "starting" and "deleting" variants are no longer emitted.
    • GET /api/admin/v1/vms, GET /api/admin/v1/vms/{id} — Same change applies to running_state.state.
    • "unknown" is now the default value when no state has been cached yet, replacing the previous implicit "stopped" default.
  • 2026-03-10 - VmStatus.expires is now nullable

    • GET /api/v1/vm, GET /api/v1/vm/{id} — The expires field is now string | null (was always a string). It will be null for newly created VMs that have not yet been paid.
  • 2026-03-10 - GET /api/v1/vm/{id}/payments now uses database-level pagination

    • The endpoint now accepts ?limit=N&offset=N query parameters and returns a paginated response (data, total, limit, offset). Previously the list was unbounded.

Fixed

  • 2026-03-10 - VM subscription lookup query used incorrect type filter

    • Internal fix: the query that finds a VM's linked subscription was incorrectly using IN (3, 4) instead of = 3, which could return incorrect results.
  • 2026-03-10 - ApiVmPayment::from_subscription_payment now propagates JSON parse errors

    • Previously, a malformed metadata JSON field in a subscription_payment row would be silently ignored, potentially returning incorrect upgrade parameter data. Errors are now surfaced to the API caller.
  • 2026-03-10 - Expiry notification always sent when NWC auto-renewal is inactive

    • Workers now always send the expiry notification email/NIP-17 DM even when NWC is configured but auto_renewal_enabled is false for the subscription.

Removed

  • 2026-03-10 - Clarification: POST /api/admin/v1/vms/{id}/renew does not exist
    • The 2026-03-03 changelog entry incorrectly stated that multi-interval renewal was added to an admin renew endpoint. No such endpoint exists in the admin API. Multi-interval renewal is only available via the user-facing GET /api/v1/vm/{id}/renew?intervals=N.

Fixed

  • 2026-03-03 - VM upgrade no longer leaves subscription renewal cost stale

    • POST /api/v1/vm/{id}/upgrade — After payment confirmation, SubscriptionLineItem.amount is now updated to the new base-currency cost of the upgraded template for both standard→custom and custom→custom upgrade paths
    • GET /api/v1/subscriptions/{id} and admin equivalents — line_items[].price now reflects the post-upgrade renewal cost immediately after an upgrade completes
  • 2026-03-03 - Migration tool no longer marks subscriptions active for deleted VMs

    • VM subscription backfill — Subscriptions created for deleted VMs are now inserted with is_active = false

Changed

  • 2026-03-03 - Admin subscription list now returns results in descending order

    • GET /api/admin/v1/subscriptions — Results ordered by id DESC (newest first); applies to both the all-subscriptions list and the ?user_id=N filtered list
  • 2026-03-03 - Admin VM info response now includes subscription details

    • GET /api/admin/v1/vms/{id} — Response now includes a subscription object with the full AdminSubscriptionInfo (id, status, interval, currency, line items, payment count); omitted if no subscription is linked
  • 2026-03-03 - Admin subscription payment response now includes company_base_currency

    • GET /api/admin/v1/subscriptions/{id}/payments — Each payment now includes company_base_currency
    • GET /api/admin/v1/subscription_payments/{id} — Response now includes company_base_currency
    • POST /api/admin/v1/subscription_payments/{id}/complete — Response now includes company_base_currency
  • 2026-03-03 - VM payments now use the unified subscription_payment table

    • All VM renewal, purchase, and upgrade payments are now stored in subscription_payment instead of vm_payment
    • GET /api/v1/vm/{id}/payments — Response format unchanged; now backed by subscription_payment; supports pagination via ?limit=N&offset=N query params
    • GET /api/v1/vm/{id}/payments/{payment_id} — Now looks up by subscription_payment.id
    • GET /api/v1/vm/{id}/payments/{payment_id}/invoice — Now backed by subscription_payment
    • POST /api/v1/vm/{id}/renew — Returns payment from subscription_payment
    • POST /api/v1/vm/{id}/upgrade — Returns payment from subscription_payment; upgrade parameters stored in metadata JSON field
    • GET /api/admin/v1/vms/{id}/payments — Now backed by subscription_payment; uses real DB-level pagination
    • GET /api/admin/v1/vms/{id}/payments/{payment_id} — Now looks up by subscription_payment.id
    • POST /api/admin/v1/vms/{id}/payments/{payment_id}/complete — Now completes a subscription_payment
    • GET /api/admin/v1/reports/time-series — Revenue data now sourced from subscription_payment
    • GET /api/admin/v1/reports/referral-usage/time-series — Referral data now sourced from subscription_payment
    • Automatic data migration: existing VMs and vm_payment rows are backfilled into the subscription system automatically at app startup (no manual step). The backfill runs after schema migrations and before any VM reads, and is idempotent.
    • Schema migrations: 20260302151134_vm_subscription_link.sql (the DB-level NOT NULL on vm.subscription_line_item_id and the drop of legacy vm.expires/created/auto_renewal_enabled are deferred to finalization, run manually after production verification)
  • 2026-03-03 - Every VM is now linked to a subscription and subscription_line_item

    • vm table has a new subscription_line_item_id column (NOT NULL) linking it to the subscriptions system
    • New VMs provisioned via POST /api/v1/vm or POST /api/v1/vm/custom automatically get a subscription created
    • The subscription interval is copied from the cost plan (standard VMs) or defaults to 1 month (custom VMs)
  • 2026-03-03 - IntervalType enum renamed from VmCostPlanIntervalType

    • Affects admin responses that include cost plan or subscription interval information

Added

  • 2026-03-03 - Multi-interval VM renewal support
    • POST /api/v1/vm/{id}/renew — Accepts optional intervals query parameter to pre-pay multiple billing periods at once
    • POST /api/admin/v1/vms/{id}/renew — Same intervals support in admin renewal endpoint

[v0.2.0] - 2026-02-22

Changed

  • 2026-02-22 - Reduced unpaid VM deletion time from 24 hours to 1 hour
    • Unpaid VM orders are now deleted after 1 hour instead of 24 hours
    • Fixes #63

Added

  • 2026-02-22 - Added disabled field to VM model and admin PATCH endpoint

    • vm table now includes disabled column (default: false)
    • AdminVmInfo response now includes disabled field in all GET endpoints
    • PATCH /api/admin/v1/vms/{id} — New endpoint to update VM properties
    • Allows admins to disable/enable VMs without deleting them
    • When disabled state changes, a ConfigureVm work job is dispatched to reconfigure the VM on the host
    • On Proxmox hosts, disabled VMs have link_down=1 set on their network interface
  • 2026-02-22 - Added mtu field to host configuration

    • vm_host table now includes mtu column (optional, SMALLINT UNSIGNED)
    • AdminHostInfo response now includes mtu field in all GET endpoints
    • POST /api/admin/v1/hosts — Added optional mtu field for host creation
    • PATCH /api/admin/v1/hosts/{id} — Added optional mtu field for host update (use null to clear)
  • 2026-02-22 - Added additional fields to sales time-series report

    • GET /api/admin/v1/reports/time-series — Response now includes user_id, host_id, host_name, region_id, region_name fields in each payment record
    • Enables client-side filtering by user, host, or region
  • 2026-02-21 - Added endpoint to list free IPs in an IPv4 range (Admin API)

    • GET /api/admin/v1/ip_ranges/{id}/free_ips — Returns list of unassigned IP addresses
    • Only available for IPv4 ranges; IPv6 ranges return an error (too large to enumerate)
    • Excludes reserved IPs (gateway, network address, broadcast address)
  • 2026-02-20 - Added supported_currencies to payment method configuration

    • AdminPaymentMethodConfigInfo — New supported_currencies field (array of currency codes)
    • CreatePaymentMethodConfigRequest — New optional supported_currencies field
    • UpdatePaymentMethodConfigRequest — New optional supported_currencies field
    • GET /api/v1/payment/methods — Now returns currencies from DB config instead of hardcoded defaults
    • Empty array means use default currencies based on payment method type (Lightning: BTC, others: EUR/USD)
  • 2026-02-20 - Added cpu_mfg, cpu_arch, cpu_features to all admin API response models

    • AdminVmInfo — Now includes CPU specification fields from the VM's template
    • AdminVmTemplateInfo — Now includes CPU specification fields
    • AdminCustomPricingInfo — Now includes CPU specification fields
    • AdminHostInfo — CPU fields are now consistently documented as optional (omitted when unknown/empty)
    • POST /api/admin/v1/hosts — Added optional cpu_mfg, cpu_arch, cpu_features fields for host creation
    • PATCH /api/admin/v1/hosts/{id} — Added optional cpu_mfg, cpu_arch, cpu_features fields for host update
    • Fields are omitted from JSON when value is unknown (cpu_mfg/cpu_arch) or empty (cpu_features)
  • 2026-02-20 - Added paid_at timestamp to payment responses

    • VmPayment — New optional paid_at field (ISO 8601 datetime) indicating when the payment was completed
    • SubscriptionPayment — New optional paid_at field (ISO 8601 datetime) indicating when the payment was completed
    • AdminVmPaymentInfo — New optional paid_at field for admin payment views
    • AdminSubscriptionPaymentInfo — New optional paid_at field for admin payment views
    • Field is only present when is_paid is true; null/omitted for unpaid payments
  • 2026-02-20 - Added processing fee information to payment methods response

    • GET /api/v1/payment/methods — Response now includes optional processing_fee_rate, processing_fee_base, and processing_fee_currency fields
    • processing_fee_rate: Percentage rate (e.g., 1.0 for 1%)
    • processing_fee_base: Base amount in smallest currency units (cents for fiat, millisats for BTC)
    • processing_fee_currency: Currency for the base fee (e.g., "EUR")
    • NWC payment method is now only returned when Lightning is enabled
  • 2026-02-20 - Added CPU-aware host filtering to VM Templates, Custom Pricing, and Hosts (Admin API)

    • New enums: CpuMfg, CpuArch, CpuFeature, GpuMfg
    • POST /api/admin/v1/vm_templates — Added optional cpu_mfg, cpu_arch, cpu_features fields
    • PATCH /api/admin/v1/vm_templates/{id} — Added optional cpu_mfg, cpu_arch, cpu_features fields
    • POST /api/admin/v1/custom_pricing — Added optional cpu_mfg, cpu_arch, cpu_features fields
    • PATCH /api/admin/v1/custom_pricing/{id} — Added optional cpu_mfg, cpu_arch, cpu_features fields
    • AdminHostInfo response now includes cpu_mfg, cpu_arch, cpu_features (detected via lnvps-host-info)
    • When cpu_mfg/cpu_arch is "unknown" or cpu_features is empty, no filtering is applied (matches any host)
  • 2026-02-20 - Added SSH credentials for host utilities to Admin Host API

    • POST /api/admin/v1/hosts — Added optional ssh_user and ssh_key fields for host creation
    • PATCH /api/admin/v1/hosts/{id} — Added optional ssh_user and ssh_key fields for host update
    • AdminHostInfo response now includes ssh_user (string or null) and ssh_key_configured (boolean)
    • SSH key itself is never exposed in responses for security (only a boolean indicator)
    • SSH credentials are used by the PatchHosts worker to run lnvps-host-info utility for CPU/GPU detection
  • 2026-02-20 - Added CPU feature requirements to custom VM requests (User API)

    • POST /api/v1/vm/customcpu_mfg, cpu_arch, cpu_feature fields now accept strings instead of enums
    • Valid cpu_mfg values: "intel", "amd", "apple", "nvidia", "unknown"
    • Valid cpu_arch values: "x86_64", "arm64", "unknown"
    • CPU features are parsed from strings (e.g. "AVX2", "AES", "VMX"); invalid values are silently ignored
  • 2026-02-19 - Added Referral Program API endpoints

    • POST /api/v1/referral - Enroll in referral program with lightning address or NWC payout options
    • GET /api/v1/referral - Get referral state including per-currency earnings, payout history, and success/failed counts
    • PATCH /api/v1/referral - Update payout options (lightning_address, use_nwc)
  • 2026-02-17 - Added embedded API documentation served at root path (both User and Admin APIs)

    • GET / or GET /index.html - Renders API documentation with markdown viewer
    • GET /docs/endpoints.md - Raw markdown content of API endpoints documentation
    • GET /docs/changelog.md - Raw markdown content of API changelog
    • Documentation is embedded at compile time using include_str! and rendered client-side with marked.js
    • User API serves API_DOCUMENTATION.md, Admin API serves ADMIN_API_ENDPOINTS.md
  • 2026-02-17 - Added tax and processing_fee fields to AdminVmPaymentInfo response

    • Affected endpoints: GET /api/admin/v1/vms/{vm_id}/payments, GET /api/admin/v1/vms/{vm_id}/payments/{payment_id}
    • Both fields are u64 in smallest currency unit (cents for fiat, millisats for BTC)
  • 2026-02-17 - Added processing_fee field to AdminSubscriptionPaymentInfo response

    • Affected endpoints: GET /api/admin/v1/subscriptions/{id}/payments, GET /api/admin/v1/subscriptions/{id}/payments/{payment_id}
    • Field is u64 in smallest currency unit (cents for fiat, millisats for BTC)

Changed

  • 2026-02-18 - BREAKING CHANGE: ApiPrice.amount changed from f32 to u64 in smallest currency units

    • The Price type returned by user-facing endpoints now uses u64 integers instead of floats
    • Amounts are in smallest currency units: cents for fiat (EUR, USD, etc.), millisats for BTC
    • Affected endpoints: all endpoints returning Price objects, including:
      • GET /api/v1/templatesVmCostPlan.amount
      • GET /api/v1/vm/{id}/upgrade/quotecost_difference, new_renewal_cost, discount
      • GET /api/v1/subscriptions / GET /api/v1/subscriptions/{id}SubscriptionLineItem.price, SubscriptionLineItem.setup_fee
      • GET /api/v1/subscriptions/{id}/paymentsSubscriptionPayment.amount, SubscriptionPayment.tax
      • POST /api/v1/vm/custom/price — returned Price
    • Example: "amount": 10.99 (EUR float) becomes "amount": 1099 (cents)
    • Example: "amount": 0.00012345 (BTC float) becomes "amount": 12345 (millisats)
  • 2026-02-16 - BREAKING CHANGE: All money amounts now use u64 in smallest currency units (cents for fiat, millisats for BTC)

    • Requires database migration: Run 20260217100000_amount_to_cents.sql which converts existing data
    • Cost plan amount field changed from f32 (human-readable) to u64 (smallest units)
    • Custom pricing costs (cpu_cost, memory_cost, ip4_cost, ip6_cost) changed from f32 to u64
    • Custom pricing disk cost field changed from f32 to u64
    • VM template cost_plan_amount field changed from f32 to u64
    • Payment method config processing_fee_base field changed from f32 to u64
    • Affected endpoints:
      • POST /api/admin/v1/cost_plans, PATCH /api/admin/v1/cost_plans/{id}
      • POST /api/admin/v1/custom_pricing, PATCH /api/admin/v1/custom_pricing/{id}
      • POST /api/admin/v1/vm_templates, PATCH /api/admin/v1/vm_templates/{id}
      • POST /api/admin/v1/custom_pricing/{id}/calculate
      • POST /api/admin/v1/payment_methods, PATCH /api/admin/v1/payment_methods/{id}
    • Example: "amount": 10.99 (EUR) becomes "amount": 1099 (cents)
    • Example: "cpu_cost": 0.05 (BTC) becomes "cpu_cost": 5000000 (millisats = 5000 sats)
    • Example: "processing_fee_base": 0.20 (EUR) becomes "processing_fee_base": 20 (cents)
  • 2026-02-16 - Payment method config updates now support partial config updates

    • PATCH /api/admin/v1/payment_methods/{id} now accepts PartialProviderConfig instead of full ProviderConfig
    • Only fields included in the request are updated; missing fields retain their existing values
    • The type field is still required to identify the provider type
    • Cannot change provider type during update (e.g., from lnd to revolut)

Deprecated

  • 2026-02-16 - Bitvora payment provider has been disabled
    • Bitvora service has been shut down and is no longer available
    • The bitvora provider type is no longer supported for new configurations
    • Existing Bitvora configurations in the database are preserved for historical reference
    • Affected endpoints: POST /api/admin/v1/payment_methods, PATCH /api/admin/v1/payment_methods/{id}

Security

  • 2026-02-16 - Sanitized sensitive fields in AdminPaymentMethodConfigInfo responses
    • Provider config secrets (tokens, API keys, webhook secrets) are no longer returned in GET/list responses
    • Affected endpoints: GET /api/v1/admin/payment-config, GET /api/v1/admin/payment-config/{id}
    • Secrets are replaced with boolean indicators (e.g., has_token: true, has_webhook_secret: true)
    • Public/non-sensitive fields (URLs, client IDs, publishable keys) are still returned