GeminiGemini
SandboxGet API key
  • Crypto Trading
  • Prediction Markets
Changelog
Gemini Crypto Exchange LogoGemini Crypto Exchange Logo

© 2026 Gemini Space Station, Inc.

Information
Markets
    List prediction market eventsgetGet event by tickergetGet strike price for eventgetList newly listed eventsgetList recently settled eventsgetList upcoming eventsgetList event categoriesget
Terms
    Get prediction market termsgetGet prediction market terms statusgetAccept prediction market termspost
Trading
    Place orderpostPlace a batch of orderspostCancel orderpostCancel a batch of orderspost
Positions
    Get active orderspostGet order historypostGet positionspostGet settled positionspostGet volume metricspost
Combos
    List combo contractsgetGet combo by instrument symbolget
Rewards
    Get maker-rebate rate schedulegetList maker-rebate payoutspostGet maker-rebate lifetime summarygetGet liquidity-rewards program configgetList liquidity-rewards eventsgetGet liquidity-rewards daily summarygetGet liquidity-rewards lifetime summaryget
Schemas
Gemini Prediction Markets API
Gemini Prediction Markets API

Trading

Server

Authenticated REST endpoints for placing and managing orders. Treat REST order placement as payload reference or a one-off server workflow; for active trading and market making, prefer WebSocket order.place.


Place order

POST
https://api.gemini.com
/v1/prediction-markets/order

Place a new prediction market order. Supports limit and stop-limit order types. Requires authentication and NewOrder permission.

Before sending orders, check GET /v1/prediction-markets/terms/status. If hasAcceptedLatest is false, display GET /v1/prediction-markets/terms and call POST /v1/prediction-markets/terms/accept, then retry the order.

Stop-Limit Orders

A stop-limit order is an order type that allows for order placement when a price reaches a specified level. Stop-limit orders take in both a price and a stopPrice as parameters. The stopPrice is the price that triggers the order to be placed on the continuous live order book at the price. For buy orders, the stopPrice must be greater than or equal to the last trade price and less than or equal to the price; for sell orders, the stopPrice must be less than or equal to the last trade price and greater than or equal to the price. Both price and stopPrice must be in the 0-1 range.

Place order › Request Body

OrderRequest
symbol
​string · required

Contract instrument symbol

Example: GEMI-FEDJAN26-DN25
orderType
​OrderType · enum · required

Order type. stop-limit orders require a stopPrice that triggers a limit order at price when the market reaches the trigger.

Enum values:
limit
stop-limit
side
​OrderSide · enum · required
Enum values:
buy
sell
quantity
​string · required

Number of contracts

Example: 100
price
​string · required

Limit price (0-1 range)

Example: 0.65
outcome
​Outcome · enum · required

The outcome being traded (Yes or No)

Enum values:
yes
no
stopPrice
​string

The price to trigger a stop-limit order (0-1 range). Only available for stop-limit orders. See Stop-Limit Orders above for stopPrice/price constraints.

Example: 0.60
timeInForce
​TimeInForce · enum

Order execution behavior:

  • good-til-cancel - Order remains active until filled or cancelled (default)
  • immediate-or-cancel - Fill immediately or cancel remaining
  • fill-or-kill - Fill entire order immediately or cancel
Enum values:
good-til-cancel
immediate-or-cancel
fill-or-kill
Default: good-til-cancel
makerOrCancel
​boolean

Set to true to require maker-only behavior. If the order would immediately take liquidity, the order is cancelled instead of filling.

Default: false

Place order › Responses

Order created successfully

OrderResponse
orderId
​integer · int64
hashOrderId
​string | null
clientOrderId
​string | null
globalOrderId
​string | null
status
​OrderStatus · enum
Enum values:
open
filled
cancelled
symbol
​string
side
​OrderSide · enum
Enum values:
buy
sell
outcome
​Outcome · enum

The outcome being traded (Yes or No)

