Outside accounts
what to set up, and how to test meanwhile.
Some features need a step on another company's website: a Stripe webhook secret, Hyperliquid wallet approvals, a Telegram bot token. This page lists exactly what to do for each, and how to test while you wait. The paper league needs none of them.
The commands on this page are written for the shell of macOS and Linux (bash or zsh).
On Windows, run them in WSL (Windows Subsystem for Linux, Ubuntu) or Git Bash: commands such as cp, openssl, $(…) and multi-line commands ending in \ do not work as written in PowerShell or cmd. The npm and node commands work in any of them.
01Which feature needs what
Most of PIT runs with no outside account at all. The table lists, for each feature, the step it needs on another company's website and whether you can try the feature before you take that step. Every account below is yours, opened in your name; the item price includes none of them (Costs).
| Feature | Outside step | Can you test without it? |
|---|---|---|
| Paper league, picks, Radio, prediction league | Only an AI provider API key | Yes. Hyperliquid and Polymarket data are public. |
| Card payments | Stripe secret key and webhook signing secret | Yes, in Stripe test mode with the Stripe CLI |
| USDC payments | An RPC URL for the chain | Yes, Test connection checks the chain id |
| Telegram alerts | A bot token from @BotFather | Yes, Test connection and a test alert |
| Real-money season | Hyperliquid accounts, an agent approval, optionally a builder-fee approval | Yes: dry run, on testnet |
| Ride | A proxy that sends the country header (Ride) | Partly: GET /api/ride/eligibility |
No outside step needs an email to a provider or a manual approval by someone else. Everything below is self-service in your own accounts.
02AI provider keys
Who pays: you, to the AI provider, on your own account and key, for every model decision. No key is included; the daily budget in the console caps the estimated spend.
- Create a keyIn your provider's developer console, create an API key and, if offered, set a monthly spending limit. Each provider's own guide: Anthropic → Getting started (console → Settings → API keys → Create key), OpenAI → Developer quickstart, Google → Gemini API keys (Google AI Studio → Get API key), xAI → Overview, DeepSeek → Your first API call. Menu labels as of October 2026.
- Paste itConsole → Integrations → the provider → Set. Or put it in
.env(ANTHROPIC_API_KEY,OPENAI_API_KEY,GOOGLE_API_KEY,XAI_API_KEY,DEEPSEEK_API_KEY); then it wins and the console field is locked. - TestPress Test connection. It lists the provider's models: "Key works: N models available." Any other answer is the provider's own error (read it).
03Stripe (card payments)
Who pays: you, to Stripe, on your own Stripe account: Stripe deducts its processing fee from each payment. Members pay you; the money never passes through the author.
The webhook signature check and the price check (access only when the signed payment covers the plan price) are covered by automated tests; Troubleshooting lists the answers the webhook endpoint gives. Run one checkout in Stripe test mode with your own test keys before you switch to live keys.
- Secret keyIn the Stripe Dashboard, in test mode, copy the secret key (
sk_test_…; a restrictedrk_key also works). Console → Integrations → Stripe secret key → Test connection. Expected: "Connected to Stripe in test mode." Where to click (labels as of October 2026): Stripe Dashboard → switch on Test mode (top right) → Developers → API keys → Secret key → Reveal test key. Stripe's guide: Stripe docs → API keys. - Webhook endpointConsole → Plans & members shows the full address,
https://<your-domain>/api/money/webhook/stripe. In the Stripe Dashboard add a webhook endpoint with that address. Where to click (labels as of October 2026): Stripe Dashboard → Developers → Webhooks → Add endpoint (or Add destination) → paste the address → select the events below → save. Stripe's guide: Stripe docs → Webhooks. - EventsSelect the events PIT acts on (from
server/money/stripe.ts):checkout.session.completed,invoice.paid,customer.subscription.deletedandcharge.refunded. PIT also acceptscheckout.session.async_payment_succeededandinvoice.payment_succeeded. Other events are answered and ignored. - Signing secretCopy the endpoint's signing secret (
whsec_…) into console → Integrations → Stripe webhook signing secret. Its Test connection only checks the format; Stripe proves it on the next delivery. Where to click (labels as of October 2026): Developers → Webhooks → your endpoint → Signing secret → Reveal. Stripe's guide: Stripe docs → Webhooks → Endpoint secrets. - Turn it onConsole → Membership & payments → Accept card payments (Stripe). Status shows a blocker until both keys are set.
Test it on your computer meanwhile
Stripe cannot reach localhost, so use Stripe's own command-line tool (Stripe CLI; install it as described in Stripe docs → Stripe CLI; test card numbers: Stripe docs → Testing) in test mode:
stripe login
stripe listen --forward-to localhost:8787/api/money/webhook/stripe # prints a whsec_… signing secret
Put the secret that stripe listen prints into .env as STRIPE_WEBHOOK_SECRET (or into Integrations) and restart. It is not the same as the Dashboard endpoint's secret. In a second terminal:
stripe trigger checkout.session.completed
The server log shows [http] POST /api/money/webhook/stripe 200. A triggered sample event carries no PIT plan, so PIT answers that it received and ignored it; a 400 means the signature check failed (which reason). For a full test, sign in on the arena as a visitor, choose a plan and pay with one of Stripe's test cards.
04USDC payments
Who pays: the member pays the network fee of the transfer. The RPC provider is yours, on your own account; its free tier is usually enough for payment checks, and above it you pay the provider.
- RPC URLFrom any RPC provider, for the chain in Membership & payments (default 8453, Base). Console → Integrations → USDC chain RPC URL → Test connection. Expected: "RPC reachable, chain 8453." A different chain id is refused.
- Receiver and tokenYour own
0xreceiver address and the USDC contract on that chain (Base USDC is the default). Payments go straight to your address.
05Telegram bot (member alerts)
Who pays: nobody: the bot is free. It is created under your own account in Telegram.
- Create the botIn Telegram, open
@BotFather, send/newbot, choose a display name and a username ending inbot. BotFather replies with a token like123456789:AA…. The chat app's own bot tutorial covers this step in detail. - Paste the tokenConsole → Integrations → Telegram bot token → Test connection. Expected: "Token works for @<your bot>."
- Name and switchConsole → Membership & payments: bot username without
@, then Telegram alert bot on. If the username does not match the token, the test says so. - Try it as a memberA member presses Link Telegram, opens the bot and presses Start. The bot answers "Linked. PIT alerts for your membership will arrive here."
Use this bot for PIT only. The server reads the bot's messages with the Bot API's getUpdates (server/money/alerts.ts), which the Bot API refuses while the bot has a webhook set elsewhere. Problems are logged as [alerts] telegram getUpdates: ….
06Hyperliquid (real-money season only)
Who pays: the paper league reads Hyperliquid's public data for free. In the optional real-money season you fund your own Hyperliquid accounts and pay Hyperliquid's trading fees and funding there, and any trading losses are yours. Ride viewers pay their own fees, plus a builder fee only if you switch one on.
The paper league reads Hyperliquid's public API: no account, no key, no approval. Everything below is only for the optional real-money season and the builder fee. It happens in your wallet and in PIT's runner tab, never on the server.
- AccountsOne master wallet and one funded sub-account per competitor, created on Hyperliquid. Keep some USDC on the master as well (why). Where to click (labels as of October 2026): connect the master wallet at app.hyperliquid.xyz/subAccounts → Create Sub-Account → name it → transfer USDC to it. Hyperliquid's guide: Hyperliquid docs → Sub-accounts. For testnet, get test funds as described in Hyperliquid docs → Testnet faucet.
- Agent approvalIn the runner tab (
#/runner), choose 1, 7, 30 or 90 days and press Authorise agent. Your wallet signs oneapproveAgent. The agent can trade and cancel, cannot withdraw, and expires; when it does, authorise again. The wallet shows a typed-data signature request for Hyperliquid; what it approves is described in Hyperliquid docs → Exchange endpoint → Approve an API wallet. - Builder fee approval OptionalOnly if you turned the builder fee on. The builder address must hold at least 100 USDC of perps account value (Hyperliquid docs → Builder codes). Approve the fee from the master in the runner's Setup; each Ride viewer approves it once from their own wallet.
- Test meanwhileSet
season.networktotestnet, leave Dry run on and press Start all: models are asked and the risk gate runs, but no order is sent (Dry run).
Real-money trading is off by default. Models can lose the funds you give them, and leveraged positions can be liquidated. Use testnet first and only funds you can afford to lose. This is not investment advice.