# /account/exchange-credentials Add a set of exchange credentials to your account. The credentials are checked with the exchange before they are saved, so they must be valid and for the network of the environment you are calling ( on the Test API, on the Production API). An API key may add exchange credentials only when the user who created it is a trader admin. Endpoint: POST /account/exchange-credentials Version: 1.0 Security: BearerAuth, FigSignature, FigTimestamp ## Request fields (application/json): - `exchangeId` (integer, required) Exchange identifier - see [Exchanges](/guides/glossary#exchanges) Enum: 17, 25, 26, 5 - `alias` (string, required) Custom alias/reference for exchange credentials, unique on your account - `credentials` (any, required) - `isExchangeDefault` (boolean) Makes these credentials your default for their exchange. Setting it to clears the default from your other credentials on the same exchange; removes the default from these credentials. Leave it out of an update to keep the current setting. - `allowedTokens` (array) The base currencies these credentials may trade, as token symbols. An empty list means the credentials are not restricted and may trade every token. ## Response 200 fields (application/json): - `credentialsId` (integer) Unique identifier for credentials - `alias` (string) Custom alias/reference for exchange credentials, unique on your account - `exchangeId` (integer) Exchange identifier - see [Exchanges](/guides/glossary#exchanges) Enum: 17, 25, 26, 5 - `exchangeShortCode` (string) Short code for the exchange - see [Exchanges](/guides/glossary#exchanges) Enum: "DBT", "BULL", "DRV", "OKX" - `exchange` (string) Exchange name - see [Exchanges](/guides/glossary#exchanges) - `network` (string) The exchange network the credentials are for. Credentials must match the environment: on the Test API and on the Production API. Enum: "mainnet", "testnet" - `isExchangeDefault` (boolean) Whether these are your default credentials for their exchange. A default is optional, and at most one set of credentials per exchange is the default. - `allowedTokens` (array) The base currencies these credentials may trade, as token symbols. An empty list means the credentials are not restricted and may trade every token. - `exchangeAccess` (object,null) What the exchange last reported for these credentials, each list in the exchange's own vocabulary. when the exchange has not been asked yet or could not be reached. - `exchangeAccess.permissions` (array) The permissions (API key scopes) the exchange reports for the credentials Example: ["account:read","block_rfq:read_write","block_trade:read_write","trade:read_write"] - `exchangeAccess.features` (array) The features the exchange reports as enabled on the account Example: ["block_trade_approval"] - `exchangeAccess.ipWhitelist` (array,null) The IP addresses the exchange restricts the credentials to. An empty list means no restriction; means the exchange does not report one. Example: ["203.0.113.10"] - `exchangeAccess.checkedAt` (string) When the exchange was last asked (RFC 3339, UTC) Example: "2026-10-19T09:30:00Z" - `blockTradeApproval` (boolean) when the exchange requires each block trade on these credentials to be approved, such as Deribit's feature. RFQs and RFQ quotes cannot settle on such credentials, so creating an RFQ or quote with them is refused. Read from , so it is for credentials the exchange has not been asked about yet. ## Response 400 fields (application/json): - `code` (integer) Example: 400 - `message` (string) Example: "Invalid Request" - `reason` (array) Example: ["Invalid input"] ## Response 403 fields (application/json): - `code` (integer) Example: 403 - `message` (string) Why the request was refused, e.g.: - - : the user who created the API key has not yet accepted the terms and conditions in the Fig Markets app Example: "the user who created this API key does not have a role this request requires" ## Response 420 fields (application/json): - `code` (integer) Example: 420 - `message` (string) What went wrong, in the same wording whichever venue raised it Example: "Price is too high" - `reason` (array) Further detail, such as the instrument or limit involved; omitted when there is none Example: ["BTC-26SEP25-116000-C - Maximum price: 0.0815"] - `exchangeError` (object) The venue's error, normalised to the same shape for every venue - `exchangeError.message` (string) Same as the top-level Example: "Price is too high" - `exchangeError.exchange` (string) The venue that returned the error Enum: "bullish", "deribit", "derive", "okx" - `exchangeError.exchangeCode` (string) The venue's own error code, for support queries; omitted when the venue gave none Example: "10007" - `exchangeError.exchangeReason` (string) The venue's own error text, for support queries; omitted when the venue gave none Example: "price_too_high" - `exchangeError.params` (object) Structured detail behind , such as , , , , , , and ; each key is omitted when it does not apply Example: {"instrument":"BTC-26SEP25-116000-C","limit":0.0815}