Enum values:
yes
no
orderType
​OrderType · enum

Order type. stop-limit orders require a stopPrice that triggers a limit order at price when the market reaches the trigger.

Enum values:
limit
stop-limit
quantity
​string

Original order quantity

filledQuantity
​string

Amount filled so far

remainingQuantity
​string

Amount remaining to fill

price
​string

Limit price

stopPrice
​string | null

Stop trigger price (populated for stop-limit orders)

avgExecutionPrice
​string | null

Average price of fills

createdAt
​string · date-time
updatedAt
​string · date-time
cancelledAt
​string | null · date-time
​ContractMetadata
POST/v1/prediction-markets/order
curl --request POST \ --url https://api.gemini.com/v1/prediction-markets/order \ --header 'Content-Type: application/json' \ --data ' { "symbol": "GEMI-FEDJAN26-DN25", "orderType": "limit", "side": "buy", "quantity": "100", "price": "0.65", "outcome": "yes", "timeInForce": "good-til-cancel" } '
shell
Example Request Body
{ "symbol": "GEMI-FEDJAN26-DN25", "orderType": "limit", "side": "buy", "quantity": "100", "price": "0.65", "outcome": "yes", "timeInForce": "good-til-cancel" }
json
Place a limit order to buy 100 YES contracts at 0.65
application/json
Example Responses
{ "orderId": 12345678901, "status": "open", "symbol": "GEMI-FEDJAN26-DN25", "side": "buy", "outcome": "yes", "orderType": "limit", "quantity": "100", "filledQuantity": "0", "remainingQuantity": "100", "price": "0.65", "avgExecutionPrice": null, "createdAt": "2025-12-15T10:30:00.000Z", "updatedAt": "2025-12-15T10:30:00.000Z", "cancelledAt": null, "contractMetadata": { "contractId": "contract_123", "contractName": "FEDJAN26-DN25", "contractTicker": "FEDJAN26-DN25", "eventTicker": "FEDJAN26", "eventName": "Will Fed Funds Rate drop at least 0.25% at January 2026 meeting?", "category": "economics", "contractStatus": "active", "imageUrl": "https://example.com/fed.png", "expiryDate": "2026-01-31T23:59:59.000Z", "resolvedAt": null, "description": "Resolves YES if Federal Reserve lowers the target rate by 0.25% or more at the January 2026 FOMC meeting" } }
json
application/json

Place a batch of orders

POST
https://api.gemini.com
/v1/prediction-markets/order/batch

Place between 1 and 20 prediction market orders in one authenticated request. The complete payload is signed once using the standard private REST authentication headers. Each entry accepts the same fields as POST /v1/prediction-markets/order.

The operation is synchronous and non-atomic. Gemini validates the entire batch before submitting any orders. If the batch or any entry fails up-front validation, the request fails and no orders are submitted. After validation succeeds, orders are submitted sequentially and each result is returned in request order. An exchange rejection for one order does not stop later orders from being submitted; it appears as an error and message for that entry in the 200 response.

Place a batch of orders › Request Body

PlaceOrderBatchRequest
​OrderRequest[] · minItems: 1 · maxItems: 20 · required

Orders to submit. Every entry is validated before any order is submitted. All orders use the account associated with the authenticated request.

Place a batch of orders › Responses

Batch processed. Results are returned in request order and may contain both successful orders and per-entry errors.

PlaceOrderBatchResponse
​PlaceOrderBatchResult[] · minItems: 1 · maxItems: 20 · required

One result for each submitted order, in request order.

