Build on OSWiki data and the orderbook
Collection, token and sales data plus the OSWiki orderbook. Query, fetch fulfillment data, and submit signed orders over the public API. Every endpoint works without a key; get an instant one with POST /v1/auth/keys or create a permanent one in your account for a rate limit of your own.
Data: collections, tokens and sales on Ethereum and ApeChain, every payload linking back to its oswiki.xyz page. Trading: list, buy, make and accept offers as Seaport 1.6 orders signed by your wallet.
Getting started
Your first request in under a minute.
- 1Get an instant key with
curl -X POST https://api.oswiki.xyz/v1/auth/keys. No account and no body; the key is shown once, so store it. - 2Make your first request with the key in the
X-API-Keyheader. Listings are public, so this works even without a key. - 3For a permanent key with a higher limit, sign in with your wallet and create one in Account → Developer.
An instant key allows 60 requests per minute and expires after 7 days; requests with it then answer 401, and you request a new one. Each IP can get 3 instant keys per 24 hours.
Collections, tokens, listings, offers and sales on Ethereum and ApeChain are available programmatically, and listings and offers are created as Seaport orders. Explore every endpoint with live try-it in the API reference.
# 1. Get an instant key - no account neededcurl -X POST "https://api.oswiki.xyz/v1/auth/keys"# {"success": true, "data": {"key": "oswk_...", "type": "instant",# "requestsPerMinute": 60, "expiresAt": "...", "docs": "https://oswiki.xyz/developers"}}# 2. Send it in the X-API-Key headercurl "https://api.oswiki.xyz/v1/listings?collection=otherdeed&sort=price_asc" \ -H "X-API-Key: oswk_..."Authentication & rate limits
One header. Wallet signatures do the rest.
Every endpoint works without a key at a lower shared limit. Listings and offers are authenticated by your wallet signature, and API orders always carry the standard OSWiki fee (plan discounts apply on oswiki.xyz only); sync only moves what the chain proves. Pass a key in the X-API-Key header for a quota of your own; an invalid, revoked or expired key answers 401.
Rate limits
- Without a key
- 30 requests per minute per IP, shared by every keyless call from that IP.
- Instant key
- 60 requests per minute, valid for 7 days. Get one with
POST /v1/auth/keys(3 per IP per 24 hours). - Permanent key
- 120 requests per minute per key by default.
- Headers
- Every response carries
X-RateLimit-LimitandX-RateLimit-Remaining; a 429 includesRetry-After(seconds).
Need a higher limit for your integration? Reach out on Discord.
curl "https://api.oswiki.xyz/v1/bids?collection=otherdeed" \ -H "X-API-Key: oswk_..."Data & discovery
Collections, tokens and sales, with links back to OSWiki.
Read-only market data for building profiles, galleries and feeds on top of OSWiki. Every collection is addressable by slug or contract address, and every payload carries a urls object with the matching oswiki.xyz page: link there instead of building URLs yourself. Pass chainId=33139 for ApeChain (the default is Ethereum); the same address can exist on both chains.
Endpoints
GET/v1/collections
Every indexed collection on a chain with a stats block for the chosen period (floor, volume, sales, listed, supply, holders). Grouped contracts such as Otherdeed and Otherdeed Expanded are one row with the combined stats of the profile endpoint.
GET/v1/collections/{collection}
Adds description, links, royalty, verified and every stats window.
GET/v1/collections/{collection}/tokens
Pages through a collection with cursor / meta.next_cursor (sort by token id, price, rarity or listing time; filter listed or pass token_ids). Each row has media, traits, rarity, owner, the cheapest current listing and the last sale. Otherdeed and Otherdeed Expanded tokens add fairValue (eth, usd, confidence): OSWiki's estimate from recent sales.
GET/v1/collections/{collection}/traits
Every trait value with its token count, listed count and floor (price, currency, usd; null when nothing is listed), cheapest first. type= returns one trait type. Otherdeed returns its curated types; Environment, Resource and Sediment values add a tiers breakdown with the same fields per tier.
GET/v1/collections/{collection}/floor-history
Floor OHLC candles (t, open, high, low, close) in ETH or APE from 5-minute snapshots, up to 30 days (days, interval 1h / 4h / 1d), plus a summary with changePct. Hours without a listed floor are left out.
GET/v1/sales
The newest-first sales feed, chain-wide or scoped to a collection / token. traits[Type]=value (up to 5, all must match) narrows it to one trait. Page through the full history with cursor / meta.next_cursor.
GET/v1/crypto/history
ApeCoin or Ethereum (type=apecoin|ethereum) in USD as OHLC candles over up to 365 days, with a summary.
GET/v1/ens/resolve
Resolves an ENS name live on Ethereum mainnet: address, apechainAddress (the ENSIP-11 ApeChain record) and reverseName, the primary name of address only when it resolves back to it. Names are lowercased and must be ASCII letters, digits and hyphens (unsupported_name otherwise); offchain (CCIP-read) names answer offchain_resolver. Cached 60 seconds.
GET/v1/listings?sort=created_at
Recently listed items.
/v1/sales, /v1/listings and /v1/bids report the exact meta.total and take page up to 10,000 rows deep (page x per_page); a deeper page answers 422 with code: use_cursor. To go further, pass meta.next_cursor back as cursor with the same sort and no page, until it is null. Cursors have no depth limit and do not skip or repeat rows when new ones arrive.
Data endpoints work without a key on the shared limit; use a key for a quota of your own and cache on your side for page-view traffic. Full field-level docs are in the API reference.
Operations
GET/v1/collections
GET/v1/collections/{collection}
GET/v1/collections/{collection}/tokens
GET/v1/collections/{collection}/traits
GET/v1/collections/{collection}/floor-history
GET/v1/sales
GET/v1/crypto/history
GET/v1/ens/resolve
GET/v1/listings
# Discover ApeChain collections ranked by 24h volumecurl "https://api.oswiki.xyz/v1/collections?chainId=33139&period=24h&per_page=25"# One collection by slug or address: profile, links, verification, live statscurl "https://api.oswiki.xyz/v1/collections/0xYourContract?chainId=33139"# Its tokens (cursor-paged; traits, rarity, media, current listing)curl "https://api.oswiki.xyz/v1/collections/{slug}/tokens?chainId=33139&sort=rarity"# One token, recent salescurl "https://api.oswiki.xyz/v1/collections/{slug}/tokens/42?chainId=33139"curl "https://api.oswiki.xyz/v1/sales?chainId=33139&collection={slug}"# Recent sales of one traitcurl -g "https://api.oswiki.xyz/v1/sales?collection=otherdeed&traits[Environment]=Chaos"# Older sales: follow meta.next_cursorcurl "https://api.oswiki.xyz/v1/sales?collection=otherdeed&per_page=100&cursor={meta.next_cursor}"# Trait floors, one trait type, and 30 days of floor candlescurl "https://api.oswiki.xyz/v1/collections/otherdeed/traits?type=Sediment"curl "https://api.oswiki.xyz/v1/collections/otherdeed/floor-history?days=30&interval=1d"# ApeCoin in USD, 4h candles over a weekcurl "https://api.oswiki.xyz/v1/crypto/history?type=apecoin&days=7&interval=4h"# ENS name to mainnet + ApeChain address, read live on-chaincurl "https://api.oswiki.xyz/v1/ens/resolve?name=vitalik.eth"Listings
Plain Seaport 1.6 orders through the OpenSea conduit.
An OSWiki listing is a signed Seaport 1.6 order with no zone. Approve OpenSea's conduit once per collection with setApprovalForAll(0x1E0049783F008A0085193E00003D00cD54003c71, true), the same approval OpenSea uses, then fetch the signing parameters, sign an OrderComponents with your wallet and post it. Listings pay out in the chain's native currency and must carry the OSWiki fee and the creator royalty exactly as the params endpoint returns them.
Endpoints
GET/v1/orders/params
Signing parameters: Seaport address and EIP-712 domain, conduit key, fee recipient and fee bps, your Seaport counter, royalty, bounds.
POST/v1/listings/requirements
Before signing, for up to 100 items: your fee, each item's royalty, blocked collections, and OpenSea's requirements for a twin listing (items[].opensea).
POST/v1/orders/asks
Submit one single-signed listing.
POST/v1/orders/asks/bulk
Up to 100 listings, bulk-tree signatures allowed. A row may carry opensea, the OpenSea twin signed in the same tree: OSWiki checks it and posts it to OpenSea. Answers per row in data.results; a rejected twin never blocks the OSWiki listing.
POST/v1/orders/asks/{askId}/cancel
Always answers 409 cancel_on_chain: cancel with Seaport instead.
Order format
- Order shape
- Zone and
zoneHashzero,conduitKeythe OpenSea key, exactly one offer item: an ERC-721 (amount 1,orderType0) or an ERC-1155 (amount Q,orderType1, fills partially). - Consideration
- Native currency only,
startAmountequal toendAmount, in this order: your proceeds to you, the fee (floor(unit x feeBps / 10000) x Q) to the fee recipient, then the royalty to its receiver. Every amount divides by Q. - Encoding
- uint256 values as decimal strings;
itemType,orderTypeandtotalOriginalConsiderationItemsas integers; lowercase hex addresses.counteris your current Seaport counter, the duration 1 hour to 365 days, the salt0x4f535749("OSWI") in the top 4 bytes plus 28 random bytes.orderHashis the struct hash Seaport events emit, not the EIP-712 digest. - Cancelling
- On-chain only: call Seaport
cancel(OrderComponents[])from the maker wallet and the listing drops once OSWiki indexes theOrderCancelledevent (POST /v1/orders/asks/{askId}/cancelanswers 409).incrementCountercancels every Seaport order of the wallet, OpenSea's included. See Your orders for the exact components.
Single or bulk signatures
POST /v1/orders/asks takes single-signed orders, /v1/orders/asks/bulk also takes bulk-tree signatures. Both answer 503 while listings are paused.
Operations
GET/v1/orders/params
POST/v1/listings/requirements
POST/v1/orders/asks
POST/v1/orders/asks/bulk
POST/v1/orders/asks/{askId}/cancel
# 1. Signing parameters: Seaport address and EIP-712 domain, conduit key,# fee recipient + your fee bps, your Seaport counter, royalty, boundscurl "https://api.oswiki.xyz/v1/orders/params?chainId=33139&maker=0xYou"# 2. Sign OrderComponents (domain "Seaport" / "1.6" / chainId /# 0x0000000000000068F116a894984e2DB1123eB395), then post it:curl -X POST "https://api.oswiki.xyz/v1/orders/asks" \ -H "Content-Type: application/json" \ -d '{"chainId": 33139, "seaport": {"parameters": { ... }, "signature": "0x...", "orderHash": "0x..."}}'# Many tokens under one bulk signature, optionally cross-listed on OpenSeacurl -X POST "https://api.oswiki.xyz/v1/orders/asks/bulk" \ -H "Content-Type: application/json" \ -d '{"chainId": 1, "listings": [{"seaport": { ... }, "opensea": { ... }}]}'Buying a listing
OSWiki and OpenSea listings can be bought through the API: GET /v1/listings?marketplace=all lists every marketplace and marks each row buyableViaApi. Buy-data is for exactly the listing you ask for, never a cheaper substitute: a listing that is gone answers 409 inactive. Send data to to (Seaport 1.6) with exactly value wei. data is fulfillAdvancedOrder(order, [], fulfillerConduitKey, recipient) built from orderData (parameters, signature, numerator / denominator, extraData) plus the 4-byte tag 0xda32920a; re-encode it from orderData and compare expectedItem, priceWei and expiresAt before you sign.
OpenSea listings need buyer, the wallet that sends the transaction: restricted OpenSea orders carry OpenSea's zone authorization in extraData, valid for that wallet for a short time, so fetch right before sending. Only fixed-price listings in ETH or APE are served; other marketplaces answer 422 unsupported_marketplace. Pass maxPrice (ETH / APE) or maxPriceWei to refuse a fill above your cap (409 price_above_max), and amount for ERC-1155 units.
Endpoints
GET/v1/listings?marketplace=all&sort=price_asc
Cheapest listings across marketplaces (all is the default); marketplace=oswiki or opensea narrows it.
POST/v1/listings/{askId}/buy-data
The calldata, the order to verify it against and the exact value to send. Errors carry a code.
POST/v1/listings/buy-data-bulk
Up to 20 listings: listings holds the buyable ones, errors the code for each other id.
GET/v1/listings/{askId}
Poll to see whether a listing is still active.
Operations
GET/v1/listings?marketplace=all
POST/v1/listings/{askId}/buy-data
POST/v1/listings/buy-data-bulk
GET/v1/listings/{askId}
curl -X POST "https://api.oswiki.xyz/v1/listings/{askId}/buy-data" \ -H "Content-Type: application/json" -H "X-API-Key: oswk_..." \ -d '{"chainId": 33139, "buyer": "0xYou", "maxPrice": "1.5"}'Offers
Seaport 1.6 offers in WETH or WAPE, accepted by the holder.
An OSWiki offer is a signed Seaport 1.6 order that offers WETH (Ethereum) or WAPE (ApeChain). The bidder approves the Seaport contract itself (conduitKey 0) for an exact amount covering their open offers, never unlimited. The OSWiki fee and the creator royalty come out of the offer: the seller receives the offer minus both, the bidder pays exactly the offer. An offer whose balance or allowance falls short is hidden and comes back automatically.
Endpoints
GET/v1/orders/params
With kind=collection or kind=item: signing parameters plus the offer's royalty and the approval it needs, under offers.
POST/v1/bids/requirements
Before signing, for up to 50 items (kind, contract, tokenId for items, amountWei, quantity): the fee and royalty legs, your balance and allowance, and the requiredAllowanceWei covering all of them plus your open offers.
POST/v1/orders/bids
Submit one single-signed item or collection offer.
POST/v1/orders/bids/bulk
Up to 50 offers, bulk-tree signatures allowed (e.g. N collection offers signed once). Answers per row in data.results.
POST/v1/orders/bids/{bidId}/sync
Revalidates the offer.
POST/v1/orders/bids/{bidId}/cancel
Always answers 409 cancel_on_chain: cancel with Seaport instead.
Order format
- Order shape
- Zone,
zoneHashandconduitKeyzero,orderType0, exactly one offer item: the wrapped native token{1, currency.address, 0, A, A}. The API reference types it asOfferOrderComponents. - Consideration
- In this order: the NFT to you (an item offer names the token as
itemType2 for ERC-721 or 3 for ERC-1155 with amount 1; a collection offer isitemType4 with criteria 0, ERC-721 only), the feefloor(A x feeBps / 10000)tofeeRecipientwhen above zero, then the royalty to its receiver when above zero, both asitemType1 in the offer currency. - Royalty
- Pass
kindto/v1/orders/paramsand readoffers.royalty: payroyaltyWeitoroyaltyRecipient, exactly as intake checks it. For a collection offer the server prices the royalty on the collection's reference token, so pass notokenIdand do not substitute one. WhenroyaltyWeiis 0 (no royalty, or a receiver that is you orfeeRecipient), leave the royalty leg out. - Approval
- Offers approve Seaport itself (
approvalTarget), not a conduit.openOffersWeiis the sum of your unexpired OSWiki offers on this chain, active or inactive, andrequiredAllowanceWeiis that plus A. Callapprove(approvalTarget, requiredAllowanceWei)oncurrency.address. Hold at least A of WETH / WAPE. - Cancelling
- On-chain only, with Seaport
cancel(OrderComponents[])from the bidder wallet (components from Your orders);POST /v1/orders/bids/{bidId}/syncrevalidates.
Approve the exact amount
ERC-20 approve replaces the allowance, it does not add to it, so never approve just A on top of open offers, and never approve an unlimited amount.
Paused intake
Intake answers 503 (offers_paused) while offers are paused; accepting and cancelling keep working.
Operations
GET/v1/orders/params
POST/v1/bids/requirements
POST/v1/orders/bids
POST/v1/orders/bids/bulk
POST/v1/orders/bids/{bidId}/sync
POST/v1/orders/bids/{bidId}/cancel
# 1. Signing parameters plus the offer's royalty and the approval it needs.# kind=collection takes no tokenId; kind=item needs one. unitPriceWei is# the offer amount A in wei.curl "https://api.oswiki.xyz/v1/orders/params?chainId=1&maker=0xYou&kind=collection&contract=0xColl&unitPriceWei=1000000000000000000"# 2. approve(offers.approvalTarget, offers.requiredAllowanceWei) on# offers.currency.address if allowanceWei is lower, sign# OrderComponents, then post it:curl -X POST "https://api.oswiki.xyz/v1/orders/bids" \ -H "Content-Type: application/json" \ -d '{"chainId": 1, "seaport": {"parameters": { ... }, "signature": "0x...", "orderHash": "0x..."}}'Accepting offers
The holder fills an offer on Seaport.
GET /v1/bids/best?collection=&tokenId= shows what a token can sell for right now: the highest active item offer (itemOffer), the highest collection offer that covers it (collectionOffer) and the better of the two (best), each ranked by sellerNetWei, what the seller receives after fee and royalty. GET /v1/bids?token_id= lists item offers only, highest first.
- 1Call
POST /v1/bids/{bidId}/accept-datawithfulfiller(andtokenId, required for a collection offer). - 2Approve the NFT once with
setApprovalForAll(approval.operator, true)onapproval.token(the OpenSea conduit, as for listings). - 3Send to
towithvalue0 fromfulfiller. Item offers:fulfillBasicOrder_efficient_6GL6yc(BasicOrderParameters)withbasicOrderParameters. Collection offers:matchAdvancedOrders(AdvancedOrder[],CriteriaResolver[],Fulfillment[],address)withorders,criteriaResolvers,fulfillmentsandrecipient. No calldata is returned: encode with the Seaport 1.6 ABI.
Operations
GET/v1/bids/best
POST/v1/bids/{bidId}/accept-data
curl "https://api.oswiki.xyz/v1/bids/best?chainId=1&collection=otherdeed&tokenId=42"Send from the fulfiller
The transaction must come from the fulfiller address you passed to accept-data, with value 0.
The mirror order expires after 30 minutes
For a collection offer, orders[1] is an unsigned mirror order whose offerer is the fulfiller, valid for 30 minutes, so fetch accept-data again right before sending.
End to end
With viem (me is your lowercased address, wallet a wallet client, api a JSON fetch helper that sends your key): make a collection offer, then accept it as the holder.
// Make an offer of A on any token of a collectionconst A = 1000000000000000000n;const { data: p } = await api('/v1/orders/params?chainId=1&maker=' + me + '&kind=collection&contract=' + coll + '&unitPriceWei=' + A);const o = p.offers;if (o.royalty.blocked) throw new Error(o.royalty.reason);const erc20 = (amount, recipient) => ({ itemType: 1, token: o.currency.address, identifierOrCriteria: '0', startAmount: amount, endAmount: amount, recipient });const fee = (A * BigInt(o.feeBps)) / 10000n;const consideration = [ { itemType: 4, token: coll, identifierOrCriteria: '0', startAmount: '1', endAmount: '1', recipient: me }, ...(fee > 0n ? [erc20(fee.toString(), o.feeRecipient)] : []), ...(o.royalty.royaltyWei !== '0' ? [erc20(o.royalty.royaltyWei, o.royalty.royaltyRecipient)] : []),];const now = Math.floor(Date.now() / 1000);const components = { offerer: me, zone: o.zone, orderType: o.orderType, zoneHash: o.zoneHash, conduitKey: o.conduitKey, offer: [{ itemType: 1, token: o.currency.address, identifierOrCriteria: '0', startAmount: A.toString(), endAmount: A.toString() }], consideration, startTime: String(now), endTime: String(now + 7 * 86400), salt: hexToBigInt(o.saltPrefix + toHex(randomBytes(28)).slice(2)).toString(), counter: o.counter,};const signature = await wallet.signTypedData({ domain: o.eip712Domain, types: o.types, primaryType: 'OrderComponents', message: components });if (BigInt(o.allowanceWei) < BigInt(o.requiredAllowanceWei)) { await wallet.writeContract({ address: o.currency.address, abi: erc20Abi, functionName: 'approve', args: [o.approvalTarget, BigInt(o.requiredAllowanceWei)] });}await api('/v1/orders/bids', { method: 'POST', body: { chainId: 1, seaport: { parameters: { ...components, totalOriginalConsiderationItems: consideration.length }, signature } } });// Accept it as the holder of token 42const { data: d } = await api('/v1/bids/' + bidId + '/accept-data', { method: 'POST', body: { chainId: 1, fulfiller: seller, tokenId: '42' } });// once per collection: setApprovalForAll(d.approval.operator, true) on d.approval.tokenconst args = d.method === 'matchAdvancedOrders' ? [d.orders, d.criteriaResolvers, d.fulfillments, d.recipient] : [d.basicOrderParameters];const tx = await sellerWallet.writeContract({ address: d.to, abi: seaportAbi, functionName: d.method, args, value: 0n });await api('/v1/orders/bids/' + bidId + '/sync', { method: 'POST', body: { chainId: 1, txHash: tx } });Your orders
Find a wallet's open orders and cancel them on Seaport.
maker filters listings and offers to one wallet. status is active by default; inactive returns orders that are hidden (token, approval, balance or allowance away) but still valid on-chain, so only a cancel retires them for good.
Endpoints
GET/v1/orders/asks/{askId}/components
{askId, chainId, orderHash, maker, status, parameters, opensea}: parameters are the signed OrderComponents (counter included) in the intake format; opensea holds the twin's {orderHash, status, parameters} when the listing was cross-listed, else null. Cancel both in one cancel([...]).
GET/v1/orders/bids/{bidId}/components
{bidId, chainId, orderHash, maker, status, parameters} for an offer.
POST/v1/orders/asks/{askId}/sync
With the cancel, buy or accept txHash: OSWiki reads it back from the chain. Same for /v1/orders/bids/{bidId}/sync.
Public data
Components are public once an order is listed; only the maker's wallet can cancel it on Seaport.
Operations
GET/v1/listings?maker=
GET/v1/bids?maker=
GET/v1/orders/asks/{askId}/components
GET/v1/orders/bids/{bidId}/components
POST/v1/orders/asks/{askId}/sync
# Live and hidden-but-valid listings of a walletcurl "https://api.oswiki.xyz/v1/listings?chainId=1&maker=0xYou"curl "https://api.oswiki.xyz/v1/listings?chainId=1&maker=0xYou&status=inactive"# The exact signed order (and its OpenSea twin) for Seaport cancel()curl "https://api.oswiki.xyz/v1/orders/asks/{askId}/components?chainId=1"# After the cancel transaction is minedcurl -X POST "https://api.oswiki.xyz/v1/orders/asks/{askId}/sync" \ -H "Content-Type: application/json" -d '{"chainId": 1, "txHash": "0x..."}'Errors
Machine-readable reasons your bot can act on.
Rejections return HTTP 4xx or 503 with { "success": false, "error": "..." }. Order, offer and pause rejections add a stable code: map the code, and treat error as the human text.
Listing codes
bad_structureThe payload or order does not match the Seaport format above.unsupported_chainchainId is not 1 (Ethereum) or 33139 (ApeChain).unknown_collectionOSWiki does not index this collection.blacklistedThis collection cannot be listed on OSWiki.conduit_blockedThe collection only trades through OpenSea's signed zone, so a zone-0 order can never fill.not_ownerThe maker does not own the token.insufficient_balanceThe maker holds fewer ERC-1155 units than the order offers.not_approvedThe OpenSea conduit is not approved for the collection. Send setApprovalForAll, then retry.counter_mismatchcounter is not the maker's current Seaport counter. Re-read it from /v1/orders/params.order_cancelledSeaport reports the order as cancelled.order_filledSeaport reports the order as fully filled.hash_mismatchorderHash does not match the struct hash the server computes.invalid_signatureThe signature does not verify for the maker (ECDSA, EIP-2098 or ERC-1271).fee_too_lowThe fee item is missing or below the fee from /v1/orders/params.royalty_too_lowThe royalty item is missing or below the collection royalty.price_too_lowThe unit price is below the chain minimum.bad_timeA listing must start now and run between 1 hour and 365 days: startTime at most 5 minutes ahead, endTime 1 hour to 365 days after it.duplicate_terminalThis exact order was already filled or cancelled. Sign a new one.raise_requires_cancelA cheaper live order from the maker exists for this ERC-721. Cancel it on-chain first (HTTP 409).cancel_on_chainPOST /v1/orders/asks/{askId}/cancel always answers this (HTTP 409): cancel with Seaport cancel(), then sync.listings_pausedListing intake is paused (HTTP 503).Offer codes cover intake, accept-data, cancel and sync. Here insufficient_balance and insufficient_allowance are about the bidder's WETH / WAPE and not_owner about the seller.
Offer codes
bad_structureThe payload or order does not match the offer format above; error names the field.unsupported_chainchainId is not 1 (Ethereum) or 33139 (ApeChain).unknown_collectionOSWiki does not index this collection.blacklistedOffers are not available for this collection.conduit_blockedThe collection only trades through OpenSea's zone, so an OSWiki offer could never be accepted.wrong_currencyThe offer item is not the chain's wrapped native token (WETH on Ethereum, WAPE on ApeChain).insufficient_balanceThe bidder's WETH / WAPE balance is below the offer amount.insufficient_allowanceThe bidder's WETH / WAPE allowance to Seaport is below the offer amount. Approve requiredAllowanceWei, then retry.unsupported_kindA collection offer on an ERC-1155, an amount other than 1, or a criteria other than 0.unknown_tokenAn item offer on a token OSWiki does not index yet.self_offerAn item offer on a token the bidder owns, or accepting your own offer.counter_mismatchcounter is not the bidder's current Seaport counter. Re-read it from /v1/orders/params.hash_mismatchorderHash does not match the struct hash the server computes.invalid_signatureThe signature does not verify for the bidder (ECDSA, EIP-2098 or ERC-1271).fee_too_lowThe fee leg is missing or below floor(offer x feeBps / 10000).royalty_too_lowThe royalty leg is missing, below offers.royalty.royaltyWei or paid to another receiver.price_too_lowThe offer is below bounds.minOfferWei.bad_timeAn offer must start now and run between 1 hour and 365 days: startTime at most 5 minutes ahead, endTime 1 hour to 365 days after it.duplicate_terminalThis exact offer was already cancelled, filled or expired. Sign a new one.order_cancelledSeaport reports the offer as cancelled.order_filledSeaport reports the offer as filled.bid_not_activeaccept-data: the offer is not active, or not found (HTTP 404).expiredaccept-data: the offer has expired.not_owneraccept-data: the fulfiller (seller) does not hold the token.offers_pausedOffer intake is paused (HTTP 503). Accepting and cancelling keep working.cancel_on_chainPOST /v1/orders/bids/{bidId}/cancel always answers this (HTTP 409): cancel with Seaport cancel(), then sync.gonePOST /v1/orders/bids/collection is removed (HTTP 410): post collection offers to POST /v1/orders/bids.