Quickstart

Go from zero to a live deposit address in under 5 minutes. This guide walks you through creating an account, generating an API key, and receiving your first deposit.

1. Create an account

Sign up at projectsilo.app with your email. Verify the sign-in code, then create a new tenant (organization).

2. Generate an API key

Navigate to Settings → API Keys in the portal. Create a new key with the scopes you need. The full key is shown once — store it in your secrets manager.

ScopeUse when
deposit_accounts:writeCreating deposit accounts
deposits:readChecking deposit status
webhooks:writeSetting up webhook endpoints
usage:readViewing volume and fee reports

3. Install the SDK

TypeScript

bash
npm install @projectsilo/sdk

Python

bash
pip install projectsilo

Rust

toml
projectsilo = "0.1"

4. Create a deposit account

A deposit account represents one of your customers. You specify where settled funds should go (chain + address + token), and Project Silo generates deposit addresses on all supported chains.

create-account.tsts
import { createClient } from "@projectsilo/sdk";

const silo = createClient({ apiKey: process.env.PROJECT_SILO_API_KEY! });

const account = await silo.depositAccounts.create({
  externalUserId: "user_42",
  destination: {
    chainId: 137,       // Polygon
    address: "0x...",   // Your settlement wallet
    tokenAddress: "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", // USDC.e
  },
});

// Give these addresses to your customer
account.depositAddresses.forEach((addr) => {
  console.log(`Chain ${addr.chainId}: ${addr.address}`);
  console.log(`Accepts: ${addr.assets.join(", ")}`);
});

5. Monitor for deposits

Set up a webhook to get notified when funds arrive and settle. The deposit lifecycle is:

observed → confirming → confirmed → crediting → credited → settling → settled
webhook-setup.tsts
const { endpoint, secret } = await silo.webhooks.createEndpoint({
  name: "Production",
  url: "https://api.yourapp.com/silo/webhook",
  eventTypes: ["deposit.credited", "deposit.settled", "deposit.failed"],
});

// IMPORTANT: store secret securely — shown only once!
await storeSecret("SILO_WEBHOOK_SECRET", secret);

6. Verify webhook signatures

Always verify the x-project-silo-signature header (HMAC-SHA256 of "{timestamp}.{rawBody}") to confirm webhooks are from Project Silo. The timestamp arrives in x-project-silo-timestamp; deliveries more than 5 minutes old are rejected to block replays.

verify.tsts
import { verifyWebhookSignature } from "@projectsilo/sdk";

const isValid = await verifyWebhookSignature(
  request.body,                                    // raw body
  request.headers["x-project-silo-signature"],     // v1=<hex>
  request.headers["x-project-silo-timestamp"],     // unix seconds
  process.env.SILO_WEBHOOK_SECRET!,                // stored secret
);

if (!isValid) throw new Error("Invalid webhook signature");

Next steps