Skip to main content
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.
Returns the full public identity of Polymarket wallets: the public profile fields, where they came from and when they were read, and the wallet’s signer and wallet type from our wallet registry, each labelled with a confidence. The routes take your Data API credential (analytics.read). Each successful request costs 1 API credit.
  • Venue: Polymarket only. There is no venue parameter.
  • 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 is null, not false. profile_source, profile_status and profile_fetched_at tell you what each answer rests on.
  • The signer is labelled, not filtered. signer and type are served at every confidence level, always together with type_confidence. Decide what to trust from that label.
For usernames and avatars only, the lighter GET /v2/polymarket/wallets/identities is still available. It does not return the signer.

GET /v2/polymarket/wallet/identity/{wallet}

string
required
Wallet address: 0x followed by 40 hex characters. Case-insensitive.
This route takes no query parameters. Any query parameter is refused with 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.
string
required
The wallet, lowercase 0x.
string
required
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.
string
required
From the Polymarket public profile, verbatim. null when the profile did not return the field or was not read.
string
required
The Bravado avatar, else the Polymarket profile image URL. null if neither.
boolean
required
From the Polymarket public profile. null (not false) when the profile did not return the field or was not read.
string
required
The profile’s creation time as Polymarket returns it (an ISO-8601 string, not unix seconds). null when not returned.
string
required
bravado when a Bravado user record supplied the username or avatar. gamma when the Polymarket public profile was found. none when neither.
string
required
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.
integer
required
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.
boolean
required
true when a public profile exists (profile_source is not none). It does not depend on signer.
string
required
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.
string
required
Wallet type: eoa, deposit_wallet, poly_proxy, poly_clone, safe or contract. null when the registry has no row.
string
required
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.
The example is illustrative.

POST /v2/polymarket/wallet/identities

string[]
required
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.
Returns a JSON array of identity objects, each with the same fields as the 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 with 401 INVALID_SIGNATURE.
Send it in 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.