Open leveraged perpetual positions on Hyperliquid with optional native TP/SL tri
Open leveraged perpetual positions on Hyperliquid with optional native TP/SL trigger orders. Min notional $10. Max leverage varies by asset (BTC 40x, ETH 25x, SOL 20x). Supports BTC, ETH, SOL, and 100+ other markets.
Answeringour last check, 2026-09-24
1 of 1checks answered this week
972 msmedian answer time
$0.01listed price per call
$0.01price it asked us
Paid test badge: not yet. The checks above are free: we call the tool without paying and read the payment request it sends back. The Verified badge needs paid calls whose answers match the promised output, and nobody can buy a badge.
Endpoint
POST https://x402.ottoai.services/trade-perpetuals
| Category | Everything else |
|---|---|
| Provider host | x402.ottoai.services |
| Networks | eip155:8453 |
| Payment schemes | exact |
| Self-reported calls, 30 days | 2 from 1 payers (the provider's figure, not ours) |
Our checks, last 30 days
| Day | Result | HTTP | Asked | Time |
|---|---|---|---|---|
| 2026-09-24 | valid payment request | 402 | $0.01 | 972 ms |
Example input (from the provider)
{
"body": {
"asset": "BTC",
"leverage": 25,
"side": "long",
"size": 250,
"stopLoss": {
"price": 60000
},
"takeProfit": {
"price": 75000
}
},
"bodyType": "json",
"method": "POST",
"type": "http"
}
Promised output schema (from the provider)
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"input": {
"additionalProperties": false,
"properties": {
"body": {
"additionalProperties": false,
"properties": {
"asset": {
"description": "Asset ticker (BTC, ETH, SOL, etc.). HIP-3 stock perps also accept 'xyz:TSLA' form.",
"type": "string"
},
"leverage": {
"description": "Leverage multiplier (1-40 depending on asset)",
"type": "number"
},
"limitPrice": {
"description": "Required when orderType is 'limit'.",
"type": "number"
},
"marginMode": {
"description": "Default: cross. Stock perps (xyz DEX) are always isolated.",
"enum": [
"cross",
"isolated"
],
"type": "string"
},
"orderType": {
"description": "Default: market.",
"enum": [
"market",
"limit"
],
"type": "string"
},
"side": {
"description": "Position direction",
"enum": [
"long",
"short"
],
"type": "string"
},
"size": {
"description": "Notional size in USDC (NOT margin). For '$10 margin at 25x', use size=250. Required \u2014 an omitted size is rejected, never defaulted.",
"type": "number"
},
"stopLoss": {
"description": "Optional stop-loss trigger. Provide EITHER percentage OR price, not both.",
"properties": {
"percentage": {
"description": "SL as a percentage loss from entry (e.g. 5 = -5%)",
"type": "number"
},
"price": {
"description": "SL as an absolute price level",
"type": "number"
}
},
"type": "object"
},
"stopLossPrice": {
"description": "Alias for stopLoss.price. Send exactly one of the two \u2014 supplying stopLoss and stopLossPrice together is rejected, including when their values are equal.",
"type": "number"
},
"takeProfit": {
"description": "Optional take-profit trigger. Provide EITHER percentage OR price, not both.",
"properties": {
"percentage": {
"description": "TP as a percentage gain from entry (e.g. 10 = +10%)",
"type": "number"
},
"price": {
"description": "TP as an absolute price level",
"type": "number"
}
},
"type": "object"
},
"takeProfitPrice": {
"description": "Alias for takeProfit.price. Send exactly one of the two \u2014 supplying takeProfit and takeProfitPrice together is rejected, including when their values are equal.",
"type": "number"
}
},
"required": [
"asset",
"side",
"size",
"leverage"
],
"type": "object"
},
"bodyType": {
"enum": [
"json",
"form-data",
"text"
],
"type": "string"
},
"method": {
"enum": [
"POST"
],
"type": "string"
},
"type": {
"const": "http",
"type": "string"
}
},
"required": [
"type",
"method",
"bodyType",
"body"
],
"type": "object"
},
"output": {
"properties": {
"example": {
"properties": {
"action_required": {
"description": "Machine-readable: true whenever this position needs you to look at it. Branch on this single field and you land correctly for every status above.",
"type": "boolean"
},
"as_of": {
"type": "string"
},
"asset": {
"type": "string"
},
"entry": {
"properties": {
"accepted": {
"type": "boolean"
},
"amountConfirmed": {
"type": "boolean"
},
"entryPrice": {
"type": "number"
},
"filledSize": {
"type": "number"
},
"filledSize_notional": {
"type": "number"
},
"leverage": {
"type": "number"
},
"marginMode": {
"type": "string"
},
"orderId": {
"type": "string"
},
"orderType": {
"type": "string"
},
"outcome": {
"description": "Where the entry stands, read off the venue by the client order id we submitted: 'filled' (a position is open \u2014 the AMOUNT is a separate question, see `amountConfirmed` and `filledSize`; a 'filled' status alone does not mean the full requested size filled), 'partially_filled' (a position is open for PROVABLY less than requested \u2014 see entry.filledSize for what actually filled), 'resting' (the order is on the book), 'rejected' (the venue refused this exact order), 'not_submitted' (nothing was sent to the venue at all) or 'unknown' (none of these could be established \u2014 check before retrying, because retrying may open a second position). You are charged when this request verifi