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.