POST/v1/prediction-markets/order/batch
curl --request POST \ --url https://api.gemini.com/v1/prediction-markets/order/batch \ --header 'Content-Type: application/json' \ --data ' { "orders": [ { "symbol": "GEMI-FEDJAN26-DN25", "orderType": "limit", "side": "buy", "quantity": "100", "price": "0.65", "outcome": "yes", "timeInForce": "good-til-cancel" }, { "symbol": "GEMI-FEDJAN26-DN25", "orderType": "limit", "side": "sell", "quantity": "50", "price": "0.35", "outcome": "no", "timeInForce": "good-til-cancel" } ] } '
shell
Example Request Body
{ "orders": [ { "symbol": "GEMI-FEDJAN26-DN25", "orderType": "limit", "side": "buy", "quantity": "100", "price": "0.65", "outcome": "yes", "timeInForce": "good-til-cancel" }, { "symbol": "GEMI-FEDJAN26-DN25", "orderType": "limit", "side": "sell", "quantity": "50", "price": "0.35", "outcome": "no", "timeInForce": "good-til-cancel" } ] }
json
application/json
Example Responses
{ "results": [ { "order": { "orderId": 12345678901, "status": "open", "symbol": "GEMI-FEDJAN26-DN25", "side": "buy", "outcome": "yes", "orderType": "limit", "timeInForce": "good-til-cancel", "quantity": "100", "filledQuantity": "0", "remainingQuantity": "100", "price": "0.65", "createdAt": "2025-12-15T10:30:00.000Z", "updatedAt": "2025-12-15T10:30:00.000Z" } }, { "error": "InsufficientFunds", "message": "Insufficient funds" } ] }
json
application/json

Cancel order

POST
https://api.gemini.com
/v1/prediction-markets/order/cancel

Cancel an existing prediction market order. Requires authentication and CancelOrder permission.

Cancel order › Request Body

orderId
​integer · int64 · required

The order ID to cancel

Example: 12345678

Cancel order › Responses

Order cancelled successfully

result
​string
message
​string
POST/v1/prediction-markets/order/cancel
curl --request POST \ --url https://api.gemini.com/v1/prediction-markets/order/cancel \ --header 'Content-Type: application/json' \ --data ' { "orderId": 12345678 } '
shell
Example Request Body
{ "orderId": 12345678 }
json
Example Responses
{ "result": "ok", "message": "Order 12345678 cancelled successfully" }
json
application/json

Cancel a batch of orders

POST
https://api.gemini.com
/v1/prediction-markets/order/batch/cancel

Cancel between 1 and 20 prediction market orders in one authenticated request. The complete payload is signed once using the standard private REST authentication headers. Each order ID may be a JSON integer or a quoted numeric string.

The operation is synchronous and non-atomic. Gemini validates all order IDs before attempting any cancellation. If the batch is empty, contains more than 20 entries, or contains an invalid ID, the request fails and no orders are cancelled. After validation succeeds, cancellations are attempted sequentially and each result is returned in request order. A rejection for one cancellation does not stop later cancellations from being attempted; it appears as an error and message for that entry in the 200 response.

Cancel a batch of orders › Request Body

CancelOrderBatchRequest
​array · minItems: 1 · maxItems: 20 · required

Order IDs to cancel. Each ID may be an integer or a quoted numeric string. All IDs are validated before any cancellation is attempted.

Cancel a batch of orders › Responses

Batch processed. Results are returned in request order and may contain both successful cancellations and per-entry errors.

CancelOrderBatchResponse
​CancelOrderBatchResult[] · minItems: 1 · maxItems: 20 · required

One result for each requested cancellation, in request order.

POST/v1/prediction-markets/order/batch/cancel
curl --request POST \ --url https://api.gemini.com/v1/prediction-markets/order/batch/cancel \ --header 'Content-Type: application/json' \ --data ' { "orderIds": [ 12345678, "12345679" ] } '
shell
Example Request Body
{ "orderIds": [ 12345678, "12345679" ] }
json
application/json
Example Responses
{ "results": [ { "orderId": 12345678, "result": "ok" }, { "orderId": 12345679, "error": "OrderNotFound", "message": "Order 12345679 not found" } ] }
json
application/json

TermsPositions