All notable changes to the LNVPS APIs are documented in this file.
The format is based on Keep a Changelog.
-
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 theusers::viewpermission. - Backed by a new
email_hashcolumn on the users table, backfilled for existing users at startup.
- Looks up a user via an indexed SHA-256 hash of the (lowercased, trimmed) email and returns the full
-
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_limitPATCH /api/admin/v1/custom_pricing/{id}— Accepts the same limit fields; sendnullto remove a limitGET /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
VmCustomTemplateat 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_limitPATCH /api/admin/v1/vm_templates/{id}— Accepts the same limit fields; sendnullto remove a limitGET /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_wron the primary disk via Proxmox API - Network bandwidth:
rate=Nonnet0interface - CPU limit:
cpulimitVM config option (fraction of allocated cores)
- Disk IO:
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 (requiresvm_os_image::update)PATCH /api/admin/v1/vm_os_images/{id}— Now correctly appliessha2andsha2_urlupdates- Worker:
DownloadOsImagesjob fetchessha2_url, compares checksum via SSH, and re-downloads stale images; checksum is also passed to Proxmoxdownload-urlAPI for in-flight verification
-
2026-02-24 - Added
company_base_currencyfield toAdminVmPaymentInfoGET /api/admin/v1/vms/{id}/payments— Response now includescompany_base_currencyGET /api/admin/v1/vms/{id}/payments/{payment_id}— Response now includescompany_base_currencyPOST /api/admin/v1/vms/{id}/payments/{payment_id}/complete— Response now includescompany_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 aSignedAgreementUrlResponse.
-
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 (requirespayments::update)POST /api/admin/v1/subscription_payments/{id}/complete— Mark a subscription payment as paid, extend subscription by 30 days, and activate it (requiressubscription_payments::update)
- 2026-02-25 - Email verification is now required before creating a VM (closes #92)
POST /api/v1/vm— Returns400with error message if the user's email is not verifiedPOST /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.
-
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.createdcolumns 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.)
- 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
-
2026-04-26 - Region capacity no longer reports IP ranges as full incorrectly
GET /api/v1/vm/templatesand 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}/renewand 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_featuresfields via PATCH endpointsPATCH /api/admin/v1/vm_templates/{id}— Now supports settingcpu_mfg,cpu_arch,cpu_featurestonullto clear valuesPATCH /api/admin/v1/custom_pricing/{id}— Now supports settingcpu_mfg,cpu_arch,cpu_featurestonullto clear valuesPATCH /api/admin/v1/hosts/{id}— Now supports settingcpu_mfg,cpu_arch,cpu_featurestonullto clear values- Previously, sending
nullfor these fields was treated the same as omitting them (no change)
-
2026-03-10 -
"creating"VM state for cleaner first-provision UX (closes #119)GET /api/v1/vm,GET /api/v1/vm/{id}—status.statenow 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 Stripepayment_intent.succeededwebhooks 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=stripeon VM purchase, renewal, upgrade, and subscription renewal) is not yet implemented — those endpoints return an error formethod=stripe. Only completion of externally-created Stripe payments is wired up.
-
2026-03-10 -
LNURLadded as a payment method variantGET /api/v1/payment/methods— Response may now include{ "name": "lnurl", ... }when Lightning is enabled
-
2026-03-10 -
Upgradeadded as aSubscriptionPayment.payment_typevariantGET /api/v1/subscriptions/{id}/payments— Payments created for VM upgrades now carrypayment_type: "Upgrade"- Previously only
PurchaseandRenewalwere possible
-
2026-03-10 -
processing_feefield added toSubscriptionPaymentuser API responseGET /api/v1/subscriptions/{id}/payments— Each payment now includesprocessing_fee: { currency, amount }
-
2026-03-10 -
VmRunningStatesenum simplified —"starting"and"deleting"removedGET /api/v1/vm,GET /api/v1/vm/{id}—status.statenow 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 torunning_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.expiresis now nullableGET /api/v1/vm,GET /api/v1/vm/{id}— Theexpiresfield is nowstring | null(was always a string). It will benullfor newly created VMs that have not yet been paid.
-
2026-03-10 -
GET /api/v1/vm/{id}/paymentsnow uses database-level pagination- The endpoint now accepts
?limit=N&offset=Nquery parameters and returns a paginated response (data,total,limit,offset). Previously the list was unbounded.
- The endpoint now accepts
-
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.
- Internal fix: the query that finds a VM's linked subscription was incorrectly using
-
2026-03-10 -
ApiVmPayment::from_subscription_paymentnow propagates JSON parse errors- Previously, a malformed
metadataJSON field in asubscription_paymentrow would be silently ignored, potentially returning incorrect upgrade parameter data. Errors are now surfaced to the API caller.
- Previously, a malformed
-
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_enabledis false for the subscription.
- Workers now always send the expiry notification email/NIP-17 DM even when NWC is configured but
- 2026-03-10 - Clarification:
POST /api/admin/v1/vms/{id}/renewdoes 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.
- 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
-
2026-03-03 - VM upgrade no longer leaves subscription renewal cost stale
POST /api/v1/vm/{id}/upgrade— After payment confirmation,SubscriptionLineItem.amountis now updated to the new base-currency cost of the upgraded template for both standard→custom and custom→custom upgrade pathsGET /api/v1/subscriptions/{id}and admin equivalents —line_items[].pricenow 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
- VM subscription backfill — Subscriptions created for deleted VMs are now inserted with
-
2026-03-03 - Admin subscription list now returns results in descending order
GET /api/admin/v1/subscriptions— Results ordered byid DESC(newest first); applies to both the all-subscriptions list and the?user_id=Nfiltered list
-
2026-03-03 - Admin VM info response now includes subscription details
GET /api/admin/v1/vms/{id}— Response now includes asubscriptionobject with the fullAdminSubscriptionInfo(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_currencyGET /api/admin/v1/subscriptions/{id}/payments— Each payment now includescompany_base_currencyGET /api/admin/v1/subscription_payments/{id}— Response now includescompany_base_currencyPOST /api/admin/v1/subscription_payments/{id}/complete— Response now includescompany_base_currency
-
2026-03-03 - VM payments now use the unified
subscription_paymenttable- All VM renewal, purchase, and upgrade payments are now stored in
subscription_paymentinstead ofvm_payment GET /api/v1/vm/{id}/payments— Response format unchanged; now backed bysubscription_payment; supports pagination via?limit=N&offset=Nquery paramsGET /api/v1/vm/{id}/payments/{payment_id}— Now looks up bysubscription_payment.idGET /api/v1/vm/{id}/payments/{payment_id}/invoice— Now backed bysubscription_paymentPOST /api/v1/vm/{id}/renew— Returns payment fromsubscription_paymentPOST /api/v1/vm/{id}/upgrade— Returns payment fromsubscription_payment; upgrade parameters stored inmetadataJSON fieldGET /api/admin/v1/vms/{id}/payments— Now backed bysubscription_payment; uses real DB-level paginationGET /api/admin/v1/vms/{id}/payments/{payment_id}— Now looks up bysubscription_payment.idPOST /api/admin/v1/vms/{id}/payments/{payment_id}/complete— Now completes asubscription_paymentGET /api/admin/v1/reports/time-series— Revenue data now sourced fromsubscription_paymentGET /api/admin/v1/reports/referral-usage/time-series— Referral data now sourced fromsubscription_payment- Automatic data migration: existing VMs and
vm_paymentrows 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-levelNOT NULLonvm.subscription_line_item_idand the drop of legacyvm.expires/created/auto_renewal_enabledare deferred to finalization, run manually after production verification)
- All VM renewal, purchase, and upgrade payments are now stored in
-
2026-03-03 - Every VM is now linked to a
subscriptionandsubscription_line_itemvmtable has a newsubscription_line_item_idcolumn (NOT NULL) linking it to the subscriptions system- New VMs provisioned via
POST /api/v1/vmorPOST /api/v1/vm/customautomatically 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 -
IntervalTypeenum renamed fromVmCostPlanIntervalType- Affects admin responses that include cost plan or subscription interval information
- 2026-03-03 - Multi-interval VM renewal support
POST /api/v1/vm/{id}/renew— Accepts optionalintervalsquery parameter to pre-pay multiple billing periods at oncePOST /api/admin/v1/vms/{id}/renew— Sameintervalssupport in admin renewal endpoint
- 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
-
2026-02-22 - Added
disabledfield to VM model and admin PATCH endpointvmtable now includesdisabledcolumn (default: false)AdminVmInforesponse now includesdisabledfield in all GET endpointsPATCH /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
ConfigureVmwork job is dispatched to reconfigure the VM on the host - On Proxmox hosts, disabled VMs have
link_down=1set on their network interface
-
2026-02-22 - Added
mtufield to host configurationvm_hosttable now includesmtucolumn (optional, SMALLINT UNSIGNED)AdminHostInforesponse now includesmtufield in all GET endpointsPOST /api/admin/v1/hosts— Added optionalmtufield for host creationPATCH /api/admin/v1/hosts/{id}— Added optionalmtufield for host update (usenullto clear)
-
2026-02-22 - Added additional fields to sales time-series report
GET /api/admin/v1/reports/time-series— Response now includesuser_id,host_id,host_name,region_id,region_namefields 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_currenciesto payment method configurationAdminPaymentMethodConfigInfo— Newsupported_currenciesfield (array of currency codes)CreatePaymentMethodConfigRequest— New optionalsupported_currenciesfieldUpdatePaymentMethodConfigRequest— New optionalsupported_currenciesfieldGET /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_featuresto all admin API response modelsAdminVmInfo— Now includes CPU specification fields from the VM's templateAdminVmTemplateInfo— Now includes CPU specification fieldsAdminCustomPricingInfo— Now includes CPU specification fieldsAdminHostInfo— CPU fields are now consistently documented as optional (omitted when unknown/empty)POST /api/admin/v1/hosts— Added optionalcpu_mfg,cpu_arch,cpu_featuresfields for host creationPATCH /api/admin/v1/hosts/{id}— Added optionalcpu_mfg,cpu_arch,cpu_featuresfields 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_attimestamp to payment responsesVmPayment— New optionalpaid_atfield (ISO 8601 datetime) indicating when the payment was completedSubscriptionPayment— New optionalpaid_atfield (ISO 8601 datetime) indicating when the payment was completedAdminVmPaymentInfo— New optionalpaid_atfield for admin payment viewsAdminSubscriptionPaymentInfo— New optionalpaid_atfield for admin payment views- Field is only present when
is_paidis 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 optionalprocessing_fee_rate,processing_fee_base, andprocessing_fee_currencyfieldsprocessing_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 optionalcpu_mfg,cpu_arch,cpu_featuresfieldsPATCH /api/admin/v1/vm_templates/{id}— Added optionalcpu_mfg,cpu_arch,cpu_featuresfieldsPOST /api/admin/v1/custom_pricing— Added optionalcpu_mfg,cpu_arch,cpu_featuresfieldsPATCH /api/admin/v1/custom_pricing/{id}— Added optionalcpu_mfg,cpu_arch,cpu_featuresfieldsAdminHostInforesponse now includescpu_mfg,cpu_arch,cpu_features(detected via lnvps-host-info)- When
cpu_mfg/cpu_archis "unknown" orcpu_featuresis empty, no filtering is applied (matches any host)
- New enums:
-
2026-02-20 - Added SSH credentials for host utilities to Admin Host API
POST /api/admin/v1/hosts— Added optionalssh_userandssh_keyfields for host creationPATCH /api/admin/v1/hosts/{id}— Added optionalssh_userandssh_keyfields for host updateAdminHostInforesponse now includesssh_user(string or null) andssh_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-infoutility for CPU/GPU detection
-
2026-02-20 - Added CPU feature requirements to custom VM requests (User API)
POST /api/v1/vm/custom—cpu_mfg,cpu_arch,cpu_featurefields now accept strings instead of enums- Valid
cpu_mfgvalues: "intel", "amd", "apple", "nvidia", "unknown" - Valid
cpu_archvalues: "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 optionsGET /api/v1/referral- Get referral state including per-currency earnings, payout history, and success/failed countsPATCH /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 /orGET /index.html- Renders API documentation with markdown viewerGET /docs/endpoints.md- Raw markdown content of API endpoints documentationGET /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 servesADMIN_API_ENDPOINTS.md
-
2026-02-17 - Added
taxandprocessing_feefields toAdminVmPaymentInforesponse- Affected endpoints:
GET /api/admin/v1/vms/{vm_id}/payments,GET /api/admin/v1/vms/{vm_id}/payments/{payment_id} - Both fields are
u64in smallest currency unit (cents for fiat, millisats for BTC)
- Affected endpoints:
-
2026-02-17 - Added
processing_feefield toAdminSubscriptionPaymentInforesponse- Affected endpoints:
GET /api/admin/v1/subscriptions/{id}/payments,GET /api/admin/v1/subscriptions/{id}/payments/{payment_id} - Field is
u64in smallest currency unit (cents for fiat, millisats for BTC)
- Affected endpoints:
-
2026-02-18 - BREAKING CHANGE:
ApiPrice.amountchanged fromf32tou64in smallest currency units- The
Pricetype returned by user-facing endpoints now usesu64integers instead of floats - Amounts are in smallest currency units: cents for fiat (EUR, USD, etc.), millisats for BTC
- Affected endpoints: all endpoints returning
Priceobjects, including:GET /api/v1/templates—VmCostPlan.amountGET /api/v1/vm/{id}/upgrade/quote—cost_difference,new_renewal_cost,discountGET /api/v1/subscriptions/GET /api/v1/subscriptions/{id}—SubscriptionLineItem.price,SubscriptionLineItem.setup_feeGET /api/v1/subscriptions/{id}/payments—SubscriptionPayment.amount,SubscriptionPayment.taxPOST /api/v1/vm/custom/price— returnedPrice
- Example:
"amount": 10.99(EUR float) becomes"amount": 1099(cents) - Example:
"amount": 0.00012345(BTC float) becomes"amount": 12345(millisats)
- The
-
2026-02-16 - BREAKING CHANGE: All money amounts now use
u64in smallest currency units (cents for fiat, millisats for BTC)- Requires database migration: Run
20260217100000_amount_to_cents.sqlwhich converts existing data - Cost plan
amountfield changed fromf32(human-readable) tou64(smallest units) - Custom pricing costs (
cpu_cost,memory_cost,ip4_cost,ip6_cost) changed fromf32tou64 - Custom pricing disk
costfield changed fromf32tou64 - VM template
cost_plan_amountfield changed fromf32tou64 - Payment method config
processing_fee_basefield changed fromf32tou64 - 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}/calculatePOST /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)
- Requires database migration: Run
-
2026-02-16 - Payment method config updates now support partial config updates
PATCH /api/admin/v1/payment_methods/{id}now acceptsPartialProviderConfiginstead of fullProviderConfig- Only fields included in the request are updated; missing fields retain their existing values
- The
typefield is still required to identify the provider type - Cannot change provider type during update (e.g., from
lndtorevolut)
- 2026-02-16 - Bitvora payment provider has been disabled
- Bitvora service has been shut down and is no longer available
- The
bitvoraprovider 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}
- 2026-02-16 - Sanitized sensitive fields in
AdminPaymentMethodConfigInforesponses- 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