PayzCore Docs

Getting Started

Get started with PayzCore in 5 minutes. Create an account, set up your first project with an API key, and monitor USDT/USDC blockchain payments with webhook notifications.

Getting Started

This guide walks you through setting up PayzCore and creating your first blockchain monitoring request. You'll be up and running in under 5 minutes.

1. Create an Account

Sign up at app.payzcore.com/register.

  • Fill in your name, email, and password
  • Complete the Turnstile verification
  • Accept the Terms of Service
  • Check your email and click the verification link
  • You'll receive a welcome email once verified

Your account starts on the Free plan (2 projects, 2 wallets, 100 webhooks/day, 500 API calls/day).

2. Create a Project

Navigate to Projects and click Create Project.

  • Name: Display name (e.g., "My Store"). A URL-safe slug is auto-generated.
  • Webhook URL: Your server endpoint that will receive payment notifications (must be HTTPS in production).
  • Address Mode: How addresses are assigned. See Address Modes for details. Default: per_payment.

On success, your credentials are displayed once:

CredentialFormatPurpose
API Keypk_live_...Authenticate API requests via x-api-key header
API Secretsk_live_...For your records (not used in API calls)
Webhook Secretwhsec_...Verify webhook signatures (HMAC-SHA256)

Save these immediately. You cannot retrieve them later. If lost, you can regenerate them from the project settings (admin only).

3. Add a Wallet

Go to Wallets and add your xPub key. PayzCore derives watch-only addresses from it. Your private keys never leave your wallet.

Where to find your xPub:

  • Trust Wallet: Settings > Wallets > Info icon > Extended Public Key
  • Ledger Live: Account > Advanced Logs > xPub
  • Electrum: Wallet > Information > Master Public Key

Each wallet is linked to an address family:

  • EVM xPub: Used for BEP20, ERC20, Polygon, Arbitrum (derivation path: m/44'/60'/0'/0/index)
  • Tron xPub: Used for TRC20 (derivation path: m/44'/195'/0'/0/index)

HD derivation index 0 is reserved as a gas/fee address. Payment addresses start at index 1. See Sweeping Funds for details.

Verify Your Wallet Setup

This step is critical. Before accepting real payments, always verify your wallet configuration:

  1. Check address #0: When adding your xPub in the dashboard, click "Verify Key" to preview derived addresses. Compare address #0 with your wallet app's first receiving address — they must match exactly.
  2. Send a test payment: Create a monitoring request for a small amount ($1–5) and send the funds to the assigned address.
  3. Verify receipt: Confirm the test funds appear in your wallet app.
  4. Test sweeping: Send the test funds back out to confirm you have full control of the derived addresses with your private keys.

A wrong xPub key will generate addresses you don't control. Funds sent to incorrect addresses are permanently lost and cannot be recovered — not by you, and not by PayzCore. We care about your funds: please take 2 minutes to verify everything before going live.

4. Create a Monitoring Request

Use the API to create a payment monitoring request:

curl -X POST https://api.payzcore.com/api/v1/payments \
  -H "x-api-key: pk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": 50,
    "chain": "TRC20",
    "token": "USDT",
    "external_ref": "customer-123",
    "metadata": { "order": "ORD-456" }
  }'

Request Parameters

ParameterTypeRequiredDescription
amountnumberYesAmount in token units (e.g., 50 for $50 USDT). Must be positive.
chainstringYesTRC20, BEP20, ERC20, POLYGON, or ARBITRUM
tokenstringNoUSDT (default) or USDC
external_refstringYesYour identifier for the customer (1-255 chars)
external_order_idstringNoYour order ID for idempotency (max 255 chars)
expires_innumberNoExpiration in seconds (300-86400, default: 3600 = 1 hour)
addressstringNoPre-assign a specific address (dedicated mode only)
metadataobjectNoCustom data attached to the payment (max 4 KB)

Response

{
  "success": true,
  "payment": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "address": "TXyz...abc",
    "amount": "50.00",
    "chain": "TRC20",
    "token": "USDT",
    "status": "pending",
    "expires_at": "2026-02-20T13:00:00.000Z",
    "qr_code": "data:image/png;base64,iVBOR..."
  }
}
  • amount: May differ from request if pool+micro_amount mode adds a micro-offset
  • qr_code: Base64 PNG of the wallet address (not amount-encoded). Show this to your customer for easy scanning.
  • expires_at: After this time, the payment status changes to expired if unpaid.

Idempotency

If you provide external_order_id, creating a payment with the same (external_order_id, external_ref, chain, token) returns the existing payment instead of creating a duplicate. The response includes "existing": true.

Error Responses

{
  "error": "Description of the error"
}
StatusMeaning
400Invalid request (missing/invalid parameters)
401Invalid or missing API key
403Project inactive or plan limit exceeded
429Daily API call limit reached
500Internal server error

5. Check Payment Status

Poll the payment status (or wait for a webhook):

curl https://api.payzcore.com/api/v1/payments/PAYMENT_ID \
  -H "x-api-key: pk_live_YOUR_KEY"
{
  "success": true,
  "payment": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "status": "paid",
    "expected_amount": "50.00",
    "paid_amount": "50.00",
    "address": "TXyz...abc",
    "chain": "TRC20",
    "token": "USDT",
    "tx_hash": "abc123def...",
    "expires_at": "2026-02-20T13:00:00.000Z",
    "transactions": [
      {
        "tx_hash": "abc123def...",
        "amount": "50.00",
        "from": "TSender...xyz",
        "confirmed": true,
        "confirmations": 21
      }
    ]
  }
}

Payment Statuses

StatusDescription
pendingNo transfer detected yet
confirmingTransfer detected, waiting for confirmations
partialTransfer confirmed but amount is less than expected
paidTransfer confirmed and amount matches (within 1% tolerance)
overpaidTransfer confirmed and amount exceeds expected by more than 1%
expiredPayment window closed without full payment
cancelledPayment was manually cancelled

Overpaid threshold: A payment is marked overpaid when the received amount exceeds expectedAmount * 1.01. For example, $50 expected + $50.60 received = overpaid. This is to distinguish intentional overpayments from rounding.

6. Handle Webhooks

When a transfer is detected and confirmed, PayzCore sends a POST request to your webhook URL. See the Webhooks Guide for full details on events, headers, signature verification, and retry logic.

Quick verification example:

import { createHmac, timingSafeEqual } from 'crypto';

function verify(body: string, signature: string, secret: string): boolean {
  const expected = createHmac('sha256', secret).update(body).digest('hex');
  return timingSafeEqual(
    Buffer.from(signature.toLowerCase()),
    Buffer.from(expected)
  );
}

// signature = request.headers['x-payzcore-signature']

Next Steps

On this page