Skip to content
Get an API key

Step zero — from nothing to your first trade

Section titled “Step zero — from nothing to your first trade”
  1. Create the account. Open opinion.trade, connect the BNB Smart Chain EOA you will trade from, and follow the current prompts; the repo sources do not document the identity-check sequence.
  2. Set up credentials. First create a wallet and secure its seed phrase; never share the private key, which Predictefy never sees. Get the user API key in your venue account’s API settings. The direct path sends it only to Opinion.
  3. Fund and approve. A practical first test is about $10–$25 of USDT on BNB Smart Chain (56), plus a little BNB for gas—not a venue minimum. Approve the exact market-derived exchange; do not hardcode the spender. If funds are on another chain, start with GET /v1/bridge/quote.
  4. Allow time. Budget 1–2 hours for a first wallet, bridge, and approval; less if already funded.

Opinion’s account and jurisdiction rules still apply, and the direct path uses your real connection.

  • Production status: Armed for build, submit, and cancel as verified on 2026-08-15, but the hosted submit relay remains blocked by Opinion’s policy for Predictefy’s Railway US egress.
  • Wallet and chain: A BSC (56) EOA signs. Signature type 2 additionally uses an Opinion Safe as maker while the EOA remains its controlling signer.
  • Venue account: For the working venue-direct SDK path, use an Opinion account with a user API key. Hosted build needs no caller venue credential.
  • Credentials: On client.accounts.opinion, the user API key stays in the caller’s process and goes only to Opinion. Hosted cancel/status accepts it transiently and never retains it.
  • Funding: Hold the market-authoritative BSC quote token in the maker EOA or Safe and approve the exact exchange. The funding registry’s current route is BSC USDT through LI.FI.

Opinion is server-built by default. Send asset, or outcome plus outcomeSide, together with isBuy, probability-dollar price, share size, and owner. Optional fields are signatureType, safeAddress, expiresAt, and taker. With no order object, the lane resolves the token through Predictefy’s catalog, fetches that exact Opinion market, then follows its quote token to the authoritative BSC exchange and collateral decimals. A missing or ambiguous mapping, or any catalog/API disagreement, fails closed before an execution is persisted.

Identity is explicit:

  • Signature type 0 is plain EOA: maker == signer == owner; safeAddress is rejected.
  • Signature type 2 requires safeAddress: maker == safeAddress is the funds-holding Safe, while signer == owner is its controlling EOA. They are deliberately not forced equal.

Opinion’s pinned 0.6.1 builder fixes LIMIT prices to six decimals and order fees to 0. A price must round inside 0.000001..0.999999. Omitted expiresAt becomes 0; a positive Unix timestamp is carried verbatim for GTD. The server generates a full-width 256-bit cryptographic salt. Opinion’s relay serializes that uint256 as a decimal string, so the Polymarket safe-integer salt limit does not apply. The response includes the venue-shaped unsigned order, buildVersion: 1, and canonical types, primaryType, domain, and message for wallet signing. The legacy echoed buildResult remains accepted unchanged.

Opinion rejects order submissions from the hosted relay’s infrastructure egress. The working route builds at Predictefy, signs in the caller’s wallet, and submits from the caller’s own eligible connection with their user API key:

const client = new Predictefy({
apiKey: process.env.PREDICTEFY_API_KEY,
execBaseUrl: PREDICTEFY_EXEC_BASE_URL,
venueCredentials: { opinion: { apiKey: process.env.OPINION_API_KEY! } },
});
const placed = await client.accounts.opinion.createOrder(
{
idempotencyKey: 'your-stable-build-key',
asset: '123456789',
isBuy: true,
price: 0.4,
size: 10,
owner: account.address,
signatureType: 0,
},
account,
);
const accountAuth = { apiKey: process.env.OPINION_API_KEY! };
const status = await client.accounts.opinion.fetchOrder(placed.orderId, accountAuth);
await client.accounts.opinion.cancelOrder(placed.orderId, accountAuth);

The build request has an explicit field allowlist. Unknown fields are rejected before any request, and their values are never included in errors. Before asking the wallet to sign, the SDK rebuilds the exact-key Opinion order and canonical EIP-712 types, pins chain 56, domain name OPINION CTF Exchange, version 1, and verifies the market-derived exchange against the execution lane’s known-exchange allowlist. It independently compares the digest and structHash, then binds the requested token, side, venue-rounded amounts, expiration, maker, signer, and signature type. The SDK also reads the market’s authoritative outcome-token mapping from the fixed venue origin and refuses to sign unless the signed token is the requested side’s token for that market — in asset mode the signed token must belong to the routed market. A failed or malformed venue read refuses before signing; the mapping is fetched once per market per client and reused. After signing, it recovers the EOA from the signature and requires it to match the requested owner.

Safe mode remains a plain EOA signature over the complete order: signature type 2 uses the Safe as maker and its controlling EOA as signer. It never uses EIP-1271.

The SDK sends the opinion-clob-sdk 0.6.1 wire body under the caller’s apikey header to the fixed https://openapi.opinion.trade/openapi origin. Create is POST /order, status is GET /order/{orderId}, and cancel is POST /order/cancel. Hosted build traffic and credentialed venue traffic use separate fetch seams. Venue calls refuse redirects, and failures expose typed, generic errors without upstream text or credentials. The route does not bypass Opinion’s account or jurisdiction rules.

This implementation is source-ready. One eligible submit → status → cancel pass remains pending.