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.
| Scope | Use when |
|---|---|
| deposit_accounts:write | Creating deposit accounts |
| deposits:read | Checking deposit status |
| webhooks:write | Setting up webhook endpoints |
| usage:read | Viewing volume and fee reports |
3. Install the SDK
TypeScript
npm install @projectsilo/sdkPython
pip install projectsiloRust
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.
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 → settledconst { 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.
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");