Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/paynow-gg/typescript-sdk/llms.txt

Use this file to discover all available pages before exploring further.

Overview

The Management API allows you to programmatically manage your PayNow store. All Management API operations require authentication with an API key.
Management API operations require a valid API key. Never expose your API key in client-side code.

Authentication

Include your API key in the Authorization header:
const client = createClient<paths>({
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY'
  }
});

Product Management

List Products

Retrieve all products in your store:
const products = await client.GET('/v1/stores/{storeId}/products', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

if (products.data) {
  console.log(`Found ${products.data.length} products`);
}
Do NOT use this endpoint for displaying products on your storefront. Use the Storefront API instead.

Create Product

1

Define Product

Create a new product with basic information:
const product = await client.POST('/v1/stores/{storeId}/products', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    name: 'Premium Package',
    slug: 'premium-package',
    description: 'Access to premium features',
    price: 1999, // $19.99 in cents
    image_url: 'https://example.com/image.png',
    enabled_at: new Date().toISOString()
  }
});
2

Configure Options

Set subscription and removal settings:
const product = await client.POST('/v1/stores/{storeId}/products', {
  params: { path: { storeId: 'YOUR_STORE_ID' } },
  body: {
    name: 'Monthly VIP',
    price: 999,
    allow_subscription: true,
    subscription_interval_value: 1,
    subscription_interval_scale: 'month',
    remove_after_enabled: true,
    remove_after_time_value: 30,
    remove_after_time_scale: 'day'
  }
});
Creating dynamic products during checkout without prior approval is prohibited per the User Agreement.

Update Product

Modify an existing product:
const updated = await client.PATCH('/v1/stores/{storeId}/products/{productId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      productId: 'PRODUCT_ID'
    }
  },
  body: {
    price: 2499, // Update price to $24.99
    description: 'Updated description'
  }
});

Delete Product

await client.DELETE('/v1/stores/{storeId}/products/{productId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      productId: 'PRODUCT_ID'
    }
  }
});

Order Management

List Orders

Retrieve all orders with optional filtering:
const orders = await client.GET('/v1/stores/{storeId}/orders', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

if (orders.data) {
  orders.data.forEach(order => {
    console.log('Order ID:', order.id);
    console.log('Total:', order.total_amount);
    console.log('Status:', order.status);
  });
}

Get Single Order

Retrieve detailed information about a specific order:
const order = await client.GET('/v1/stores/{storeId}/orders/{orderId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      orderId: 'ORDER_ID'
    }
  }
});

if (order.data) {
  console.log('Customer:', order.data.customer);
  console.log('Lines:', order.data.lines);
  console.log('Payment:', order.data.payment);
}

Refund Order

Issue a full or partial refund:
const refund = await client.POST('/v1/stores/{storeId}/orders/{orderId}/refund', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      orderId: 'ORDER_ID'
    }
  },
  body: {
    amount: 1999, // Refund amount in cents
    reason: 'Customer requested refund'
  }
});
Refunds cannot be undone. Ensure you have the correct order ID and amount.

Customer Management

List Customers

const customers = await client.GET('/v1/stores/{storeId}/customers', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

Get Customer

Retrieve a specific customer:
const customer = await client.GET('/v1/stores/{storeId}/customers/{customerId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      customerId: 'CUSTOMER_ID'
    }
  }
});

Lookup Customer

Find a customer by their platform ID:
const customer = await client.GET('/v1/stores/{storeId}/customers/lookup', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' },
    query: {
      platform: 'steam',
      platform_id: '76561198152492642'
    }
  }
});

Create Customer

const customer = await client.POST('/v1/stores/{storeId}/customers', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    steam_id: '76561198152492642',
    name: 'John Doe',
    metadata: {
      'source': 'api',
      'notes': 'VIP customer'
    }
  }
});

Update Customer

const updated = await client.PATCH('/v1/stores/{storeId}/customers/{customerId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      customerId: 'CUSTOMER_ID'
    }
  },
  body: {
    name: 'Updated Name',
    metadata: {
      'tier': 'gold'
    }
  }
});

Bulk Create Customers

Create up to 200 customers at once:
const result = await client.POST('/v1/stores/{storeId}/customers/bulk', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    customers: [
      { steam_id: '76561198152492642', name: 'Player 1' },
      { steam_id: '76561198152492643', name: 'Player 2' }
    ]
  }
});

Delivery Item Management

Get Customer Delivery Items

const items = await client.GET('/v1/stores/{storeId}/customers/{customerId}/delivery/items', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      customerId: 'CUSTOMER_ID'
    }
  }
});

Assign Delivery Item

Manually assign a product to a customer:
const item = await client.POST('/v1/stores/{storeId}/customers/{customerId}/delivery/items', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      customerId: 'CUSTOMER_ID'
    }
  },
  body: {
    product_id: 'PRODUCT_ID',
    quantity: 1,
    execute_on_gameserver_id: 'GAMESERVER_ID' // Optional
  }
});

Revoke Delivery Item

await client.DELETE('/v1/stores/{storeId}/customers/{customerId}/delivery/items/{deliveryItemId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      customerId: 'CUSTOMER_ID',
      deliveryItemId: 'ITEM_ID'
    }
  },
  body: {
    reason: 'Violation of terms'
  }
});

Bulk Assign Delivery Items

