Developers
End-to-end example
Pseudocode walkthrough for a bot opening a 3x long, monitoring, and closing the position.
Pseudocode for a bot opening a 3x long on YES of btc-2026, then closing it:
const base = "https://amplifi.18.api.t1protocol.com";
const user = "0xUser…";
// 1. Provision Deposit Wallet
const { walletAddress } = await fetch(`${base}/polymarket/wallet`, {
method: "POST",
body: JSON.stringify({ userAddress: user }),
}).then((r) => r.json());
// 2. Sign + submit a deposit (assuming USDC.e on Polygon)
const { nonce, domain, types } = await fetch(
`${base}/polymarket/nonce/${user}`,
).then((r) => r.json());
const { usdcPermitDomain, usdcAddress } = await fetch(
`${base}/polymarket/deposit-config`,
).then((r) => r.json());
const deadline = Math.floor(Date.now() / 1000) + 600;
const amount = "100000000"; // $100
const permitSig = await wallet.signTypedData({
domain: usdcPermitDomain,
types: {
Permit: [
/* EIP-2612 */
],
},
primaryType: "Permit",
message: {
owner: user,
spender: walletAddress,
value: amount,
nonce: await usdc.nonces(user),
deadline,
},
});
const depositSig = await wallet.signTypedData({
domain,
types,
primaryType: "DepositIntent",
message: { userAddress: user, amount, nonce, deadline },
});
await fetch(`${base}/polymarket/deposit`, {
method: "POST",
body: JSON.stringify({
userAddress: user,
amount,
nonce,
deadline,
signature: depositSig,
permit: {
spender: walletAddress,
value: amount,
deadline,
...split(permitSig),
},
}),
});
// 3. Pick a market
const markets = await fetch(`${base}/polymarket/markets?category=crypto`).then(
(r) => r.json(),
);
const m = markets.find((x) => x.slug === "will-btc-hit-150k-2026");
// 4. Sign + open
const openInfo = await fetch(
`${base}/polymarket/positions/nonce/open/${user}`,
).then((r) => r.json());
const openSig = await wallet.signTypedData({
domain: openInfo.domain,
types: openInfo.types,
primaryType: "OpenPositionIntent",
message: {
userAddress: user.toLowerCase(),
tokenId: padHex(toHex(BigInt(m.tokenId)), { size: 32 }),
outcome: "YES",
usdcAmount: parseUnits("50", 6),
leverage: 3,
nonce: BigInt(openInfo.nonce),
deadline: BigInt(deadline),
},
});
const { positionId } = await fetch(`${base}/polymarket/positions/open`, {
method: "POST",
body: JSON.stringify({
userAddress: user,
tokenId: m.tokenId,
conditionId: m.conditionId,
outcome: "YES",
usdcAmount: "50",
leverage: "3",
nonce: openInfo.nonce,
deadline,
signature: openSig,
}),
}).then((r) => r.json());
// 5. Wait for OPEN
let s;
do {
await sleep(1000);
s = await fetch(`${base}/polymarket/positions/${positionId}/status`).then(
(r) => r.json(),
);
} while (s.status === "PENDING" || s.status === "OPENING");
if (s.status !== "OPEN") throw new Error(`open failed: ${s.status}`);
// … hold position, monitor s.pnlUsd / s.distanceToLiquidation …
// 6. Close
const closeInfo = await fetch(
`${base}/polymarket/positions/nonce/close/${user}`,
).then((r) => r.json());
const closeSig = await wallet.signTypedData({
domain: closeInfo.domain,
types: closeInfo.types,
primaryType: "ClosePositionIntent",
message: {
userAddress: user.toLowerCase(),
positionId: BigInt(positionId),
nonce: BigInt(closeInfo.nonce),
deadline: BigInt(deadline),
},
});
await fetch(`${base}/polymarket/positions/${positionId}/close`, {
method: "POST",
body: JSON.stringify({
userAddress: user,
nonce: closeInfo.nonce,
deadline,
signature: closeSig,
}),
});
Skipping per-action signatures is the same flow with sessionToken substituted for nonce + deadline + signature after one initial POST /auth/trading-session.
