Sign each request with a fresh HMAC signature. The cURL and HTTP header values below are placeholders, not reusable credentials. For runnable signing code, use request signing examples.
analytics.read). Each successful request costs 1 API credit.
- Venue: Polymarket only. There is no
venueparameter. - Predexon-compatible. The routes and field names follow Predexon’s wallet identity endpoints, so you can switch base URLs.
- Unknown is
null, never a default. A boolean that the profile source did not return isnull, notfalse.profile_source,profile_statusandprofile_fetched_attell you what each answer rests on. - The signer is labelled, not filtered.
signerandtypeare served at every confidence level, always together withtype_confidence. Decide what to trust from that label.
GET /v2/polymarket/wallets/identities is still available. It does not return the signer.
GET /v2/polymarket/wallet/identity/{wallet}
400 unknown_param.
Returns one identity object. A wallet with no public profile is still a 200, with found: false and null profile fields. This does not assert that the wallet does not exist.
The Bravado username if the wallet has one. Otherwise the Polymarket public name, when the profile allows it to be public. Otherwise the Polymarket pseudonym.
null if none of these is available.From the Polymarket public profile, verbatim.
null when the profile did not return the field or was not read.From the Polymarket public profile.
null (not false) when the profile did not return the field or was not read.The profile’s creation time as Polymarket returns it (an ISO-8601 string, not unix seconds).
null when not returned.bravado when a Bravado user record supplied the username or avatar. gamma when the Polymarket public profile was found. none when neither.ok: the Polymarket profile service answered (found or not found). deferred: our request budget toward that service was exhausted, so only the locally held fields are served. Retry later for the rest. unavailable: the service could not be read (failure or time budget). Locally held fields and the signer are still served.Unix seconds of the read the profile answer rests on. A cached answer carries the time it was originally fetched, not the time of your request.
null when nothing was read.true when a public profile exists (profile_source is not none). It does not depend on signer.The address that controls the wallet (lowercase
0x), from our wallet registry. null when the registry has no row for the wallet, could not be read, or records the zero address (owner unknown). In that last case type and type_confidence are still served. For type: "safe" it is the Safe’s owner at creation: Safe owners can be changed later, so it is not claimed to be the current signer.Wallet type:
eoa, deposit_wallet, poly_proxy, poly_clone, safe or contract. null when the registry has no row.How the registry established
signer and type: exact, high, medium or low. For type: "safe" it is creation_owner (see signer). null when the registry has no row.POST /v2/polymarket/wallet/identities
1–200 wallet addresses, each
0x followed by 40 hex characters. The limit counts the list as sent, duplicates included. Any other key in the body is refused.GET route. Addresses are lowercased and duplicates collapse in first-occurrence order, so the array can be shorter than your list. Match rows by their address field, never by position. One invalid address rejects the whole batch before any lookup.
When many wallets in a batch need a fresh profile read, some rows can come back with profile_status: "deferred". Those rows still carry the locally held fields and the signer. The request never waits for, or fails on, the profile service.
This POST is a read: it is the only POST route your Data API key (analytics.read) can call. It takes no query parameters (any is refused with 400 unknown_param) and needs no Idempotency-Key.
Sign the body
The signature covers the raw body bytes you send. Serialize the JSON once, hash those bytes with SHA-256, and send exactly those bytes. Re-serializing after signing (key order, spacing) changes the hash, and the request is refused with401 INVALID_SIGNATURE.
X-Bravado-Signature, with X-Bravado-API-Key, X-Bravado-Timestamp and Content-Type: application/json. See HMAC authentication.
Errors
Two layers answer a
400, and their envelopes differ. The API edge sends {"error": "<message>", "code": "unknown_param" | "invalid_param", "param": "<name>"}. The analytics service sends {"error": "BAD_REQUEST" | "NOT_FOUND" | "UNAVAILABLE", "message": "<message>"}. Read the typed code from code when it is present, otherwise from error.
Related
- Public wallet identities: username and avatar only, up to 100 wallets.
- Wallet profile: trading metrics for a wallet.