ToolAssay

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

CategoryEverything else
Provider hostx402.ottoai.services
Networkseip155:8453
Payment schemesexact
Self-reported calls, 30 days2 from 1 payers (the provider's figure, not ours)

Our checks, last 30 days

DayResultHTTPAskedTime
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

This page as JSON