const result = await client.POST('/v1/stores/{storeId}/delivery/items', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    assignments: [
      {
        customer_id: 'CUSTOMER_1',
        product_id: 'PRODUCT_ID',
        quantity: 1
      },
      {
        customer_id: 'CUSTOMER_2',
        product_id: 'PRODUCT_ID',
        quantity: 2
      }
    ]
  }
});

Subscription Management

List Subscriptions

const subscriptions = await client.GET('/v1/stores/{storeId}/subscriptions', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

Get Subscription

const subscription = await client.GET('/v1/stores/{storeId}/subscriptions/{subscriptionId}', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      subscriptionId: 'SUBSCRIPTION_ID'
    }
  }
});

Cancel Subscription

await client.POST('/v1/stores/{storeId}/subscriptions/{subscriptionId}/cancel', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      subscriptionId: 'SUBSCRIPTION_ID'
    }
  }
});

Coupons & Gift Cards

Create Coupon

const coupon = await client.POST('/v1/stores/{storeId}/coupons', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    code: 'SUMMER2024',
    discount_type: 'percent',
    discount_amount: 2000, // 20% in basis points
    max_uses: 100,
    expires_at: '2024-08-31T23:59:59Z'
  }
});

List Coupons

const coupons = await client.GET('/v1/stores/{storeId}/coupons', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

Create Gift Card

const giftcard = await client.POST('/v1/stores/{storeId}/giftcards', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    starting_balance: 5000, // $50.00 in cents
    expires_at: '2025-12-31T23:59:59Z'
  }
});

if (giftcard.data) {
  console.log('Gift Card Code:', giftcard.data.code);
}

Sales Management

Create Sale

const sale = await client.POST('/v1/stores/{storeId}/sales', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    name: 'Holiday Sale',
    discount_type: 'percent',
    discount_amount: 2500, // 25% in basis points
    begins_at: '2024-12-01T00:00:00Z',
    ends_at: '2024-12-31T23:59:59Z',
    product_ids: ['PRODUCT_1', 'PRODUCT_2']
  }
});

Game Server Management

Create Game Server

const server = await client.POST('/v1/stores/{storeId}/gameservers', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    name: 'US East Server',
    enabled: true
  }
});

if (server.data) {
  console.log('Server Token:', server.data.token);
}

List Game Servers

const servers = await client.GET('/v1/stores/{storeId}/gameservers', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

Custom Variables

Create Custom Variable

const variable = await client.POST('/v1/stores/{storeId}/custom-variables', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    identifier: 'player_name',
    name: 'Player Name',
    description: 'Enter your in-game name',
    type: 'text',
    value_regex: '^[a-zA-Z0-9_]{3,16}$'
  }
});

Create Dropdown Variable

const variable = await client.POST('/v1/stores/{storeId}/custom-variables', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    identifier: 'server_choice',
    name: 'Server Selection',
    description: 'Choose your preferred server',
    type: 'dropdown',
    options: [
      { name: 'US East', value: 'us-east', price: 0, is_default: true },
      { name: 'EU West', value: 'eu-west', price: 500 } // +$5.00
    ]
  }
});

Analytics & Reporting

Get Payments

const payments = await client.GET('/v1/stores/{storeId}/payments', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

if (payments.data) {
  const total = payments.data.reduce((sum, p) => sum + p.amount, 0);
  console.log('Total Revenue:', total);
}

Get Order Delivery Items

const items = await client.GET('/v1/stores/{storeId}/orders/{orderId}/delivery/items', {
  params: {
    path: {
      storeId: 'YOUR_STORE_ID',
      orderId: 'ORDER_ID'
    }
  }
});

Webhooks

List Webhook Subscriptions

const webhooks = await client.GET('/v1/stores/{storeId}/webhooks', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  }
});

Create Webhook Subscription

const webhook = await client.POST('/v1/stores/{storeId}/webhooks', {
  params: {
    path: { storeId: 'YOUR_STORE_ID' }
  },
  body: {
    url: 'https://yourserver.com/webhooks',
    events: ['ON_ORDER_COMPLETED', 'ON_SUBSCRIPTION_RENEWED']
  }
});

Learn More About Webhooks

See the webhooks guide for detailed event handling

Best Practices

  1. Rate Limiting: Implement exponential backoff for retries
  2. Error Handling: Always check response status and handle errors gracefully
  3. Pagination: Use pagination parameters for large datasets
  4. Idempotency: Store order/transaction IDs to prevent duplicates
  5. Testing: Use test mode for development and testing
  6. Security: Never expose API keys in client-side code
  7. Logging: Log all API interactions for debugging and auditing

Common Patterns

Complete Order Processing

async function processOrder(orderId: string) {
  // 1. Get order details
  const order = await client.GET('/v1/stores/{storeId}/orders/{orderId}', {
    params: { path: { storeId: 'STORE_ID', orderId } }
  });

  if (!order.data) return;

  // 2. Get delivery items
  const items = await client.GET('/v1/stores/{storeId}/orders/{orderId}/delivery/items', {
    params: { path: { storeId: 'STORE_ID', orderId } }
  });

  // 3. Process each item
  items.data?.forEach(item => {
    console.log('Deliver:', item.product.name, 'to', order.data.customer.name);
  });
}

Next Steps

Storefront Operations

Build customer-facing shopping experiences

Webhooks

Receive real-time event notifications