openapi: 3.0.3 info: title: RoboSats REST API v0 version: 0.1.0 description: |2+ REST API Documentation for [RoboSats](https://learn.robosats.com) - A Simple and Private LN P2P Exchange

Note: The RoboSats REST API is on v0, which in other words, is beta. We recommend that if you don't have time to actively maintain your project, do not build it with v0 of the API. A refactored, simpler and more stable version - v1 will be released soon™.

paths: /api/book/: get: operationId: book_list description: Get public orders in the book. summary: Get public orders parameters: - in: query name: currency schema: type: integer description: The currency id to filter by. Currency IDs can be found [here](https://github.com/Reckless-Satoshi/robosats/blob/main/frontend/static/assets/currencies.json). Value of `0` means ANY currency - in: query name: type schema: type: integer enum: - 0 - 1 - 2 description: |- Order type to filter by - `0` - BUY - `1` - SELL - `2` - ALL tags: - book security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/OrderPublic' description: '' /api/historical/: get: operationId: historical_list description: Get historical exchange activity. Currently, it lists each day's total contracts and their volume in BTC since inception. summary: Get historical exchange activity tags: - historical security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: array items: type: object additionalProperties: type: object properties: volume: type: integer description: Total Volume traded on that particular date num_contracts: type: number description: Number of successful trades on that particular date examples: TruncatedExample: value: - : code: USD price: '42069.69' min_amount: '4.2' max_amount: '420.69' max_bondless_amount: '10.1' summary: Truncated example description: '' /api/info/: get: operationId: info_list description: "\nGet general info (overview) about the exchange.\n\n**Info**:\n\ - Current market data\n - num. of orders\n - book liquidity\n - 24h active\ \ robots \n - 24h non-KYC premium\n - 24h volume\n - all time volume\n\ - Node info \n - lnd version\n - node id\n - node alias\n - network\n\ - Fees\n - maker and taker fees\n - on-chain swap fees\n- Robot (If autheticated)\n\ \ - nickname\n - referral code\n - earned rewards\n" summary: Get info tags: - info security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Info' description: '' /api/limits/: get: operationId: limits_list description: Get a list of order limits for every currency pair available. summary: List order limits tags: - limits security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: array items: type: object additionalProperties: type: object properties: code: type: string description: Three letter currency symbol price: type: integer min_amount: type: integer description: Minimum amount allowed in an order in the particular currency max_amount: type: integer description: Maximum amount allowed in an order in the particular currency max_bondless_amount: type: integer description: Maximum amount allowed in a bondless order examples: TruncatedExample.RealResponseContainsAllTheCurrencies: value: - : code: USD price: '42069.69' min_amount: '4.2' max_amount: '420.69' max_bondless_amount: '10.1' summary: Truncated example. Real response contains all the currencies description: '' /api/make/: post: operationId: make_create description: |2 Create a new order as a maker. Default values for the following fields if not specified: - `public_duration` - **86399** - `escrow_duration` - **1800** - `bond_size` - **3** - `bondless_taker` - **false** - `has_range` - **false** - `premium` - **0** summary: Create a maker order tags: - make requestBody: content: application/json: schema: $ref: '#/components/schemas/MakeOrder' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/MakeOrder' multipart/form-data: schema: $ref: '#/components/schemas/MakeOrder' required: true security: - cookieAuth: [] - basicAuth: [] - {} responses: '201': content: application/json: schema: $ref: '#/components/schemas/ListOrder' description: '' '400': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure description: '' '409': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure description: '' /api/order/: get: operationId: order_retrieve description: |2+ Get the order details. Details include/exclude attributes according to what is the status of the order The following fields are available irrespective of whether you are a participant or not (A participant is either a taker or a maker of an order) All the other fields are only available when you are either the taker or the maker of the order: - `id` - `status` - `created_at` - `expires_at` - `type` - `currency` - `amount` - `has_range` - `min_amount` - `max_amount` - `payment_method` - `is_explicit` - `premium` - `satoshis` - `bondless_taker` - `maker` - `taker` - `escrow_duration` - `total_secs_exp` - `penalty` - `is_maker` - `is_taker` - `is_participant` - `maker_status` - `taker_status` - `price_now` ### Order Status The response of this route changes according to the status of the order. Some fields are documented below (check the 'Responses' section) with the status code of when they are available and some or not. With v1 API we aim to simplify this route to make it easier to understand which fields are available on which order status codes. `status` specifies the status of the order. Below is a list of possible values (status codes) and what they mean: - `0` "Waiting for maker bond" - `1` "Public" - `2` "Paused" - `3` "Waiting for taker bond" - `4` "Cancelled" - `5` "Expired" - `6` "Waiting for trade collateral and buyer invoice" - `7` "Waiting only for seller trade collateral" - `8` "Waiting only for buyer invoice" - `9` "Sending fiat - In chatroom" - `10` "Fiat sent - In chatroom" - `11` "In dispute" - `12` "Collaboratively cancelled" - `13` "Sending satoshis to buyer" - `14` "Sucessful trade" - `15` "Failed lightning network routing" - `16` "Wait for dispute resolution" - `17` "Maker lost dispute" - `18` "Taker lost dispute" Notes: - both `price_now` and `premium_now` are always calculated irrespective of whether `is_explicit` = true or false summary: Get order details parameters: - in: query name: order_id schema: type: integer required: true tags: - order security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/OrderDetail' description: '' '400': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure examples: OrderCancelled: value: bad_request: This order has been cancelled collaborativelly summary: Order cancelled WhenTheOrderIsNotPublicAndYouNeitherTheTakerNorMaker: value: bad_request: This order is not available summary: When the order is not public and you neither the taker nor maker WhenMakerBondExpires(asMaker): value: bad_request: Invoice expired. You did not confirm publishing the order in time. Make a new order. summary: When maker bond expires (as maker) WhenRobosatsNodeIsDown: value: bad_request: The Lightning Network Daemon (LND) is down. Write in the Telegram group to make sure the staff is aware. summary: When Robosats node is down description: '' '403': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure default: This order is not available description: '' '404': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure default: Invalid order Id description: '' post: operationId: order_create description: |2+ Update an order `action` field is required and determines what is to be done. Below is an explaination of what each action does: - `take` - If the order has not expired and is still public, on a successful take, you get the same response as if `GET /order` was called and the status of the order was `3` (waiting for taker bond) which means `bond_satoshis` and `bond_invoice` are present in the response as well. Once the `bond_invoice` is paid, you successfully become the taker of the order and the status of the order changes. - `pause` - Toggle the status of an order from `1` to `2` and vice versa. Allowed only if status is `1` (Public) or `2` (Paused) - `update_invoice` - This action only is valid if you are the buyer. The `invoice` field needs to be present in the body and the value must be a valid LN invoice. Make sure to perform this action only when both the bonds are locked. i.e The status of your order is atleast `6` (Waiting for trade collateral and buyer invoice) - `update_address` - This action is only valid if you are the buyer. This action is used to set an on-chain payout address if you wish to have your payout be recieved on-chain. This enables on-chain swap for the order, so even if you earlier had submitted a LN invoice, it will be ignored. You get to choose the `mining_fee_rate` as well. Mining fee rate is specified in sats/vbyte. - `cancel` - This action is used to cancel an existing order. You cannot cancel an order if it's in one of the following states: - `1` - Cancelled - `5` - Expired - `11` - In dispute - `12` - Collaboratively cancelled - `13` - Sending satoshis to buyer - `14` - Sucessful trade - `15` - Failed lightning network routing - `17` - Maker lost dispute - `18` - Taker lost dispute Note that there are penalties involved for cancelling a order mid-trade so use this action carefully: - As a maker if you cancel an order after you have locked your maker bond, you are returend your bond. This may change in the future to prevent DDoSing the LN node and you won't be returend the maker bond. - As a taker there is a time penalty involved if you `take` an order and cancel it without locking the taker bond. - For both taker or maker, if you cancel the order when both have locked thier bonds (status = `6` or `7`), you loose your bond and a percent of it goes as "rewards" to your counterparty and some of it the platform keeps. This is to discourage wasting time and DDoSing the platform. - For both taker or maker, if you cancel the order when the escrow is locked (status = `8` or `9`), you trigger a collaborative cancel request. This sets `(m|t)aker_asked_cancel` field to `true` depending on whether you are the maker or the taker respectively, so that your counterparty is informed that you asked for a cancel. - For both taker or maker, and your counterparty asked for a cancel (i.e `(m|t)aker_asked_cancel` is true), and you cancel as well, a collaborative cancel takes place which returns both the bonds and escrow to the respective parties. Note that in the future there will be a cost for even collaborativelly cancelling orders for both parties. - `confirm` - This is a **crucial** action. This confirms the sending and recieving of fiat depending on whether you are a buyer or seller. There is not much RoboSats can do to actually confirm and verify the fiat payment channel. It is up to you to make sure of the correct amount was recieved before you confirm. This action is only allowed when status is either `9` (Sending fiat - In chatroom) or `10` (Fiat sent - In chatroom) - If you are the buyer, it simply sets `fiat_sent` to `true` which means that you have sent the fiat using the payment method selected by the seller and signals the seller that the fiat payment was done. - If you are the seller, be very careful and double check before perorming this action. Check that your fiat payment method was successful in recieving the funds and whether it was the correct amount. This action settles the escrow and pays the buyer and sets the the order status to `13` (Sending satohis to buyer) and eventually to `14` (successful trade). - `dispute` - This action is allowed only if status is `9` or `10`. It sets the order status to `11` (In dispute) and sets `is_disputed` to `true`. Both the bonds and the escrow are settled (i.e RoboSats takes custody of the funds). Disputes can take long to resolve, it might trigger force closure for unresolved HTLCs). Dispute winner will have to submit a new invoice for value of escrow + bond. - `submit_statement` - This action updates the dispute statement. Allowed only when status is `11` (In dispute). `satement` must be sent in the request body and should be a string. 100 chars < length of `statement` < 5000 chars. You need to discribe the reason for raising a dispute. The `(m|t)aker_statement` field is set respectively. Only when both parties have submitted thier dispute statement, the order status changes to `16` (Waiting for dispute resolution) - `rate_user` - You can rate your counterparty using this action. You can rate your user from `1-5` using the `rate` field in the request body. Only allowed in the following states: - `13` - Sending satoshis to buyer - `14` - Sucessful trade - `15` - Failed lightning network routing - `17` - Maker lost dispute - `18` - Taker lost dispute - `rate_platform` - Let us know how much you love (or hate 😢) RoboSats. You can rate the platform from `1-5` using the `rate` field in the request body summary: Update order parameters: - in: query name: order_id schema: type: integer required: true tags: - order requestBody: content: application/json: schema: $ref: '#/components/schemas/UpdateOrder' examples: UserNotAuthenticated: value: bad_request: Woops! It seems you do not have a robot avatar summary: User not authenticated application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UpdateOrder' multipart/form-data: schema: $ref: '#/components/schemas/UpdateOrder' required: true security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: object additionalProperties: oneOf: - type: str - type: number - type: object - type: boolean description: '' '400': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure examples: UserNotAuthenticated: value: bad_request: Woops! It seems you do not have a robot avatar summary: User not authenticated description: '' /api/price/: get: operationId: price_list description: Get the last market price for each currency. Also, returns some more info about the last trade in each currency. summary: Get last market prices tags: - price security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: array items: type: object additionalProperties: type: object properties: price: type: integer volume: type: integer premium: type: integer timestamp: type: string format: date-time examples: TruncatedExample.RealResponseContainsAllTheCurrencies: value: - : price: 21948.89 volume: 0.01366812 premium: 3.5 timestamp: '2022-09-13T14:32:40.591774Z' summary: Truncated example. Real response contains all the currencies description: '' /api/reward/: post: operationId: reward_create description: Withdraw user reward by submitting an invoice summary: Withdraw reward tags: - reward requestBody: content: application/json: schema: $ref: '#/components/schemas/ClaimReward' examples: UserNotAuthenticated: value: bad_request: Woops! It seems you do not have a robot avatar summary: User not authenticated WhenNoRewardsEarned: value: successful_withdrawal: false bad_invoice: You have not earned rewards summary: When no rewards earned BadInvoiceOrInCaseOfPaymentFailure: value: successful_withdrawal: false bad_invoice: Does not look like a valid lightning invoice summary: Bad invoice or in case of payment failure application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/ClaimReward' multipart/form-data: schema: $ref: '#/components/schemas/ClaimReward' security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: object properties: successful_withdrawal: type: boolean default: true description: '' '400': content: application/json: schema: oneOf: - type: object properties: successful_withdrawal: type: boolean default: false bad_invoice: type: string description: More context for the reason of the failure - type: object properties: successful_withdrawal: type: boolean default: false bad_request: type: string description: More context for the reason of the failure examples: UserNotAuthenticated: value: bad_request: Woops! It seems you do not have a robot avatar summary: User not authenticated WhenNoRewardsEarned: value: successful_withdrawal: false bad_invoice: You have not earned rewards summary: When no rewards earned BadInvoiceOrInCaseOfPaymentFailure: value: successful_withdrawal: false bad_invoice: Does not look like a valid lightning invoice summary: Bad invoice or in case of payment failure description: '' /api/stealth/: put: operationId: stealth_update description: Update stealth invoice option for the user summary: Update stealth option tags: - stealth requestBody: content: application/json: schema: $ref: '#/components/schemas/Stealth' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/Stealth' multipart/form-data: schema: $ref: '#/components/schemas/Stealth' required: true security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/Stealth' description: '' '400': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure description: '' patch: operationId: stealth_partial_update tags: - stealth requestBody: content: application/json: schema: $ref: '#/components/schemas/PatchedStealth' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/PatchedStealth' multipart/form-data: schema: $ref: '#/components/schemas/PatchedStealth' security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/Stealth' description: '' /api/ticks/: get: operationId: ticks_list description: |- Get all market ticks. Returns a list of all the market ticks since inception. CEX price is also recorded for useful insight on the historical premium of Non-KYC BTC. Price is set when taker bond is locked. summary: Get market ticks tags: - ticks security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: type: array items: $ref: '#/components/schemas/Tick' description: '' /api/user/: post: operationId: user_create description: |- Get a new user derived from a high entropy token - Request has a hash of a high-entropy token - Request includes pubKey and encrypted privKey - Generates new nickname and avatar. - Creates login credentials (new User object) Response with Avatar, Nickname, pubKey, privKey. tags: - user requestBody: content: application/json: schema: $ref: '#/components/schemas/UserGen' application/x-www-form-urlencoded: schema: $ref: '#/components/schemas/UserGen' multipart/form-data: schema: $ref: '#/components/schemas/UserGen' required: true security: - cookieAuth: [] - basicAuth: [] - {} responses: '200': content: application/json: schema: $ref: '#/components/schemas/UserGen' description: '' delete: operationId: user_destroy description: |2 Delete a Robot. Deleting a robot is not allowed if the robot has an active order, has had completed trades or was created more than 30 mins ago. Mainly used on the frontend to "Generate new Robot" without flooding the DB with discarded robots. summary: Delete user tags: - user security: - cookieAuth: [] - basicAuth: [] - {} responses: '403': description: No response body '400': content: application/json: schema: type: object properties: bad_request: type: string description: Reason for the failure description: '' '301': content: application/json: schema: type: object properties: user_deleted: type: string default: User deleted permanently description: '' components: schemas: ActionEnum: enum: - pause - take - update_invoice - update_address - submit_statement - dispute - cancel - confirm - rate_user - rate_platform type: string BlankEnum: enum: - '' ClaimReward: type: object properties: invoice: type: string nullable: true description: A valid LN invoice with the reward amount to withdraw maxLength: 2000 CurrencyEnum: enum: - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21 - 22 - 23 - 24 - 25 - 26 - 27 - 28 - 29 - 30 - 31 - 32 - 33 - 34 - 35 - 36 - 37 - 38 - 39 - 40 - 41 - 42 - 43 - 44 - 45 - 46 - 47 - 48 - 49 - 50 - 51 - 52 - 53 - 54 - 55 - 56 - 57 - 58 - 59 - 60 - 61 - 62 - 63 - 64 - 65 - 66 - 67 - 68 - 69 - 300 - 1000 type: integer ExpiryReasonEnum: enum: - 0 - 1 - 2 - 3 - 4 type: integer Info: type: object properties: num_public_buy_orders: type: integer num_public_sell_orders: type: integer book_liquidity: type: integer description: Total amount of BTC in the order book active_robots_today: type: string last_day_nonkyc_btc_premium: type: number format: double description: Average premium (weighted by volume) of the orders in the last 24h last_day_volume: type: number format: double description: Total volume in BTC in the last 24h lifetime_volume: type: number format: double description: Total volume in BTC since exchange's inception lnd_version: type: string robosats_running_commit_hash: type: string alternative_site: type: string alternative_name: type: string node_alias: type: string node_id: type: string network: type: string maker_fee: type: number format: double description: Exchange's set maker fee taker_fee: type: number format: double description: 'Exchange''s set taker fee ' bond_size: type: number format: double description: Default bond size (percent) current_swap_fee_rate: type: number format: double description: Swap fees to perform on-chain transaction (percent) nickname: type: string description: Currenlty logged in Robot name referral_code: type: string description: Logged in users's referral code earned_rewards: type: integer description: Logged in user's earned rewards in satoshis required: - active_robots_today - alternative_name - alternative_site - bond_size - book_liquidity - current_swap_fee_rate - earned_rewards - last_day_nonkyc_btc_premium - last_day_volume - lifetime_volume - lnd_version - maker_fee - network - nickname - node_alias - node_id - num_public_buy_orders - num_public_sell_orders - referral_code - robosats_running_commit_hash - taker_fee ListOrder: type: object properties: id: type: integer readOnly: true status: allOf: - $ref: '#/components/schemas/StatusEnum' minimum: 0 maximum: 32767 created_at: type: string format: date-time expires_at: type: string format: date-time type: allOf: - $ref: '#/components/schemas/TypeEnum' minimum: 0 maximum: 32767 currency: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true has_range: type: boolean min_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true max_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true payment_method: type: string maxLength: 70 is_explicit: type: boolean premium: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ nullable: true satoshis: type: integer maximum: 4000000 minimum: 20000 nullable: true bondless_taker: type: boolean maker: type: integer nullable: true taker: type: integer nullable: true escrow_duration: type: integer maximum: 28800 minimum: 1800 bond_size: type: string format: decimal pattern: ^-?\d{0,2}(?:\.\d{0,2})?$ required: - expires_at - id - type MakeOrder: type: object properties: type: allOf: - $ref: '#/components/schemas/TypeEnum' minimum: 0 maximum: 32767 currency: type: integer description: Currency id. See [here](https://github.com/Reckless-Satoshi/robosats/blob/main/frontend/static/assets/currencies.json) for a list of all IDs amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true has_range: type: boolean default: false description: |- Whether the order specifies a range of amount or a fixed amount. If `true`, then `min_amount` and `max_amount` fields are **required**. If `false` then `amount` is **required** min_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true max_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true payment_method: type: string default: not specified description: Can be any string. The UI recognizes [these payment methods](https://github.com/Reckless-Satoshi/robosats/blob/main/frontend/src/components/payment-methods/Methods.js) and displays them with a logo. maxLength: 70 is_explicit: type: boolean default: false description: Whether the order is explicitly priced or not. If set to `true` then `satoshis` need to be specified premium: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ nullable: true satoshis: type: integer maximum: 4000000 minimum: 20000 nullable: true public_duration: type: integer maximum: 86400.0 minimum: 597.6 escrow_duration: type: integer maximum: 28800 minimum: 1800 bond_size: type: string format: decimal pattern: ^-?\d{0,2}(?:\.\d{0,2})?$ bondless_taker: type: boolean default: false description: Whether bondless takers are allowed for this order or not required: - currency - type Nested: type: object properties: id: type: integer readOnly: true currency: allOf: - $ref: '#/components/schemas/CurrencyEnum' minimum: 0 maximum: 32767 exchange_rate: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,4})?$ nullable: true timestamp: type: string format: date-time required: - currency - id NullEnum: enum: - null OrderDetail: type: object properties: id: type: integer readOnly: true status: allOf: - $ref: '#/components/schemas/StatusEnum' minimum: 0 maximum: 32767 created_at: type: string format: date-time expires_at: type: string format: date-time type: allOf: - $ref: '#/components/schemas/TypeEnum' minimum: 0 maximum: 32767 currency: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true has_range: type: boolean min_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true max_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true payment_method: type: string maxLength: 70 is_explicit: type: boolean premium: type: integer description: Premium over the CEX price at the current time satoshis: type: integer maximum: 4000000 minimum: 20000 nullable: true bondless_taker: type: boolean maker: type: integer nullable: true taker: type: integer nullable: true escrow_duration: type: integer maximum: 28800 minimum: 1800 total_secs_exp: type: integer description: Duration of time (in seconds) to expire, according to the current status of order.This is duration of time after `created_at` (in seconds) that the order will automatically expire.This value changes according to which stage the order is in penalty: type: string format: date-time description: Time when the user penalty will expire. Penalty applies when you create orders repeatedly without commiting a bond is_maker: type: boolean description: Whether you are the maker or not is_taker: type: boolean description: Whether you are the taker or not is_participant: type: boolean description: True if you are either a taker or maker, False otherwise maker_status: type: string description: |- Status of the maker: - **'Active'** (seen within last 2 min) - **'Seen Recently'** (seen within last 10 min) - **'Inactive'** (seen more than 10 min ago) Note: When you make a request to this route, your own status get's updated and can be seen by your counterparty taker_status: type: boolean description: True if you are either a taker or maker, False otherwise price_now: type: integer description: Price of the order in the order's currency at the time of request (upto 5 significant digits) premium_percentile: type: integer description: (Only if `is_maker`) Premium percentile of your order compared to other public orders in the same currency currently in the order book num_similar_orders: type: integer description: (Only if `is_maker`) The number of public orders of the same currency currently in the order book tg_enabled: type: boolean description: (Only if `is_maker`) Whether Telegram notification is enabled or not tg_token: type: string description: (Only if `is_maker`) Your telegram bot token required to enable notifications. tg_bot_name: type: string description: (Only if `is_maker`) The Telegram username of the bot is_buyer: type: boolean description: Whether you are a buyer of sats (you will be receiving sats) is_seller: type: boolean description: Whether you are a seller of sats or not (you will be sending sats) maker_nick: type: string description: Nickname (Robot name) of the maker taker_nick: type: string description: Nickname (Robot name) of the taker status_message: type: string description: The current status of the order corresponding to the `status` is_fiat_sent: type: boolean description: Whether or not the fiat amount is sent by the buyer is_disputed: type: boolean description: Whether or not the counterparty raised a dispute ur_nick: type: string description: Your Nick maker_locked: type: boolean description: True if maker bond is locked, False otherwise taker_locked: type: boolean description: True if taker bond is locked, False otherwise escrow_locked: type: boolean description: True if escrow is locked, False otherwise. Escrow is the sats to be sold, held by Robosats until the trade is finised. trade_satoshis: type: integer description: 'Seller sees the amount of sats they need to send. Buyer sees the amount of sats they will receive ' bond_invoice: type: string description: When `status` = `0`, `3`. Bond invoice to be paid bond_satoshis: type: integer description: The bond amount in satoshis escrow_invoice: type: string description: For the seller, the escrow invoice to be held by RoboSats escrow_satoshis: type: integer description: The escrow amount in satoshis invoice_amount: type: integer description: The amount in sats the buyer needs to submit an invoice of to receive the trade amount swap_allowed: type: boolean description: Whether on-chain swap is allowed swap_failure_reason: type: string description: Reason for why on-chain swap is not available suggested_mining_fee_rate: type: integer description: fee in sats/vbyte for the on-chain swap swap_fee_rate: type: number format: double description: in percentage, the swap fee rate the platform charges pending_cancel: type: boolean description: Your counterparty requested for a collaborative cancel when `status` is either `8`, `9` or `10` asked_for_cancel: type: boolean description: You requested for a collaborative cancel `status` is either `8`, `9` or `10` statement_submitted: type: boolean description: True if you have submitted a statement. Available when `status` is `11` retries: type: integer description: Number of times ln node has tried to make the payment to you (only if you are the buyer) next_retry_time: type: string format: date-time description: The next time payment will be retried. Payment is retried every 1 sec failure_reason: type: string description: The reason the payout failed invoice_expired: type: boolean description: True if the payout invoice expired. `invoice_amount` will be re-set and sent which means the user has to submit a new invoice to be payed public_duration: type: integer maximum: 86400.0 minimum: 597.6 bond_size: type: string format: decimal pattern: ^-?\d{0,2}(?:\.\d{0,2})?$ trade_fee_percent: type: integer description: The fee for the trade (fees differ for maker and taker) bond_size_sats: type: integer description: The size of the bond in sats bond_size_percent: type: integer description: same as `bond_size` maker_summary: $ref: '#/components/schemas/Summary' taker_summary: $ref: '#/components/schemas/Summary' platform_summary: $ref: '#/components/schemas/PlatformSummary' expiry_reason: nullable: true minimum: 0 maximum: 32767 oneOf: - $ref: '#/components/schemas/ExpiryReasonEnum' - $ref: '#/components/schemas/NullEnum' expiry_message: type: string description: The reason the order expired (message associated with the `expiry_reason`) num_satoshis: type: integer description: only if status = `14` (Successful Trade) and is_buyer = `true` sent_satoshis: type: integer description: only if status = `14` (Successful Trade) and is_buyer = `true` txid: type: string description: Transaction id of the on-chain swap payout. Only if status = `14` (Successful Trade) and is_buyer = `true` network: type: string description: The network eg. 'testnet', 'mainnet'. Only if status = `14` (Successful Trade) and is_buyer = `true` required: - expires_at - id - platform_summary - type OrderPublic: type: object properties: id: type: integer readOnly: true created_at: type: string format: date-time expires_at: type: string format: date-time type: allOf: - $ref: '#/components/schemas/TypeEnum' minimum: 0 maximum: 32767 currency: type: integer nullable: true amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true has_range: type: boolean min_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true max_amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true payment_method: type: string maxLength: 70 is_explicit: type: boolean premium: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ nullable: true satoshis: type: integer maximum: 4000000 minimum: 20000 nullable: true bondless_taker: type: boolean maker: type: integer nullable: true maker_nick: type: string maker_status: type: string description: Status of the nick - "Active" or "Inactive" price: type: integer description: Price in order's fiat currency escrow_duration: type: integer maximum: 28800 minimum: 1800 required: - expires_at - id - type PatchedStealth: type: object properties: wantsStealth: type: boolean PlatformSummary: type: object properties: contract_timestamp: type: string format: date-time description: Timestamp of when the contract was finalized (price and sats fixed) contract_total_time: type: number format: double description: The time taken for the contract to complete (from taker taking the order to completion of order) in seconds routing_fee_sats: type: integer description: Sats payed by the exchange for routing fees. Mining fee in case of on-chain swap payout trade_revenue_sats: type: integer description: The sats the exchange earned from the trade RatingEnum: enum: - '1' - '2' - '3' - '4' - '5' type: string StatusEnum: enum: - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 type: integer Stealth: type: object properties: wantsStealth: type: boolean required: - wantsStealth Summary: type: object properties: sent_fiat: type: integer description: same as `amount` (only for buyer) received_sats: type: integer description: same as `trade_satoshis` (only for buyer) is_swap: type: boolean description: True if the payout was on-chain (only for buyer) received_onchain_sats: type: integer description: The on-chain sats received (only for buyer and if `is_swap` is `true`) mining_fee_sats: type: integer description: Mining fees paid in satoshis (only for buyer and if `is_swap` is `true`) swap_fee_sats: type: integer description: Exchange swap fee in sats (i.e excluding miner fees) (only for buyer and if `is_swap` is `true`) swap_fee_percent: type: number format: double description: same as `swap_fee_rate` (only for buyer and if `is_swap` is `true` sent_sats: type: integer description: The total sats you sent (only for seller) received_fiat: type: integer description: same as `amount` (only for seller) trade_fee_sats: type: integer description: Exchange fees in sats (Does not include swap fee and miner fee) Tick: type: object properties: timestamp: type: string format: date-time currency: allOf: - $ref: '#/components/schemas/Nested' readOnly: true volume: type: string format: decimal nullable: true price: type: string format: decimal pattern: ^-?\d{0,14}(?:\.\d{0,2})?$ nullable: true premium: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,2})?$ nullable: true fee: type: string format: decimal required: - currency TypeEnum: enum: - 0 - 1 type: integer UpdateOrder: type: object properties: invoice: type: string nullable: true maxLength: 2000 address: type: string nullable: true maxLength: 100 statement: type: string nullable: true maxLength: 10000 action: $ref: '#/components/schemas/ActionEnum' rating: nullable: true oneOf: - $ref: '#/components/schemas/RatingEnum' - $ref: '#/components/schemas/BlankEnum' - $ref: '#/components/schemas/NullEnum' amount: type: string format: decimal pattern: ^-?\d{0,10}(?:\.\d{0,8})?$ nullable: true mining_fee_rate: type: string format: decimal pattern: ^-?\d{0,3}(?:\.\d{0,3})?$ nullable: true required: - action UserGen: type: object properties: token_sha256: type: string description: SHA256 of user secret maxLength: 64 minLength: 64 public_key: type: string description: Armored ASCII PGP public key block maxLength: 2000 encrypted_private_key: type: string description: Armored ASCII PGP encrypted private key block maxLength: 2000 ref_code: type: string nullable: true description: Referal code maxLength: 30 counts: type: array items: type: integer nullable: true description: Counts of the unique characters in the token length: type: integer minimum: 1 nullable: true description: Length of the token unique_values: type: integer minimum: 1 nullable: true description: Number of unique values in the token required: - encrypted_private_key - public_key - token_sha256 securitySchemes: basicAuth: type: http scheme: basic cookieAuth: type: apiKey in: cookie name: sessionid