Skip to content

Data Models

Reference for data structures returned by the API.

Plan

typescript
interface Plan {
  id: string
  wallet: string
  name: string
  description?: string
  amount_sats: number
  interval: 'weekly' | 'monthly' | 'yearly'
  trial_days: number
  grace_period_days: number
  // Payment method flags
  allow_lightning: boolean
  allow_onchain: boolean
  allow_nwc: boolean         // NWC automatic payments
  allow_stripe: boolean      // Cards, Apple Pay, Google Pay
  allow_paypal: boolean      // PayPal payments
  // Optional configuration
  watchonly_wallet_id?: string
  stripe_account_id?: string
  paypal_merchant_id?: string
  created_at: number
  updated_at: number
  is_deleted: boolean
}

Subscription

typescript
interface Subscription {
  id: string
  plan_id: string
  subscriber_id: string
  status: SubscriptionStatus
  current_period_start: number
  current_period_end: number
  trial_end?: number
  cancelled_at?: number
  created_at: number
  updated_at: number
}

type SubscriptionStatus =
  | 'pending'
  | 'active'
  | 'paused'
  | 'past_due'
  | 'payment_failed'
  | 'cancelled'
  | 'expired'

Subscriber

typescript
interface Subscriber {
  id: string
  email?: string
  telegram?: string
  nostr?: string
  name?: string
  access_token: string
  created_at: number
}

Payment

typescript
interface Payment {
  id: string
  subscription_id: string
  amount_sats: number
  amount_fiat?: number        // For Stripe/PayPal payments
  currency?: string           // 'usd', 'eur', etc.
  status: PaymentStatus
  payment_method: PaymentMethod
  // Bitcoin-specific
  payment_request?: string    // Lightning invoice
  payment_hash?: string       // Lightning payment hash
  onchain_address?: string    // On-chain address
  onchain_txid?: string       // On-chain transaction ID
  // Fiat-specific
  stripe_payment_id?: string  // Stripe payment intent ID
  paypal_order_id?: string    // PayPal order ID
  created_at: number
  paid_at?: number
}

type PaymentMethod =
  | 'lightning'    // Lightning Network
  | 'onchain'      // On-chain Bitcoin
  | 'nwc'          // NWC automatic payment
  | 'stripe'       // Stripe (cards, Apple Pay, Google Pay)
  | 'paypal'       // PayPal

type PaymentStatus = 'pending' | 'paid' | 'failed' | 'expired'

NWC Models

Models for Nostr Wallet Connect integration.

NWC Validate Request

typescript
interface NWCValidateRequest {
  nwc_string: string  // The full NWC connection string
}

NWC Validate Response

typescript
interface NWCValidateResponse {
  valid: boolean
  error?: string  // Human-readable error if invalid
}

NWC Subscription Create

typescript
interface NWCSubscriptionCreate {
  plan_id: string
  email?: string
  name?: string
  nwc_connection_string: string
  contact_preference?: 'email' | 'telegram' | 'nostr'
}

NWC Subscription Response

typescript
interface NWCSubscriptionResponse {
  subscription_id: string
  status: 'active' | 'pending'
  message: string
  error_code?: string  // Only if payment failed
}

NWC Connection

Internal model for stored NWC connections:

typescript
interface NWCConnection {
  id: string
  subscriber_id: string
  wallet_pubkey: string      // First 8 chars shown to user
  relay_url: string
  max_amount_sats?: number
  is_active: boolean
  last_used_at?: number
  last_error?: string
  consecutive_failures: number
  created_at: number
  updated_at?: number
}

Webhook Event

typescript
interface WebhookEvent {
  event: string
  timestamp: number
  data: {
    subscription_id: string
    plan_id: string
    plan_name: string
    subscriber_email?: string
    subscriber_name?: string
    status: string
    amount_sats?: number
    [key: string]: any
  }
}

Timestamps

All timestamps are Unix timestamps (seconds since epoch).

javascript
// Convert to Date
const date = new Date(timestamp * 1000)

// Current timestamp
const now = Math.floor(Date.now() / 1000)