Skip to main content
Glama
btcpay-client.ts76.4 kB
import axios, { AxiosInstance, AxiosRequestConfig } from 'axios'; import { BTCPayServerConfig, Store, StoreSchema, PaymentRequest, PaymentRequestSchema, User, UserSchema, ApiKey, ApiKeySchema, Webhook, WebhookSchema, WebhookDelivery, WebhookDeliverySchema, ServerInfo, ServerInfoSchema, StoreEmailSettings, StoreEmailSettingsSchema, SendEmailRequest, StoreUserDetails, StoreUserDetailsSchema, StorePayoutProcessor, StorePayoutProcessorSchema, OnChainPayoutProcessor, OnChainPayoutProcessorSchema, LightningPayoutProcessor, LightningPayoutProcessorSchema, StoreWalletOverview, StoreWalletOverviewSchema, StoreWalletFeeRate, StoreWalletFeeRateSchema, StoreWalletAddress, StoreWalletAddressSchema, StoreWalletTransaction, StoreWalletTransactionSchema, StoreWalletUTXO, StoreWalletUTXOSchema, App, AppSchema, FileInfo, FileInfoSchema, SalesStatistics, SalesStatisticsSchema, TopItemStatistics, TopItemStatisticsSchema, Payout, PayoutSchema, Invoice, InvoiceSchema, PullPayment, PullPaymentSchema, BoltcardLink, BoltcardLinkSchema, LNURLDetails, LNURLDetailsSchema, PaymentMethod, PaymentMethodSchema, InvoicePaymentMethod, InvoicePaymentMethodSchema, RefundTriggerData, RefundTriggerDataSchema, LightningInfo, LightningInfoSchema, LightningInvoice, LightningInvoiceSchema, StoreUser, StoreUserSchema, PosApp, PosAppSchema, ServerPolicies, ServerPoliciesSchema, StoreRate, StoreRateSchema, RateConfiguration, RateConfigurationSchema, LightningBalance, LightningBalanceSchema, LightningChannel, LightningChannelSchema, LightningPayment, LightningPaymentSchema, LightningHistogram, LightningHistogramSchema, LightningAddress, LightningAddressSchema, LightningConnectRequest, LightningChannelRequest, LightningPayInvoiceRequest, LightningCreateInvoiceRequest, CrowdfundApp, CrowdfundAppSchema, Permission, PermissionSchema, ApiKeyCreation, ApiKeyCreationSchema, Notification, NotificationSchema, NotificationSetting, NotificationSettingSchema, UpdateNotificationRequest, UpdateNotificationSettingsRequest } from '../types.js'; export class BTCPayServerClient { private client: AxiosInstance; private config: BTCPayServerConfig; constructor(config: BTCPayServerConfig) { this.config = config; this.client = axios.create({ baseURL: `${config.baseUrl}/api/v1`, headers: { 'Authorization': `token ${config.apiKey}`, 'Content-Type': 'application/json' } }); } getConfig(): BTCPayServerConfig { return this.config; } private async makeRequest<T>(config: AxiosRequestConfig): Promise<T> { try { const response = await this.client.request(config); return response.data; } catch (error) { if (axios.isAxiosError(error)) { // Enhanced error reporting for debugging const errorDetails = error.response?.data || error.message; const status = error.response?.status; // Log error details without exposing sensitive headers console.error('BTCPayServer API Error Details:', JSON.stringify({ status, data: error.response?.data, url: config.url?.replace(/\/api-keys\/[^\/]+/, '/api-keys/***'), // Mask API keys in URL method: config.method }, null, 2)); throw new Error(`BTCPayServer API error: ${status} - ${typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails)}`); } throw error; } } // Server Info async getServerInfo(): Promise<ServerInfo> { const data = await this.makeRequest<any>({ method: 'GET', url: '/server/info' }); return ServerInfoSchema.parse(data); } // User Management async createUser( email: string, password?: string, name?: string, imageUrl?: string, isAdministrator: boolean = false, sendInvitationEmail: boolean = true ): Promise<User> { const requestData: any = { email, isAdministrator, sendInvitationEmail }; if (password !== undefined) requestData.password = password; if (name !== undefined) requestData.name = name; if (imageUrl !== undefined) requestData.imageUrl = imageUrl; const data = await this.makeRequest<any>({ method: 'POST', url: '/users', data: requestData }); return UserSchema.parse(data); } async getUser(userId?: string): Promise<User> { // BTCPayServer API only supports getting current user (/users/me) // Getting other users by ID is not supported in the public API if (userId) { throw new Error('BTCPayServer API does not support getting other users by ID. Only current user (/users/me) is supported.'); } const data = await this.makeRequest<any>({ method: 'GET', url: '/users/me' }); return UserSchema.parse(data); } async updateUser( email?: string, name?: string, imageUrl?: string, currentPassword?: string, newPassword?: string ): Promise<User> { const requestData: any = {}; if (email !== undefined) requestData.email = email; if (name !== undefined) requestData.name = name; if (imageUrl !== undefined) requestData.imageUrl = imageUrl; if (currentPassword !== undefined) requestData.currentPassword = currentPassword; if (newPassword !== undefined) requestData.newPassword = newPassword; const data = await this.makeRequest<any>({ method: 'PUT', url: '/users/me', data: requestData }); return UserSchema.parse(data); } async deleteCurrentUser(): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: '/users/me' }); } async uploadProfilePicture(fileData: FormData): Promise<User> { const data = await this.makeRequest<any>({ method: 'POST', url: '/users/me/picture', data: fileData, headers: { 'Content-Type': 'multipart/form-data' } }); return UserSchema.parse(data); } async deleteProfilePicture(): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: '/users/me/picture' }); } async listAllUsers(): Promise<User[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: '/users' }); return data.map(item => UserSchema.parse(item)); } async getUserByIdOrEmail(idOrEmail: string): Promise<User> { const data = await this.makeRequest<any>({ method: 'GET', url: `/users/${idOrEmail}` }); return UserSchema.parse(data); } async deleteUserByIdOrEmail(idOrEmail: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/users/${idOrEmail}` }); } async lockUser(idOrEmail: string, locked: boolean): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/users/${idOrEmail}/lock`, data: { locked } }); } async approveUser(idOrEmail: string, approved: boolean): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/users/${idOrEmail}/approve`, data: { approved } }); } // Store Management async createStore(name: string, defaultCurrency: string = 'USD', website?: string): Promise<Store> { const storeData: any = { name, defaultCurrency, speedPolicy: 'MediumSpeed', invoiceExpiration: 900, monitoringExpiration: 3600, paymentTolerance: 0, anyoneCanCreateInvoice: false, requiresRefundEmail: false, lightningAmountInSatoshi: false, lightningPrivateRouteHints: false, onChainWithLnInvoiceFallback: false, lazyPaymentMethods: false, redirectAutomatically: false, showRecommendedFee: true, recommendedFeeBlockTarget: 1 }; // Only include website if provided if (website) { storeData.website = website; } const data = await this.makeRequest<any>({ method: 'POST', url: '/stores', data: storeData }); return StoreSchema.parse(data); } async getStore(storeId: string): Promise<Store> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}` }); return StoreSchema.parse(data); } // Payment Request Management async createPaymentRequest( storeId: string, amount?: string, currency: string = 'USD', title?: string, description?: string, expiryDate?: string, email?: string, allowCustomPaymentAmounts: boolean = false, referenceId?: string ): Promise<PaymentRequest> { const requestData: any = {}; if (allowCustomPaymentAmounts) { // For custom amounts, BTCPayServer still requires a default amount > 0 requestData.allowCustomPaymentAmounts = true; requestData.currency = currency; // Use provided amount as default, or fallback to "1.00" as minimum requestData.amount = (amount && parseFloat(amount) > 0) ? amount : "1.00"; } else { // For fixed amounts, include amount and currency requestData.currency = currency; if (amount !== undefined && amount !== null) { requestData.amount = amount; } } // Only include fields that have values if (title !== undefined && title !== null) requestData.title = title; if (description !== undefined && description !== null) requestData.description = description; if (expiryDate !== undefined && expiryDate !== null) { // Convert ISO date string to Unix timestamp (BTCPayServer expects integer) const expiryTimestamp = Math.floor(new Date(expiryDate).getTime() / 1000); if (!isNaN(expiryTimestamp)) { requestData.expiryDate = expiryTimestamp; } } if (email !== undefined && email !== null) requestData.email = email; if (referenceId !== undefined && referenceId !== null) requestData.referenceId = referenceId; // Debug: Log the request data (remove in production) // console.log('Payment Request Data:', JSON.stringify(requestData, null, 2)); const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/payment-requests`, data: requestData }); return PaymentRequestSchema.parse(data); } async getPaymentRequests(storeId: string): Promise<PaymentRequest[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payment-requests` }); return data.map(item => PaymentRequestSchema.parse(item)); } async getPaymentRequest(storeId: string, paymentRequestId: string): Promise<PaymentRequest> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-requests/${paymentRequestId}` }); return PaymentRequestSchema.parse(data); } async deletePaymentRequest(storeId: string, paymentRequestId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/payment-requests/${paymentRequestId}` }); } async updatePaymentRequest( storeId: string, paymentRequestId: string, amount?: string, currency?: string, title?: string, description?: string, expiryDate?: string, email?: string, allowCustomPaymentAmounts?: boolean, referenceId?: string, formId?: string, formResponse?: any ): Promise<PaymentRequest> { const requestData: any = {}; // Only include fields that have values if (amount !== undefined && amount !== null) requestData.amount = amount; if (currency !== undefined && currency !== null) requestData.currency = currency; if (title !== undefined && title !== null) requestData.title = title; if (description !== undefined && description !== null) requestData.description = description; if (expiryDate !== undefined && expiryDate !== null) { // Convert ISO date string to Unix timestamp (BTCPayServer expects integer) const expiryTimestamp = Math.floor(new Date(expiryDate).getTime() / 1000); if (!isNaN(expiryTimestamp)) { requestData.expiryDate = expiryTimestamp; } } if (email !== undefined && email !== null) requestData.email = email; if (allowCustomPaymentAmounts !== undefined && allowCustomPaymentAmounts !== null) requestData.allowCustomPaymentAmounts = allowCustomPaymentAmounts; if (referenceId !== undefined && referenceId !== null) requestData.referenceId = referenceId; if (formId !== undefined && formId !== null) requestData.formId = formId; if (formResponse !== undefined && formResponse !== null) requestData.formResponse = formResponse; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/payment-requests/${paymentRequestId}`, data: requestData }); return PaymentRequestSchema.parse(data); } async payPaymentRequest( storeId: string, paymentRequestId: string, amount?: string, allowPendingInvoiceReuse: boolean = false ): Promise<Invoice> { const requestData: any = { allowPendingInvoiceReuse }; if (amount !== undefined && amount !== null) requestData.amount = amount; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/payment-requests/${paymentRequestId}/pay`, data: requestData }); return InvoiceSchema.parse(data); } // API Key Management async getApiKey(): Promise<ApiKey> { const data = await this.makeRequest<any>({ method: 'GET', url: '/api-keys/current' }); return ApiKeySchema.parse(data); } async deleteApiKey(apiKey: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/api-keys/${apiKey}` }); } async revokeCurrentApiKey(): Promise<ApiKey> { const data = await this.makeRequest<any>({ method: 'DELETE', url: '/api-keys/current' }); return ApiKeySchema.parse(data); } async createApiKeyForUser( idOrEmail: string, permissions: string[], label?: string ): Promise<ApiKeyCreation> { const requestData: any = { permissions }; if (label !== undefined) requestData.label = label; const data = await this.makeRequest<any>({ method: 'POST', url: `/users/${idOrEmail}/api-keys`, data: requestData }); return ApiKeyCreationSchema.parse(data); } async deleteApiKeyForUser(idOrEmail: string, apiKey: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/users/${idOrEmail}/api-keys/${apiKey}` }); } // Webhook Management async registerWebhook( storeId: string, url: string, events?: string[], secret?: string, enabled: boolean = true, automaticRedelivery: boolean = true ): Promise<Webhook> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/webhooks`, data: { enabled, automaticRedelivery, url, secret, authorizedEvents: { everything: !events || events.length === 0, specificEvents: events || [] } } }); return WebhookSchema.parse(data); } async getStoreWebhook(storeId: string, webhookId: string): Promise<Webhook> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/webhooks/${webhookId}` }); return WebhookSchema.parse(data); } async listStoreWebhooks(storeId: string): Promise<Webhook[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/webhooks` }); return data.map(item => WebhookSchema.parse(item)); } async createWebhook(storeId: string, url: string, events: string[], secret?: string): Promise<Webhook> { const requestData: any = { url, events, ...(secret && { secret }) }; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/webhooks`, data: requestData }); return WebhookSchema.parse(data); } async deleteWebhook(storeId: string, webhookId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/webhooks/${webhookId}` }); } async updateWebhook( storeId: string, webhookId: string, enabled?: boolean, automaticRedelivery?: boolean, url?: string, authorizedEvents?: { everything?: boolean; specificEvents?: string[] }, secret?: string ): Promise<Webhook> { const requestData: any = {}; if (enabled !== undefined) requestData.enabled = enabled; if (automaticRedelivery !== undefined) requestData.automaticRedelivery = automaticRedelivery; if (url !== undefined) requestData.url = url; if (authorizedEvents !== undefined) requestData.authorizedEvents = authorizedEvents; if (secret !== undefined) requestData.secret = secret; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/webhooks/${webhookId}`, data: requestData }); return WebhookSchema.parse(data); } async getWebhookDeliveries( storeId: string, webhookId: string, count?: number ): Promise<WebhookDelivery[]> { const params = new URLSearchParams(); if (count) params.append('count', count.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/webhooks/${webhookId}/deliveries${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => WebhookDeliverySchema.parse(item)); } async getWebhookDelivery( storeId: string, webhookId: string, deliveryId: string ): Promise<WebhookDelivery> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/webhooks/${webhookId}/deliveries/${deliveryId}` }); return WebhookDeliverySchema.parse(data); } async getWebhookDeliveryRequest( storeId: string, webhookId: string, deliveryId: string ): Promise<any> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/webhooks/${webhookId}/deliveries/${deliveryId}/request` }); return data; } async redeliverWebhook( storeId: string, webhookId: string, deliveryId: string ): Promise<string> { const data = await this.makeRequest<string>({ method: 'POST', url: `/stores/${storeId}/webhooks/${webhookId}/deliveries/${deliveryId}/redeliver` }); return data; } // Apps Management async listAllApps(): Promise<App[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: '/apps' }); return data.map(item => AppSchema.parse(item)); } async listStoreApps(storeId: string): Promise<App[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/apps` }); return data.map(item => AppSchema.parse(item)); } async getApp(appId: string): Promise<App> { const data = await this.makeRequest<any>({ method: 'GET', url: `/apps/${appId}` }); return AppSchema.parse(data); } async deleteApp(appId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/apps/${appId}` }); } async uploadAppImage(appId: string, fileData: FormData): Promise<FileInfo> { const data = await this.makeRequest<any>({ method: 'POST', url: `/apps/${appId}/image`, data: fileData, headers: { 'Content-Type': 'multipart/form-data' } }); return FileInfoSchema.parse(data); } async deleteAppImage(appId: string, fileId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/apps/${appId}/image/${fileId}` }); } async getAppSalesStatistics(appId: string, numberOfDays: number = 7): Promise<SalesStatistics> { const params = new URLSearchParams(); if (numberOfDays) params.append('numberOfDays', numberOfDays.toString()); const data = await this.makeRequest<any>({ method: 'GET', url: `/apps/${appId}/sales${params.toString() ? '?' + params.toString() : ''}` }); return SalesStatisticsSchema.parse(data); } async getAppTopItems(appId: string, count: number = 5, offset: number = 0): Promise<TopItemStatistics[]> { const params = new URLSearchParams(); if (count) params.append('count', count.toString()); if (offset) params.append('offset', offset.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/apps/${appId}/top-items${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => TopItemStatisticsSchema.parse(item)); } // Payout Management async deleteStorePayout(storeId: string, payoutId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/payouts/${payoutId}` }); } // Invoice Management async createInvoice( storeId: string, amount?: string, currency: string = 'USD', orderId?: string, notificationEmail?: string, notificationURL?: string, redirectURL?: string, defaultPaymentMethod?: string, metadata?: Record<string, any> ): Promise<Invoice> { const requestData: any = { currency }; if (amount !== undefined && amount !== null) requestData.amount = amount; if (orderId !== undefined && orderId !== null) requestData.orderId = orderId; if (notificationEmail !== undefined && notificationEmail !== null) requestData.notificationEmail = notificationEmail; if (notificationURL !== undefined && notificationURL !== null) requestData.notificationURL = notificationURL; if (redirectURL !== undefined && redirectURL !== null) requestData.redirectURL = redirectURL; if (defaultPaymentMethod !== undefined && defaultPaymentMethod !== null) requestData.defaultPaymentMethod = defaultPaymentMethod; if (metadata !== undefined && metadata !== null) requestData.metadata = metadata; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/invoices`, data: requestData }); return InvoiceSchema.parse(data); } async getInvoice(storeId: string, invoiceId: string): Promise<Invoice> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/invoices/${invoiceId}` }); return InvoiceSchema.parse(data); } async listInvoices(storeId: string, orderId?: string, status?: string[]): Promise<Invoice[]> { const params = new URLSearchParams(); if (orderId) params.append('orderId', orderId); if (status) status.forEach(s => params.append('status', s)); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/invoices${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => InvoiceSchema.parse(item)); } async updateInvoice(storeId: string, invoiceId: string, metadata?: Record<string, any>): Promise<Invoice> { const requestData: any = {}; if (metadata !== undefined && metadata !== null) requestData.metadata = metadata; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/invoices/${invoiceId}`, data: requestData }); return InvoiceSchema.parse(data); } async archiveInvoice(storeId: string, invoiceId: string): Promise<Invoice> { const data = await this.makeRequest<any>({ method: 'DELETE', url: `/stores/${storeId}/invoices/${invoiceId}` }); return InvoiceSchema.parse(data); } async listInvoicesAdvanced( storeId: string, orderId?: string[], textSearch?: string, status?: string, endDate?: number, take?: number, skip?: number, startDate?: number ): Promise<Invoice[]> { const params = new URLSearchParams(); if (orderId) orderId.forEach(id => params.append('orderId', id)); if (textSearch) params.append('textSearch', textSearch); if (status) params.append('status', status); if (endDate) params.append('endDate', endDate.toString()); if (take) params.append('take', take.toString()); if (skip) params.append('skip', skip.toString()); if (startDate) params.append('startDate', startDate.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/invoices${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => InvoiceSchema.parse(item)); } async getInvoicePaymentMethods( storeId: string, invoiceId: string, includeSensitive: boolean = false, onlyAccountedPayments: boolean = true ): Promise<InvoicePaymentMethod[]> { const params = new URLSearchParams(); if (includeSensitive) params.append('includeSensitive', 'true'); if (!onlyAccountedPayments) params.append('onlyAccountedPayments', 'false'); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/invoices/${invoiceId}/payment-methods${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => InvoicePaymentMethodSchema.parse(item)); } async getInvoiceRefundTriggerData( storeId: string, invoiceId: string, paymentMethodId: string ): Promise<RefundTriggerData> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/invoices/${invoiceId}/refund/${paymentMethodId}` }); return RefundTriggerDataSchema.parse(data); } async markInvoiceStatus( storeId: string, invoiceId: string, status: 'Invalid' | 'Settled' ): Promise<Invoice> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/invoices/${invoiceId}/status`, data: { status } }); return InvoiceSchema.parse(data); } async unarchiveInvoice(storeId: string, invoiceId: string): Promise<Invoice> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/invoices/${invoiceId}/unarchive` }); return InvoiceSchema.parse(data); } async activatePaymentMethod( storeId: string, invoiceId: string, paymentMethodId: string ): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/stores/${storeId}/invoices/${invoiceId}/payment-methods/${paymentMethodId}/activate` }); } async refundInvoice( storeId: string, invoiceId: string, name?: string, description?: string, payoutMethodId?: string, refundVariant?: 'CurrentRate' | 'Custom' | 'Fiat' | 'OverpaidAmount' | 'RateThen', subtractPercentage?: string, customAmount?: string, customCurrency?: string ): Promise<PullPayment> { const requestData: any = {}; if (name !== undefined) requestData.name = name; if (description !== undefined) requestData.description = description; if (payoutMethodId !== undefined) requestData.payoutMethodId = payoutMethodId; if (refundVariant !== undefined) requestData.refundVariant = refundVariant; if (subtractPercentage !== undefined) requestData.subtractPercentage = subtractPercentage; if (customAmount !== undefined) requestData.customAmount = customAmount; if (customCurrency !== undefined) requestData.customCurrency = customCurrency; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/invoices/${invoiceId}/refund`, data: requestData }); return PullPaymentSchema.parse(data); } // Extended Store Management async updateStore(storeId: string, updates: Partial<Store>): Promise<Store> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}`, data: updates }); return StoreSchema.parse(data); } async deleteStore(storeId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}` }); } async listStores(): Promise<Store[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: '/stores' }); return data.map(item => StoreSchema.parse(item)); } // Payment Methods Management async getStorePaymentMethods(storeId: string, enabled?: boolean): Promise<PaymentMethod[]> { const params = enabled !== undefined ? `?enabled=${enabled}` : ''; const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payment-methods${params}` }); return data.map(item => PaymentMethodSchema.parse(item)); } // Pull Payments Management async listStorePullPayments(storeId: string, includeArchived: boolean = false): Promise<PullPayment[]> { const params = new URLSearchParams(); if (includeArchived) params.append('includeArchived', includeArchived.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/pull-payments${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => PullPaymentSchema.parse(item)); } async createPullPayment(storeId: string, pullPaymentData: { name?: string; description?: string; amount: string; currency: string; BOLT11Expiration?: number; autoApproveClaims?: boolean; startsAt?: number; expiresAt?: number; payoutMethods?: string[]; }): Promise<PullPayment> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/pull-payments`, data: pullPaymentData }); return PullPaymentSchema.parse(data); } async archivePullPayment(storeId: string, pullPaymentId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/pull-payments/${pullPaymentId}` }); } // Pull Payments Public API async linkBoltcard(pullPaymentId: string, boltcardData: { UID: string; onExisting?: 'KeepVersion' | 'UpdateVersion'; }): Promise<BoltcardLink> { const data = await this.makeRequest<any>({ method: 'POST', url: `/pull-payments/${pullPaymentId}/boltcards`, data: boltcardData }); return BoltcardLinkSchema.parse(data); } async getPullPayment(pullPaymentId: string): Promise<PullPayment> { const data = await this.makeRequest<any>({ method: 'GET', url: `/pull-payments/${pullPaymentId}` }); return PullPaymentSchema.parse(data); } async getPullPaymentPayouts(pullPaymentId: string, includeCancelled: boolean = false): Promise<Payout[]> { const params = new URLSearchParams(); if (includeCancelled) params.append('includeCancelled', includeCancelled.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/pull-payments/${pullPaymentId}/payouts${params.toString() ? '?' + params.toString() : ''}` }); return data.map(item => PayoutSchema.parse(item)); } async createPayout(pullPaymentId: string, payoutData: { destination: string; amount: string; payoutMethodId: string; }): Promise<Payout> { const data = await this.makeRequest<any>({ method: 'POST', url: `/pull-payments/${pullPaymentId}/payouts`, data: payoutData }); return PayoutSchema.parse(data); } async getPayout(pullPaymentId: string, payoutId: string): Promise<Payout> { const data = await this.makeRequest<any>({ method: 'GET', url: `/pull-payments/${pullPaymentId}/payouts/${payoutId}` }); return PayoutSchema.parse(data); } async getPullPaymentLNURL(pullPaymentId: string): Promise<LNURLDetails> { const data = await this.makeRequest<any>({ method: 'GET', url: `/pull-payments/${pullPaymentId}/lnurl` }); return LNURLDetailsSchema.parse(data); } // Lightning Network Management async getLightningInfo(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningInfo> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/info` }); return LightningInfoSchema.parse(data); } async createLightningInvoice( storeId: string, cryptoCode: string = 'BTC', amount: string, description?: string, expiry?: number ): Promise<LightningInvoice> { const requestData: any = { amount }; if (description !== undefined) requestData.description = description; if (expiry !== undefined) requestData.expiry = expiry; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/invoices`, data: requestData }); return LightningInvoiceSchema.parse(data); } async getLightningInvoice(storeId: string, cryptoCode: string = 'BTC', invoiceId: string): Promise<LightningInvoice> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/invoices/${invoiceId}` }); return LightningInvoiceSchema.parse(data); } // Advanced Lightning Network Management async getLightningBalance(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningBalance> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/balance` }); return LightningBalanceSchema.parse(data); } async connectToLightningNode( storeId: string, cryptoCode: string = 'BTC', nodeURI: string ): Promise<any> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/connect`, data: { nodeURI } }); return data; } async getLightningChannels(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningChannel[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/channels` }); return data.map(item => LightningChannelSchema.parse(item)); } async openLightningChannel( storeId: string, cryptoCode: string = 'BTC', nodeURI: string, channelAmount: string, feeRate?: number ): Promise<any> { const requestData: any = { nodeURI, channelAmount }; if (feeRate !== undefined) requestData.feeRate = feeRate; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/channels`, data: requestData }); return data; } async getLightningPayment( storeId: string, cryptoCode: string = 'BTC', paymentHash: string ): Promise<LightningPayment> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/payments/${paymentHash}` }); return LightningPaymentSchema.parse(data); } async payLightningInvoice( storeId: string, cryptoCode: string = 'BTC', bolt11: string, amount?: string ): Promise<LightningPayment> { const requestData: any = { BOLT11: bolt11 }; if (amount !== undefined) requestData.amount = amount; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/payments`, data: requestData }); return LightningPaymentSchema.parse(data); } async getLightningDeposits(storeId: string, cryptoCode: string = 'BTC'): Promise<string> { const data = await this.makeRequest<string>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/address` }); return data; } async getLightningHistogram(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningHistogram> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/histogram` }); return LightningHistogramSchema.parse(data); } async getLightningInvoices( storeId: string, cryptoCode: string = 'BTC', pendingOnly: boolean = false, offsetIndex: number = 0 ): Promise<LightningInvoice[]> { const params = new URLSearchParams(); if (pendingOnly) params.append('pendingOnly', 'true'); if (offsetIndex > 0) params.append('offsetIndex', offsetIndex.toString()); const queryString = params.toString(); const url = `/stores/${storeId}/lightning/${cryptoCode}/invoices${queryString ? '?' + queryString : ''}`; const data = await this.makeRequest<any[]>({ method: 'GET', url }); return data.map(item => LightningInvoiceSchema.parse(item)); } async getLightningPayments( storeId: string, cryptoCode: string = 'BTC', includePending: boolean = false, offsetIndex: number = 0 ): Promise<LightningPayment[]> { const params = new URLSearchParams(); if (includePending) params.append('includePending', 'true'); if (offsetIndex > 0) params.append('offsetIndex', offsetIndex.toString()); const queryString = params.toString(); const url = `/stores/${storeId}/lightning/${cryptoCode}/payments${queryString ? '?' + queryString : ''}`; const data = await this.makeRequest<any[]>({ method: 'GET', url }); return data.map(item => LightningPaymentSchema.parse(item)); } // Lightning Internal Node Management async getInternalLightningInfo(cryptoCode: string = 'BTC'): Promise<LightningInfo> { const data = await this.makeRequest<any>({ method: 'GET', url: `/server/lightning/${cryptoCode}/info` }); return LightningInfoSchema.parse(data); } async getInternalLightningBalance(cryptoCode: string = 'BTC'): Promise<LightningBalance> { const data = await this.makeRequest<any>({ method: 'GET', url: `/server/lightning/${cryptoCode}/balance` }); return LightningBalanceSchema.parse(data); } async getInternalLightningHistogram(cryptoCode: string = 'BTC'): Promise<LightningHistogram> { const data = await this.makeRequest<any>({ method: 'GET', url: `/server/lightning/${cryptoCode}/histogram` }); return LightningHistogramSchema.parse(data); } async connectToInternalLightningNode(cryptoCode: string = 'BTC', nodeURI: string): Promise<any> { const data = await this.makeRequest<any>({ method: 'POST', url: `/server/lightning/${cryptoCode}/connect`, data: { nodeURI } }); return data; } async getInternalLightningChannels(cryptoCode: string = 'BTC'): Promise<LightningChannel[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/server/lightning/${cryptoCode}/channels` }); return data.map(item => LightningChannelSchema.parse(item)); } async openInternalLightningChannel( cryptoCode: string = 'BTC', nodeURI: string, channelAmount: string, feeRate?: number ): Promise<any> { const requestData: any = { nodeURI, channelAmount }; if (feeRate !== undefined) requestData.feeRate = feeRate; const data = await this.makeRequest<any>({ method: 'POST', url: `/server/lightning/${cryptoCode}/channels`, data: requestData }); return data; } async getInternalLightningDeposit(cryptoCode: string = 'BTC'): Promise<string> { const data = await this.makeRequest<string>({ method: 'POST', url: `/server/lightning/${cryptoCode}/address` }); return data; } async getInternalLightningPayment(cryptoCode: string = 'BTC', paymentHash: string): Promise<LightningPayment> { const data = await this.makeRequest<any>({ method: 'GET', url: `/server/lightning/${cryptoCode}/payments/${paymentHash}` }); return LightningPaymentSchema.parse(data); } async getInternalLightningInvoice(cryptoCode: string = 'BTC', invoiceId: string): Promise<LightningInvoice> { const data = await this.makeRequest<any>({ method: 'GET', url: `/server/lightning/${cryptoCode}/invoices/${invoiceId}` }); return LightningInvoiceSchema.parse(data); } async payInternalLightningInvoice( cryptoCode: string = 'BTC', bolt11: string, amount?: string, maxFeePercent?: string, maxFeeFlat?: string, sendTimeout?: number ): Promise<LightningPayment> { const requestData: any = { BOLT11: bolt11 }; if (amount !== undefined) requestData.amount = amount; if (maxFeePercent !== undefined) requestData.maxFeePercent = maxFeePercent; if (maxFeeFlat !== undefined) requestData.maxFeeFlat = maxFeeFlat; if (sendTimeout !== undefined) requestData.sendTimeout = sendTimeout; const data = await this.makeRequest<any>({ method: 'POST', url: `/server/lightning/${cryptoCode}/invoices/pay`, data: requestData }); return LightningPaymentSchema.parse(data); } async getInternalLightningInvoices( cryptoCode: string = 'BTC', pendingOnly: boolean = false, offsetIndex: number = 0 ): Promise<LightningInvoice[]> { const params = new URLSearchParams(); if (pendingOnly) params.append('pendingOnly', 'true'); if (offsetIndex > 0) params.append('offsetIndex', offsetIndex.toString()); const queryString = params.toString(); const url = `/server/lightning/${cryptoCode}/invoices${queryString ? '?' + queryString : ''}`; const data = await this.makeRequest<any[]>({ method: 'GET', url }); return data.map(item => LightningInvoiceSchema.parse(item)); } async createInternalLightningInvoice( cryptoCode: string = 'BTC', amount: string, description?: string, descriptionHashOnly?: boolean, expiry?: number, privateRouteHints?: boolean ): Promise<LightningInvoice> { const requestData: any = { amount }; if (description !== undefined) requestData.description = description; if (descriptionHashOnly !== undefined) requestData.descriptionHashOnly = descriptionHashOnly; if (expiry !== undefined) requestData.expiry = expiry; if (privateRouteHints !== undefined) requestData.privateRouteHints = privateRouteHints; const data = await this.makeRequest<any>({ method: 'POST', url: `/server/lightning/${cryptoCode}/invoices`, data: requestData }); return LightningInvoiceSchema.parse(data); } async getInternalLightningPayments( cryptoCode: string = 'BTC', includePending: boolean = false, offsetIndex: number = 0 ): Promise<LightningPayment[]> { const params = new URLSearchParams(); if (includePending) params.append('includePending', 'true'); if (offsetIndex > 0) params.append('offsetIndex', offsetIndex.toString()); const queryString = params.toString(); const url = `/server/lightning/${cryptoCode}/payments${queryString ? '?' + queryString : ''}`; const data = await this.makeRequest<any[]>({ method: 'GET', url }); return data.map(item => LightningPaymentSchema.parse(item)); } // Lightning Address Management async getLightningAddresses(storeId: string): Promise<LightningAddress[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/lightning-addresses` }); return data.map(item => LightningAddressSchema.parse(item)); } async getLightningAddress(storeId: string, username: string): Promise<LightningAddress> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning-addresses/${username}` }); return LightningAddressSchema.parse(data); } async createOrUpdateLightningAddress( storeId: string, username: string, currencyCode?: string, min?: string, max?: string, invoiceMetadata?: Record<string, any> ): Promise<LightningAddress> { const requestData: any = { username }; if (currencyCode !== undefined) requestData.currencyCode = currencyCode; if (min !== undefined) requestData.min = min; if (max !== undefined) requestData.max = max; if (invoiceMetadata !== undefined) requestData.invoiceMetadata = invoiceMetadata; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning-addresses/${username}`, data: requestData }); return LightningAddressSchema.parse(data); } async deleteLightningAddress(storeId: string, username: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/lightning-addresses/${username}` }); } // Store Rates Management async getStoreRates(storeId: string, currencyPair?: string[]): Promise<StoreRate[]> { const params = new URLSearchParams(); if (currencyPair && currencyPair.length > 0) { currencyPair.forEach(pair => params.append('currencyPair', pair)); } const url = `/stores/${storeId}/rates${params.toString() ? `?${params.toString()}` : ''}`; const data = await this.makeRequest<any[]>({ method: 'GET', url }); return data.map(item => StoreRateSchema.parse(item)); } async previewStoreRates(storeId: string, currencyPair?: string[], dateTime?: string): Promise<StoreRate[]> { const params = new URLSearchParams(); if (currencyPair && currencyPair.length > 0) { currencyPair.forEach(pair => params.append('currencyPair', pair)); } if (dateTime) { params.append('dateTime', dateTime); } const url = `/stores/${storeId}/rates/preview${params.toString() ? `?${params.toString()}` : ''}`; const data = await this.makeRequest<any[]>({ method: 'GET', url }); return data.map(item => StoreRateSchema.parse(item)); } async getRateConfiguration(storeId: string): Promise<RateConfiguration> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/rates/configuration` }); return RateConfigurationSchema.parse(data); } async updateRateConfiguration(storeId: string, configuration: Partial<RateConfiguration>): Promise<RateConfiguration> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/rates/configuration`, data: configuration }); return RateConfigurationSchema.parse(data); } // Store Users Management async listStoreUsers(storeId: string): Promise<StoreUser[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/users` }); return data.map(item => StoreUserSchema.parse(item)); } // Point of Sale Apps async createPosApp(storeId: string, posAppData: { appName: string; title?: string; description?: string; defaultView?: 'Static' | 'Cart' | 'Light' | 'Print'; showItems?: boolean; showCustomAmount?: boolean; showDiscount?: boolean; showSearch?: boolean; showCategories?: boolean; enableTips?: boolean; currency?: string; fixedAmountPayButtonText?: string; customAmountPayButtonText?: string; tipText?: string; customTipPercentages?: number[]; notificationUrl?: string; redirectUrl?: string; redirectAutomatically?: boolean; htmlLang?: string; htmlMetaTags?: string; formId?: string; template?: string; archived?: boolean; }): Promise<PosApp> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/apps/pos`, data: posAppData }); return PosAppSchema.parse(data); } async getPosApp(appId: string): Promise<PosApp> { const data = await this.makeRequest<any>({ method: 'GET', url: `/apps/pos/${appId}` }); return PosAppSchema.parse(data); } async updatePosApp(appId: string, posAppData: { appName?: string; title?: string; description?: string; defaultView?: 'Static' | 'Cart' | 'Light' | 'Print'; showItems?: boolean; showCustomAmount?: boolean; showDiscount?: boolean; showSearch?: boolean; showCategories?: boolean; enableTips?: boolean; currency?: string; fixedAmountPayButtonText?: string; customAmountPayButtonText?: string; tipText?: string; customTipPercentages?: number[]; notificationUrl?: string; redirectUrl?: string; redirectAutomatically?: boolean; htmlLang?: string; htmlMetaTags?: string; formId?: string; template?: string; archived?: boolean; }): Promise<PosApp> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/apps/pos/${appId}`, data: posAppData }); return PosAppSchema.parse(data); } // Health and Monitoring async getServerPolicies(): Promise<ServerPolicies> { const data = await this.makeRequest<any>({ method: 'GET', url: '/server/policies' }); return ServerPoliciesSchema.parse(data); } // Crowdfund Apps async createCrowdfundApp(storeId: string, crowdfundData: { appName: string; title?: string; description?: string; enabled?: boolean; enforceTargetAmount?: boolean; startDate?: number; endDate?: number; targetCurrency?: string; targetAmount?: number; mainImageUrl?: string; notificationUrl?: string; tagline?: string; disqusEnabled?: boolean; disqusShortname?: string; soundsEnabled?: boolean; animationsEnabled?: boolean; resetEveryAmount?: number; resetEvery?: string; displayPerksValue?: boolean; sortPerksByPopularity?: boolean; sounds?: string[]; animationColors?: string[]; htmlLang?: string; htmlMetaTags?: string; formId?: string; perksTemplate?: string; archived?: boolean; }): Promise<CrowdfundApp> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/apps/crowdfund`, data: crowdfundData }); return CrowdfundAppSchema.parse(data); } async getCrowdfundApp(appId: string): Promise<CrowdfundApp> { const data = await this.makeRequest<any>({ method: 'GET', url: `/apps/crowdfund/${appId}` }); return CrowdfundAppSchema.parse(data); } async updateCrowdfundApp(appId: string, crowdfundData: { appName?: string; title?: string; description?: string; enabled?: boolean; enforceTargetAmount?: boolean; startDate?: number; endDate?: number; targetCurrency?: string; targetAmount?: number; mainImageUrl?: string; notificationUrl?: string; tagline?: string; disqusEnabled?: boolean; disqusShortname?: string; soundsEnabled?: boolean; animationsEnabled?: boolean; resetEveryAmount?: number; resetEvery?: string; displayPerksValue?: boolean; sortPerksByPopularity?: boolean; sounds?: string[]; animationColors?: string[]; htmlLang?: string; htmlMetaTags?: string; formId?: string; perksTemplate?: string; archived?: boolean; }): Promise<CrowdfundApp> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/apps/crowdfund/${appId}`, data: crowdfundData }); return CrowdfundAppSchema.parse(data); } // Advanced API Key Management async createApiKey(permissions: string[], label?: string, storeId?: string): Promise<ApiKeyCreation> { const requestData: any = { permissions }; if (label !== undefined) requestData.label = label; if (storeId !== undefined) requestData.storeId = storeId; const data = await this.makeRequest<any>({ method: 'POST', url: '/api-keys', data: requestData }); return ApiKeyCreationSchema.parse(data); } // Miscellaneous Endpoints async getPermissions(): Promise<Permission[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: '/permissions' }); return data.map(item => PermissionSchema.parse(item)); } // Legacy method - use deleteUserByIdOrEmail instead async deleteUser(userId: string): Promise<void> { return await this.deleteUserByIdOrEmail(userId); } // Store Email Settings async getStoreEmailSettings(storeId: string): Promise<StoreEmailSettings> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/email` }); return StoreEmailSettingsSchema.parse(data); } async updateStoreEmailSettings(storeId: string, settings: Partial<StoreEmailSettings>): Promise<StoreEmailSettings> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/email`, data: settings }); return StoreEmailSettingsSchema.parse(data); } async sendStoreEmail(storeId: string, emailData: SendEmailRequest): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/stores/${storeId}/email/send`, data: emailData }); } // Store Payment Methods (Individual) async getStorePaymentMethod(storeId: string, paymentMethodId: string, includeConfig?: boolean): Promise<PaymentMethod> { const params = new URLSearchParams(); if (includeConfig !== undefined) params.append('includeConfig', includeConfig.toString()); const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}?${params.toString()}` }); return PaymentMethodSchema.parse(data); } async updateStorePaymentMethod(storeId: string, paymentMethodId: string, updates: { enabled?: boolean; config?: any }): Promise<PaymentMethod> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/payment-methods/${paymentMethodId}`, data: updates }); return PaymentMethodSchema.parse(data); } async deleteStorePaymentMethod(storeId: string, paymentMethodId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/payment-methods/${paymentMethodId}` }); } // Store Users async getStoreUsers(storeId: string): Promise<StoreUserDetails[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/users` }); return data.map(item => StoreUserDetailsSchema.parse(item)); } async addStoreUser(storeId: string, userData: StoreUserDetails): Promise<StoreUserDetails> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/users`, data: userData }); return StoreUserDetailsSchema.parse(data); } async updateStoreUser(storeId: string, idOrEmail: string, userData: Partial<StoreUserDetails>): Promise<StoreUserDetails> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/users/${idOrEmail}`, data: userData }); return StoreUserDetailsSchema.parse(data); } async removeStoreUser(storeId: string, idOrEmail: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/users/${idOrEmail}` }); } // Store Payouts async createStorePayout(storeId: string, destination: string, amount: string, payoutMethodId: string, pullPaymentId?: string, approved?: boolean, metadata?: any): Promise<Payout> { const payoutData: any = { destination, amount, payoutMethodId }; if (pullPaymentId !== undefined) payoutData.pullPaymentId = pullPaymentId; if (approved !== undefined) payoutData.approved = approved; if (metadata !== undefined) payoutData.metadata = metadata; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/payouts`, data: payoutData }); return PayoutSchema.parse(data); } async getStorePayouts(storeId: string, includeCancelled?: boolean): Promise<Payout[]> { const params = new URLSearchParams(); if (includeCancelled !== undefined) params.append('includeCancelled', includeCancelled.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payouts?${params.toString()}` }); return data.map(item => PayoutSchema.parse(item)); } async getStorePayout(storeId: string, payoutId: string): Promise<Payout> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payouts/${payoutId}` }); return PayoutSchema.parse(data); } async approveStorePayout(storeId: string, payoutId: string, revision: number, rateRule?: string): Promise<Payout> { const approvalData: any = { revision }; if (rateRule !== undefined) approvalData.rateRule = rateRule; const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/payouts/${payoutId}`, data: approvalData }); return PayoutSchema.parse(data); } async cancelStorePayout(storeId: string, payoutId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/payouts/${payoutId}` }); } async markStorePayoutPaid(storeId: string, payoutId: string): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/stores/${storeId}/payouts/${payoutId}/mark-paid` }); } async markStorePayout(storeId: string, payoutId: string, state: string, paymentProof?: any): Promise<void> { const markData: any = { state }; if (paymentProof !== undefined) markData.paymentProof = paymentProof; await this.makeRequest<void>({ method: 'POST', url: `/stores/${storeId}/payouts/${payoutId}/mark`, data: markData }); } // Store Payout Processors async getStorePayoutProcessors(storeId: string): Promise<StorePayoutProcessor[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payout-processors` }); return data.map(item => StorePayoutProcessorSchema.parse(item)); } async removeStorePayoutProcessor(storeId: string, processor: string, paymentMethodId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/payout-processors/${processor}/${paymentMethodId}` }); } async getStoreOnChainPayoutProcessors(storeId: string, paymentMethodId: string): Promise<OnChainPayoutProcessor[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payout-processors/OnChainAutomatedPayoutSenderFactory/${paymentMethodId}` }); return data.map(item => OnChainPayoutProcessorSchema.parse(item)); } async updateStoreOnChainPayoutProcessors(storeId: string, paymentMethodId: string, feeTargetBlock?: number, intervalSeconds?: number, threshold?: string, processNewPayoutsInstantly?: boolean): Promise<OnChainPayoutProcessor> { const processorData: any = {}; if (feeTargetBlock !== undefined) processorData.feeTargetBlock = feeTargetBlock; if (intervalSeconds !== undefined) processorData.intervalSeconds = intervalSeconds; if (threshold !== undefined) processorData.threshold = threshold; if (processNewPayoutsInstantly !== undefined) processorData.processNewPayoutsInstantly = processNewPayoutsInstantly; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/payout-processors/OnChainAutomatedPayoutSenderFactory/${paymentMethodId}`, data: processorData }); return OnChainPayoutProcessorSchema.parse(data); } async getStoreLightningPayoutProcessors(storeId: string, payoutMethodId: string): Promise<LightningPayoutProcessor[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payout-processors/LightningAutomatedPayoutSenderFactory/${payoutMethodId}` }); return data.map(item => LightningPayoutProcessorSchema.parse(item)); } async updateStoreLightningPayoutProcessors(storeId: string, payoutMethodId: string, intervalSeconds: number, cancelPayoutAfterFailures?: number, processNewPayoutsInstantly?: boolean): Promise<LightningPayoutProcessor> { const processorData: any = { intervalSeconds }; if (cancelPayoutAfterFailures !== undefined) processorData.cancelPayoutAfterFailures = cancelPayoutAfterFailures; if (processNewPayoutsInstantly !== undefined) processorData.processNewPayoutsInstantly = processNewPayoutsInstantly; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/payout-processors/LightningAutomatedPayoutSenderFactory/${payoutMethodId}`, data: processorData }); return LightningPayoutProcessorSchema.parse(data); } async getStoreOnChainTransferProcessors(storeId: string): Promise<OnChainPayoutProcessor[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payout-processors/OnChainAutomatedTransferSenderFactory` }); return data.map(item => OnChainPayoutProcessorSchema.parse(item)); } async updateStoreOnChainTransferProcessors(storeId: string, feeTargetBlock?: number, intervalSeconds?: number, threshold?: string, processNewPayoutsInstantly?: boolean): Promise<OnChainPayoutProcessor> { const processorData: any = {}; if (feeTargetBlock !== undefined) processorData.feeTargetBlock = feeTargetBlock; if (intervalSeconds !== undefined) processorData.intervalSeconds = intervalSeconds; if (threshold !== undefined) processorData.threshold = threshold; if (processNewPayoutsInstantly !== undefined) processorData.processNewPayoutsInstantly = processNewPayoutsInstantly; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/payout-processors/OnChainAutomatedTransferSenderFactory`, data: processorData }); return OnChainPayoutProcessorSchema.parse(data); } async getStoreLightningTransferProcessors(storeId: string): Promise<LightningPayoutProcessor[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payout-processors/LightningAutomatedPayoutSenderFactory` }); return data.map(item => LightningPayoutProcessorSchema.parse(item)); } // Store Rates async getStoreRateConfiguration(storeId: string, rateSource: string): Promise<RateConfiguration> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/rates/configuration/${rateSource}` }); return RateConfigurationSchema.parse(data); } async updateStoreRateConfiguration(storeId: string, rateSource: string, spread?: string, preferredSource?: string, isCustomScript?: boolean, effectiveScript?: string): Promise<RateConfiguration> { const configData: any = {}; if (spread !== undefined) configData.spread = spread; if (preferredSource !== undefined) configData.preferredSource = preferredSource; if (isCustomScript !== undefined) configData.isCustomScript = isCustomScript; if (effectiveScript !== undefined) configData.effectiveScript = effectiveScript; const data = await this.makeRequest<any>({ method: 'PUT', url: `/stores/${storeId}/rates/configuration/${rateSource}`, data: configData }); return RateConfigurationSchema.parse(data); } async previewStoreRateConfiguration(storeId: string, currencyPair?: string[], spread?: string, preferredSource?: string, isCustomScript?: boolean, effectiveScript?: string): Promise<StoreRate[]> { const params = new URLSearchParams(); if (currencyPair) { currencyPair.forEach(pair => params.append('currencyPair', pair)); } const configData: any = {}; if (spread !== undefined) configData.spread = spread; if (preferredSource !== undefined) configData.preferredSource = preferredSource; if (isCustomScript !== undefined) configData.isCustomScript = isCustomScript; if (effectiveScript !== undefined) configData.effectiveScript = effectiveScript; const data = await this.makeRequest<any[]>({ method: 'POST', url: `/stores/${storeId}/rates/preview?${params.toString()}`, data: configData }); return data.map(item => StoreRateSchema.parse(item)); } // Store Logo Management async uploadStoreLogo(storeId: string, file: any): Promise<any> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/logo`, data: { file } }); return data; } async deleteStoreLogo(storeId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/logo` }); } async getStoreRoles(storeId: string): Promise<any> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/roles` }); return data; } // Store Wallet Methods async getStoreWalletOverview(storeId: string, paymentMethodId: string): Promise<StoreWalletOverview> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet` }); return StoreWalletOverviewSchema.parse(data); } async getStoreWalletHistogram(storeId: string, paymentMethodId: string): Promise<any> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/histogram` }); return data; } async getStoreWalletFeeRate(storeId: string, paymentMethodId: string, blockTarget?: number): Promise<StoreWalletFeeRate> { const params = new URLSearchParams(); if (blockTarget !== undefined) params.append('blockTarget', blockTarget.toString()); const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/feerate?${params.toString()}` }); return StoreWalletFeeRateSchema.parse(data); } async getStoreWalletAddress(storeId: string, paymentMethodId: string, forceGenerate?: boolean): Promise<StoreWalletAddress> { const params = new URLSearchParams(); if (forceGenerate !== undefined) params.append('forceGenerate', forceGenerate.toString()); const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/address?${params.toString()}` }); return StoreWalletAddressSchema.parse(data); } async unreserveStoreWalletAddress(storeId: string, paymentMethodId: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/address` }); } async getStoreWalletTransactions(storeId: string, paymentMethodId: string, labelFilter?: string, limit?: number, skip?: number, statusFilter?: string[]): Promise<StoreWalletTransaction[]> { const params = new URLSearchParams(); if (labelFilter !== undefined) params.append('labelFilter', labelFilter); if (limit !== undefined) params.append('limit', limit.toString()); if (skip !== undefined) params.append('skip', skip.toString()); if (statusFilter) { statusFilter.forEach(status => params.append('statusFilter', status)); } const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/transactions?${params.toString()}` }); return data.map(item => StoreWalletTransactionSchema.parse(item)); } async createStoreWalletTransaction(storeId: string, paymentMethodId: string, transactionData: any): Promise<StoreWalletTransaction> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/transactions`, data: transactionData }); return StoreWalletTransactionSchema.parse(data); } async getStoreWalletTransaction(storeId: string, paymentMethodId: string, transactionId: string): Promise<StoreWalletTransaction> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/transactions/${transactionId}` }); return StoreWalletTransactionSchema.parse(data); } async updateStoreWalletTransaction(storeId: string, paymentMethodId: string, transactionId: string, updateData: { comment?: string; labels?: string[] }, force?: boolean): Promise<StoreWalletTransaction> { const params = new URLSearchParams(); if (force !== undefined) params.append('force', force.toString()); const data = await this.makeRequest<any>({ method: 'PATCH', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/transactions/${transactionId}?${params.toString()}`, data: updateData }); return StoreWalletTransactionSchema.parse(data); } async getStoreWalletUTXOs(storeId: string, paymentMethodId: string): Promise<StoreWalletUTXO[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/utxos` }); return data.map(item => StoreWalletUTXOSchema.parse(item)); } async generateStoreWallet(storeId: string, paymentMethodId: string, walletData: any): Promise<any> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/payment-methods/${paymentMethodId}/wallet/generate`, data: walletData }); return data; } // Store Lightning Methods async getStoreLightningInfo(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningInfo> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/info` }); return LightningInfoSchema.parse(data); } async getStoreLightningBalance(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningBalance> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/balance` }); return LightningBalanceSchema.parse(data); } async getStoreLightningHistogram(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningHistogram> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/histogram` }); return LightningHistogramSchema.parse(data); } async connectToStoreLightningNode(storeId: string, cryptoCode: string, connectData: LightningConnectRequest): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/connect`, data: connectData }); } async getStoreLightningChannels(storeId: string, cryptoCode: string = 'BTC'): Promise<LightningChannel[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/channels` }); return data.map(item => LightningChannelSchema.parse(item)); } async openStoreLightningChannel(storeId: string, cryptoCode: string, channelData: LightningChannelRequest): Promise<void> { await this.makeRequest<void>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/channels`, data: channelData }); } async getStoreLightningDeposit(storeId: string, cryptoCode: string = 'BTC'): Promise<string> { const data = await this.makeRequest<string>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/address` }); return data; } async getStoreLightningPayment(storeId: string, cryptoCode: string, paymentHash: string): Promise<LightningPayment> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/payments/${paymentHash}` }); return LightningPaymentSchema.parse(data); } async getStoreLightningInvoice(storeId: string, cryptoCode: string, invoiceId: string): Promise<LightningInvoice> { const data = await this.makeRequest<any>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/invoices/${invoiceId}` }); return LightningInvoiceSchema.parse(data); } async payStoreLightningInvoice(storeId: string, cryptoCode: string, paymentData: LightningPayInvoiceRequest): Promise<LightningPayment> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/invoices/pay`, data: paymentData }); return LightningPaymentSchema.parse(data); } async getStoreLightningInvoices(storeId: string, cryptoCode: string = 'BTC', pendingOnly?: boolean, offsetIndex?: number): Promise<LightningInvoice[]> { const params = new URLSearchParams(); if (pendingOnly !== undefined) params.append('pendingOnly', pendingOnly.toString()); if (offsetIndex !== undefined) params.append('offsetIndex', offsetIndex.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/invoices?${params.toString()}` }); return data.map(item => LightningInvoiceSchema.parse(item)); } async createStoreLightningInvoice(storeId: string, cryptoCode: string, invoiceData: LightningCreateInvoiceRequest): Promise<LightningInvoice> { const data = await this.makeRequest<any>({ method: 'POST', url: `/stores/${storeId}/lightning/${cryptoCode}/invoices`, data: invoiceData }); return LightningInvoiceSchema.parse(data); } async getStoreLightningPayments(storeId: string, cryptoCode: string = 'BTC', includePending?: boolean, offsetIndex?: number): Promise<LightningPayment[]> { const params = new URLSearchParams(); if (includePending !== undefined) params.append('includePending', includePending.toString()); if (offsetIndex !== undefined) params.append('offsetIndex', offsetIndex.toString()); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/stores/${storeId}/lightning/${cryptoCode}/payments?${params.toString()}` }); return data.map(item => LightningPaymentSchema.parse(item)); } // ===== NOTIFICATIONS (CURRENT USER) ===== async getNotifications(storeIds?: string[], take?: number, skip?: number, seen?: string): Promise<Notification[]> { const params = new URLSearchParams(); if (storeIds && storeIds.length > 0) { storeIds.forEach(storeId => params.append('storeId', storeId)); } if (take !== undefined) params.append('take', take.toString()); if (skip !== undefined) params.append('skip', skip.toString()); if (seen !== undefined) params.append('seen', seen); const data = await this.makeRequest<any[]>({ method: 'GET', url: `/users/me/notifications?${params.toString()}` }); return data.map(item => NotificationSchema.parse(item)); } async getNotification(id: string): Promise<Notification> { const data = await this.makeRequest<any>({ method: 'GET', url: `/users/me/notifications/${id}` }); return NotificationSchema.parse(data); } async updateNotification(id: string, updates: UpdateNotificationRequest): Promise<Notification> { const data = await this.makeRequest<any>({ method: 'PUT', url: `/users/me/notifications/${id}`, data: updates }); return NotificationSchema.parse(data); } async deleteNotification(id: string): Promise<void> { await this.makeRequest<void>({ method: 'DELETE', url: `/users/me/notifications/${id}` }); } async getNotificationSettings(): Promise<NotificationSetting[]> { const data = await this.makeRequest<any[]>({ method: 'GET', url: `/users/me/notification-settings` }); return data.map(item => NotificationSettingSchema.parse(item)); } async updateNotificationSettings(settings: UpdateNotificationSettingsRequest): Promise<NotificationSetting[]> { const data = await this.makeRequest<any[]>({ method: 'PUT', url: `/users/me/notification-settings`, data: settings }); return data.map(item => NotificationSettingSchema.parse(item)); } }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Abhijay007/btcpayserver-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server