{
  "openapi": "3.1.1",
  "info": {
    "title": "Coinero Public API",
    "description": "Read-only market data from the Coinero exchange: server time, service status, traded markets and current prices.\n\nEvery request under /v1 requires an API key sent in the `X-COINERO-APIKEY` request header. Keys are created in the Coinero client application.\n\nAmounts are returned as strings to avoid the loss of precision that decimal numbers suffer in languages with binary floating point. Every point in time is returned twice: as an ISO 8601 string in UTC and as milliseconds since the Unix epoch.\n\nbuyPrice and sellPrice are the final client prices at Coinero: what a client pays or receives per unit, including the standard Coinero fee (individual discounts are not reflected) and, for quote currencies Coinero converts internally such as CZK, the currency margin. They match the prices shown in the Coinero client application at the moment of the request; they are not a binding offer, and a trade settles at the price valid when the order is placed. The other price fields (high, low, VWAP, price changes) are exchange statistics without fees. Fees are governed by the public price list.\n\nGuides, rate limits, the error catalogue and code samples are on the developer portal: https://developers.coinero.cz\n\nTerms of use: https://developers.coinero.cz/terms",
    "termsOfService": "https://developers.coinero.cz/terms",
    "contact": {
      "name": "Coinero API support",
      "url": "https://developers.coinero.cz/support",
      "email": "api@coinero.cz"
    },
    "version": "1.0"
  },
  "servers": [
    {
      "url": "https://publicapi.coinero.cz",
      "description": "Production"
    }
  ],
  "paths": {
    "/v1/time": {
      "get": {
        "tags": [
          "System"
        ],
        "summary": "Get the current server time",
        "description": "Returns the current time on the Coinero servers in both shapes this API uses: an ISO 8601 string in UTC and milliseconds since the Unix epoch. Compare it with your own clock before you rely on any timestamp in market data. The response is never cached.",
        "operationId": "getV1Time",
        "responses": {
          "200": {
            "description": "The current server time.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServerTimeResponse"
                },
                "example": {
                  "serverTime": "2026-09-01T12:00:00.000Z",
                  "serverTimeMs": 1788264000000
                }
              }
            }
          },
          "503": {
            "description": "The service is temporarily unavailable. The error code is MARKET_DATA_UNAVAILABLE when the price feed is not delivering data and SERVICE_MAINTENANCE while the API is under planned maintenance, during which GET /v1/status keeps responding and reports the maintenance window. The request itself is fine in both cases, so retry it after the number of seconds in the Retry-After response header.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/service-maintenance",
                  "title": "Service maintenance",
                  "status": 503,
                  "code": "SERVICE_MAINTENANCE",
                  "detail": "The API is temporarily unavailable because of planned maintenance. Retry after the number of seconds given in the Retry-After response header; the /v1/status endpoint keeps responding and reports the maintenance window.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "401": {
            "description": "The API key is missing or is not valid. The error code is MISSING_API_KEY when the X-COINERO-APIKEY header is absent and INVALID_API_KEY when the key cannot be used.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/missing-api-key",
                  "title": "Missing API key",
                  "status": 401,
                  "code": "MISSING_API_KEY",
                  "detail": "This endpoint requires an API key. Send it in the X-COINERO-APIKEY request header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit of the API key or of the client address has been exceeded. The error code is RATE_LIMIT_EXCEEDED. Wait for the number of seconds in the Retry-After response header before sending another request.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/rate-limit-exceeded",
                  "title": "Rate limit exceeded",
                  "status": 429,
                  "code": "RATE_LIMIT_EXCEEDED",
                  "detail": "Too many requests for this API key. Slow down and retry after the number of seconds given in the Retry-After response header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ]
      }
    },
    "/v1/status": {
      "get": {
        "tags": [
          "System"
        ],
        "summary": "Get the service status",
        "description": "Reports the health of the API and of the market data feed behind it. This is the one endpoint that keeps answering normally while the rest of the API is degraded or under announced maintenance, so poll it when other endpoints start failing. The lastUpdatedAt field is the age of the market data; the further it is behind serverTime, the staler the prices. The response is never cached.",
        "operationId": "getV1Status",
        "responses": {
          "200": {
            "description": "The current status of the API and of the market data feed.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceStatusResponse"
                },
                "example": {
                  "status": "operational",
                  "api": "operational",
                  "components": {
                    "ticker": "operational"
                  },
                  "maintenance": null,
                  "lastUpdatedAt": "2026-09-01T11:59:50.000Z",
                  "lastUpdatedAtMs": 1788263990000,
                  "serverTime": "2026-09-01T12:00:00.000Z",
                  "serverTimeMs": 1788264000000
                }
              }
            }
          },
          "401": {
            "description": "The API key is missing or is not valid. The error code is MISSING_API_KEY when the X-COINERO-APIKEY header is absent and INVALID_API_KEY when the key cannot be used.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/missing-api-key",
                  "title": "Missing API key",
                  "status": 401,
                  "code": "MISSING_API_KEY",
                  "detail": "This endpoint requires an API key. Send it in the X-COINERO-APIKEY request header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit of the API key or of the client address has been exceeded. The error code is RATE_LIMIT_EXCEEDED. Wait for the number of seconds in the Retry-After response header before sending another request.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/rate-limit-exceeded",
                  "title": "Rate limit exceeded",
                  "status": 429,
                  "code": "RATE_LIMIT_EXCEEDED",
                  "detail": "Too many requests for this API key. Slow down and retry after the number of seconds given in the Retry-After response header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ]
      }
    },
    "/v1/markets": {
      "get": {
        "tags": [
          "Market data"
        ],
        "summary": "List the markets",
        "description": "Returns every market a client can trade in the Coinero application, including markets quoted in CZK that Coinero executes through EUR, with the precisions, tick size and order minimums needed to build an order and to round displayed values. Markets change rarely, so polling once an hour is enough. A market that stops trading stays in this list with the status delisted for 30 days before it disappears.",
        "operationId": "getV1Markets",
        "responses": {
          "200": {
            "description": "The markets Coinero offers.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/MarketsResponse"
                },
                "example": {
                  "markets": [
                    {
                      "symbol": "BTCEUR",
                      "base": "BTC",
                      "quote": "EUR",
                      "status": "trading",
                      "pricePrecision": 2,
                      "amountPrecision": 8,
                      "tickSize": "0.01",
                      "minOrderSize": "0.00005000",
                      "minOrderValue": "10.00"
                    },
                    {
                      "symbol": "ETHEUR",
                      "base": "ETH",
                      "quote": "EUR",
                      "status": "trading",
                      "pricePrecision": 2,
                      "amountPrecision": 8,
                      "tickSize": "0.01",
                      "minOrderSize": "0.00300000"
                    },
                    {
                      "symbol": "BTCCZK",
                      "base": "BTC",
                      "quote": "CZK",
                      "status": "trading",
                      "pricePrecision": 2,
                      "amountPrecision": 8,
                      "tickSize": "0.01",
                      "minOrderSize": "0.00005000"
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "The service is temporarily unavailable. The error code is MARKET_DATA_UNAVAILABLE when the price feed is not delivering data and SERVICE_MAINTENANCE while the API is under planned maintenance, during which GET /v1/status keeps responding and reports the maintenance window. The request itself is fine in both cases, so retry it after the number of seconds in the Retry-After response header.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/service-maintenance",
                  "title": "Service maintenance",
                  "status": 503,
                  "code": "SERVICE_MAINTENANCE",
                  "detail": "The API is temporarily unavailable because of planned maintenance. Retry after the number of seconds given in the Retry-After response header; the /v1/status endpoint keeps responding and reports the maintenance window.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "401": {
            "description": "The API key is missing or is not valid. The error code is MISSING_API_KEY when the X-COINERO-APIKEY header is absent and INVALID_API_KEY when the key cannot be used.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/missing-api-key",
                  "title": "Missing API key",
                  "status": 401,
                  "code": "MISSING_API_KEY",
                  "detail": "This endpoint requires an API key. Send it in the X-COINERO-APIKEY request header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit of the API key or of the client address has been exceeded. The error code is RATE_LIMIT_EXCEEDED. Wait for the number of seconds in the Retry-After response header before sending another request.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/rate-limit-exceeded",
                  "title": "Rate limit exceeded",
                  "status": 429,
                  "code": "RATE_LIMIT_EXCEEDED",
                  "detail": "Too many requests for this API key. Slow down and retry after the number of seconds given in the Retry-After response header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ]
      }
    },
    "/v1/ticker": {
      "get": {
        "tags": [
          "Market data"
        ],
        "summary": "Get the current client prices of one market",
        "description": "Returns the price a client buys and sells at right now, plus the 24 hour range and volume of a single market. buyPrice and sellPrice are the final client prices at Coinero: what a client pays or receives per unit, including the standard Coinero fee (individual discounts are not reflected) and, for quote currencies Coinero converts internally such as CZK, the currency margin. They match the prices shown in the Coinero client application at the moment of the request; they are not a binding offer, and a trade settles at the price valid when the order is placed. The other price fields (high, low, VWAP, price changes) are exchange statistics without fees. Fees are governed by the public price list. This API serves the latest ticker it has, even when the feed is lagging, so check the timestamp field before you rely on the price. GET /v1/status reports the ticker component as outage once the feed falls more than 5 minutes behind, and as degraded while data is served over a fallback path. A symbol Coinero does not trade, whether it was never listed or has already been delisted, is answered with 404 and the error code UNKNOWN_SYMBOL; a traded symbol that has no ticker right now, or a CZK market while the CZK/EUR rate is temporarily unavailable, is answered with 503 and the error code MARKET_DATA_UNAVAILABLE, so retry it.",
        "operationId": "getV1Ticker",
        "parameters": [
          {
            "name": "symbol",
            "in": "query",
            "description": "Market symbol, the base and the quote currency joined without a separator, for example BTCEUR. Case insensitive. This endpoint serves the markets listed by GET /v1/markets whose status is not delisted; a delisted symbol is answered with 404 and the error code UNKNOWN_SYMBOL, the same as a symbol Coinero never listed.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "The current client prices of the requested market.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TickerResponse"
                },
                "example": {
                  "symbol": "BTCEUR",
                  "base": "BTC",
                  "quote": "EUR",
                  "buyPrice": "99418.84",
                  "sellPrice": "97445.70",
                  "high24h": "99120.00",
                  "low24h": "97010.00",
                  "volume24h": "128.34567890",
                  "vwap24h": "98301.44",
                  "priceChangePercent1h": "0.21",
                  "priceChangePercent24h": "1.84",
                  "priceChangePercent7d": "-3.02",
                  "timestamp": "2026-09-01T11:59:50.000Z",
                  "timestampMs": 1788263990000
                }
              }
            }
          },
          "400": {
            "description": "A request parameter is missing, malformed, or out of range. The error code is INVALID_PARAMETER and the detail names the parameters at fault.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/invalid-parameter",
                  "title": "Invalid parameter",
                  "status": 400,
                  "code": "INVALID_PARAMETER",
                  "detail": "This request parameter is missing, malformed, or out of range: symbol. Check the request against the API reference at https://developers.coinero.cz.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "404": {
            "description": "The requested resource does not exist. The error code is UNKNOWN_SYMBOL when Coinero does not trade the symbol, whether it was never listed or has already been delisted, and NOT_FOUND when the path or the resource behind it does not exist. Retrying the same request will not help; read the symbols this API serves from GET /v1/markets.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/unknown-symbol",
                  "title": "Unknown symbol",
                  "status": 404,
                  "code": "UNKNOWN_SYMBOL",
                  "detail": "The requested symbol is not listed on Coinero. The symbols this API serves are listed in the API reference at https://developers.coinero.cz.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "503": {
            "description": "The service is temporarily unavailable. The error code is MARKET_DATA_UNAVAILABLE when the price feed is not delivering data and SERVICE_MAINTENANCE while the API is under planned maintenance, during which GET /v1/status keeps responding and reports the maintenance window. The request itself is fine in both cases, so retry it after the number of seconds in the Retry-After response header.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/service-maintenance",
                  "title": "Service maintenance",
                  "status": 503,
                  "code": "SERVICE_MAINTENANCE",
                  "detail": "The API is temporarily unavailable because of planned maintenance. Retry after the number of seconds given in the Retry-After response header; the /v1/status endpoint keeps responding and reports the maintenance window.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "401": {
            "description": "The API key is missing or is not valid. The error code is MISSING_API_KEY when the X-COINERO-APIKEY header is absent and INVALID_API_KEY when the key cannot be used.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/missing-api-key",
                  "title": "Missing API key",
                  "status": 401,
                  "code": "MISSING_API_KEY",
                  "detail": "This endpoint requires an API key. Send it in the X-COINERO-APIKEY request header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit of the API key or of the client address has been exceeded. The error code is RATE_LIMIT_EXCEEDED. Wait for the number of seconds in the Retry-After response header before sending another request.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/rate-limit-exceeded",
                  "title": "Rate limit exceeded",
                  "status": 429,
                  "code": "RATE_LIMIT_EXCEEDED",
                  "detail": "Too many requests for this API key. Slow down and retry after the number of seconds given in the Retry-After response header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ]
      }
    },
    "/v1/tickers": {
      "get": {
        "tags": [
          "Market data"
        ],
        "summary": "Get the current client prices of every market",
        "description": "Returns the same data as GET /v1/ticker for all markets at once. This is the recommended way to follow prices: one request per interval instead of one request per market. buyPrice and sellPrice are the final client prices at Coinero: what a client pays or receives per unit, including the standard Coinero fee (individual discounts are not reflected) and, for quote currencies Coinero converts internally such as CZK, the currency margin. They match the prices shown in the Coinero client application at the moment of the request; they are not a binding offer, and a trade settles at the price valid when the order is placed. The other price fields (high, low, VWAP, price changes) are exchange statistics without fees. Fees are governed by the public price list. This API serves the latest ticker it has, even when the feed is lagging, so check the timestamp field before you rely on the price. GET /v1/status reports the ticker component as outage once the feed falls more than 5 minutes behind, and as degraded while data is served over a fallback path. The list only covers traded markets, so it can be shorter than the one from GET /v1/markets. A market is missing for one of two reasons: it has been delisted, in which case it never comes back, or it is traded but its price cannot be computed at this moment (no ticker, or no CZK/EUR rate), in which case it returns once the data is back. Read the status field in GET /v1/markets to tell the two apart.",
        "operationId": "getV1Tickers",
        "responses": {
          "200": {
            "description": "The current client prices of every market that has a price.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TickersResponse"
                },
                "example": {
                  "tickers": [
                    {
                      "symbol": "BTCEUR",
                      "base": "BTC",
                      "quote": "EUR",
                      "buyPrice": "99418.84",
                      "sellPrice": "97445.70",
                      "high24h": "99120.00",
                      "low24h": "97010.00",
                      "volume24h": "128.34567890",
                      "vwap24h": "98301.44",
                      "priceChangePercent1h": "0.21",
                      "priceChangePercent24h": "1.84",
                      "priceChangePercent7d": "-3.02",
                      "timestamp": "2026-09-01T11:59:50.000Z",
                      "timestampMs": 1788263990000
                    },
                    {
                      "symbol": "BTCCZK",
                      "base": "BTC",
                      "quote": "CZK",
                      "buyPrice": "2510123.45",
                      "sellPrice": "2411870.90",
                      "high24h": "2478000.00",
                      "low24h": "2425250.00",
                      "volume24h": "128.34567890",
                      "timestamp": "2026-09-01T11:59:50.000Z",
                      "timestampMs": 1788263990000
                    }
                  ]
                }
              }
            }
          },
          "503": {
            "description": "The service is temporarily unavailable. The error code is MARKET_DATA_UNAVAILABLE when the price feed is not delivering data and SERVICE_MAINTENANCE while the API is under planned maintenance, during which GET /v1/status keeps responding and reports the maintenance window. The request itself is fine in both cases, so retry it after the number of seconds in the Retry-After response header.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/service-maintenance",
                  "title": "Service maintenance",
                  "status": 503,
                  "code": "SERVICE_MAINTENANCE",
                  "detail": "The API is temporarily unavailable because of planned maintenance. Retry after the number of seconds given in the Retry-After response header; the /v1/status endpoint keeps responding and reports the maintenance window.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "401": {
            "description": "The API key is missing or is not valid. The error code is MISSING_API_KEY when the X-COINERO-APIKEY header is absent and INVALID_API_KEY when the key cannot be used.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/missing-api-key",
                  "title": "Missing API key",
                  "status": 401,
                  "code": "MISSING_API_KEY",
                  "detail": "This endpoint requires an API key. Send it in the X-COINERO-APIKEY request header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          },
          "429": {
            "description": "The rate limit of the API key or of the client address has been exceeded. The error code is RATE_LIMIT_EXCEEDED. Wait for the number of seconds in the Retry-After response header before sending another request.",
            "headers": {
              "Retry-After": {
                "description": "Number of seconds to wait before sending another request.",
                "schema": {
                  "type": "integer",
                  "format": "int32"
                }
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "type": "https://developers.coinero.cz/errors/rate-limit-exceeded",
                  "title": "Rate limit exceeded",
                  "status": 429,
                  "code": "RATE_LIMIT_EXCEEDED",
                  "detail": "Too many requests for this API key. Slow down and retry after the number of seconds given in the Retry-After response header.",
                  "requestId": "0HN7GK4L2M9PQ"
                }
              }
            }
          }
        },
        "security": [
          {
            "ApiKeyAuth": [ ]
          }
        ]
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "required": [
          "type",
          "title",
          "status",
          "code",
          "detail",
          "requestId"
        ],
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Absolute URI of the error description on the developer portal."
          },
          "title": {
            "type": "string",
            "description": "Short, human readable summary of the error. Stable for a given code."
          },
          "status": {
            "type": "integer",
            "description": "HTTP status code of the response.",
            "format": "int32"
          },
          "code": {
            "type": "string",
            "description": "Machine readable error code, for example INVALID_API_KEY. Decide on this field, not on the message texts."
          },
          "detail": {
            "type": "string",
            "description": "Human readable explanation of this particular occurrence."
          },
          "requestId": {
            "type": "string",
            "description": "Identifier of the request. The same value is in the X-Request-Id response header; quote it when contacting support."
          }
        },
        "additionalProperties": false,
        "description": "Error response in the RFC 9457 format, extended with the machine readable code and the request identifier."
      },
      "MaintenanceWindowResponse": {
        "required": [
          "from",
          "fromMs",
          "to",
          "toMs",
          "description"
        ],
        "type": "object",
        "properties": {
          "from": {
            "type": "string",
            "description": "Start of the maintenance window, ISO 8601 in UTC."
          },
          "fromMs": {
            "type": "integer",
            "description": "The same instant in milliseconds since the Unix epoch.",
            "format": "int64"
          },
          "to": {
            "type": "string",
            "description": "Expected end of the maintenance window, ISO 8601 in UTC."
          },
          "toMs": {
            "type": "integer",
            "description": "The same instant in milliseconds since the Unix epoch.",
            "format": "int64"
          },
          "description": {
            "type": "string",
            "description": "What the maintenance is about, in English."
          }
        }
      },
      "MarketResponse": {
        "required": [
          "symbol",
          "base",
          "quote",
          "status",
          "pricePrecision",
          "amountPrecision",
          "tickSize",
          "minOrderSize"
        ],
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Market symbol, the base and the quote currency joined without a separator, for example BTCEUR."
          },
          "base": {
            "type": "string",
            "description": "Currency code of the base currency, for example BTC."
          },
          "quote": {
            "type": "string",
            "description": "Currency code of the quote currency, for example EUR or CZK. CZK markets are quoted in CZK by Coinero and executed on the exchange through EUR; the conversion is already part of the prices GET /v1/ticker returns."
          },
          "status": {
            "description": "Trading state of the market.",
            "$ref": "#/components/schemas/PublicMarketStatus"
          },
          "pricePrecision": {
            "type": "integer",
            "description": "Number of decimal places every price of this market is rounded to.",
            "format": "int32"
          },
          "amountPrecision": {
            "type": "integer",
            "description": "Number of decimal places every amount of the base currency is rounded to.",
            "format": "int32"
          },
          "tickSize": {
            "type": "string",
            "description": "Smallest price step of this market, as a decimal string in the quote currency. For internally converted quote currencies derived from pricePrecision."
          },
          "minOrderSize": {
            "type": "string",
            "description": "Smallest order size, as a decimal string in the base currency."
          },
          "minOrderValue": {
            "type": "string",
            "description": "Smallest order value, as a decimal string in the quote currency. Omitted when the market has no such minimum and for internally converted quote currencies, where it would depend on the exchange rate."
          }
        }
      },
      "MarketsResponse": {
        "required": [
          "markets"
        ],
        "type": "object",
        "properties": {
          "markets": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/MarketResponse"
            },
            "description": "The markets Coinero offers, ordered by symbol."
          }
        }
      },
      "PublicMarketStatus": {
        "enum": [
          "trading",
          "paused",
          "delisted"
        ],
        "type": "string",
        "description": "Trading state of a market. `trading` means orders can be placed. `paused` means the market is still offered but trading on it is switched off, which can end without notice. `delisted` means trading has ended for good; the market stays in the list for 30 days and then disappears. This is a closed set today, but new values can be added within v1 as a backward compatible change. Treat a value you do not know as unrecognized instead of failing."
      },
      "PublicServiceStatus": {
        "enum": [
          "operational",
          "degraded",
          "outage",
          "maintenance"
        ],
        "type": "string",
        "description": "Health of a service or of one of its components. `operational` means everything works. `degraded` means it works but worse, for example data arriving over a fallback path instead of the live feed. `outage` means the data is not arriving at all or is too old to rely on. `maintenance` means an announced maintenance window. This is a closed set today, but new values can be added within v1 as a backward compatible change. Treat a value you do not know as unrecognized instead of failing."
      },
      "ServerTimeResponse": {
        "required": [
          "serverTime",
          "serverTimeMs"
        ],
        "type": "object",
        "properties": {
          "serverTime": {
            "type": "string",
            "description": "Current server time, ISO 8601 in UTC with milliseconds."
          },
          "serverTimeMs": {
            "type": "integer",
            "description": "The same instant in milliseconds since the Unix epoch.",
            "format": "int64"
          }
        }
      },
      "ServiceComponentsResponse": {
        "required": [
          "ticker"
        ],
        "type": "object",
        "properties": {
          "ticker": {
            "description": "Status of the market data feed the price endpoints read from.",
            "$ref": "#/components/schemas/PublicServiceStatus"
          }
        }
      },
      "ServiceStatusResponse": {
        "required": [
          "status",
          "api",
          "components",
          "serverTime",
          "serverTimeMs",
          "maintenance",
          "lastUpdatedAt",
          "lastUpdatedAtMs"
        ],
        "type": "object",
        "properties": {
          "status": {
            "description": "Overall status: maintenance whenever an announced maintenance window is running, otherwise the worst of the API status and the component statuses.",
            "$ref": "#/components/schemas/PublicServiceStatus"
          },
          "api": {
            "description": "Status of the API itself: operational, or maintenance during an announced window.",
            "$ref": "#/components/schemas/PublicServiceStatus"
          },
          "components": {
            "description": "Status of the individual parts the API depends on.",
            "$ref": "#/components/schemas/ServiceComponentsResponse"
          },
          "maintenance": {
            "oneOf": [
              {
                "type": "null"
              },
              {
                "$ref": "#/components/schemas/MaintenanceWindowResponse"
              }
            ],
            "description": "The announced maintenance window, or null when no maintenance is announced. This field is always present in the response."
          },
          "lastUpdatedAt": {
            "type": [
              "null",
              "string"
            ],
            "description": "When the market data feed was last updated, ISO 8601 in UTC, or null when no feed status is available at all. Compare it with serverTime to judge how stale the prices are. This field is always present in the response."
          },
          "lastUpdatedAtMs": {
            "type": [
              "null",
              "integer"
            ],
            "description": "The same instant in milliseconds since the Unix epoch, or null.",
            "format": "int64"
          },
          "serverTime": {
            "type": "string",
            "description": "Current server time, ISO 8601 in UTC with milliseconds."
          },
          "serverTimeMs": {
            "type": "integer",
            "description": "The same instant in milliseconds since the Unix epoch.",
            "format": "int64"
          }
        }
      },
      "TickerResponse": {
        "required": [
          "symbol",
          "base",
          "quote",
          "buyPrice",
          "sellPrice",
          "high24h",
          "low24h",
          "volume24h",
          "timestamp",
          "timestampMs"
        ],
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Market symbol, the base and the quote currency joined without a separator, for example BTCEUR."
          },
          "base": {
            "type": "string",
            "description": "Currency code of the base currency, for example BTC."
          },
          "quote": {
            "type": "string",
            "description": "Currency code of the quote currency, for example EUR."
          },
          "buyPrice": {
            "type": "string",
            "description": "Final price per unit of the base currency a client pays when buying on Coinero right now, including the Coinero fee and, for quote currencies Coinero converts internally such as CZK, the currency margin. As a decimal string in the quote currency. The same value the Coinero client application shows as the buy price."
          },
          "sellPrice": {
            "type": "string",
            "description": "Final price per unit of the base currency a client receives when selling on Coinero right now, including the Coinero fee and, for internally converted quote currencies, the currency margin. As a decimal string in the quote currency."
          },
          "high24h": {
            "type": "string",
            "description": "Highest exchange price of the last 24 hours, without fees, as a decimal string in the quote currency. For internally converted quote currencies converted at the mid market rate."
          },
          "low24h": {
            "type": "string",
            "description": "Lowest exchange price of the last 24 hours, without fees, as a decimal string in the quote currency. For internally converted quote currencies converted at the mid market rate."
          },
          "volume24h": {
            "type": "string",
            "description": "Exchange volume of the last 24 hours, as a decimal string in the base currency."
          },
          "vwap24h": {
            "type": "string",
            "description": "Volume weighted average exchange price of the last 24 hours, without fees, as a decimal string in the quote currency. Omitted when the feed does not provide it."
          },
          "priceChangePercent1h": {
            "type": "string",
            "description": "Price change over the last hour in percent, as a decimal string: \"0.21\" means 0.21 percent, not 21 percent. Omitted when the feed does not provide it."
          },
          "priceChangePercent24h": {
            "type": "string",
            "description": "Price change over the last 24 hours in percent, as a decimal string. Omitted when the feed does not provide it."
          },
          "priceChangePercent7d": {
            "type": "string",
            "description": "Price change over the last 7 days in percent, as a decimal string. Omitted when the feed does not provide it."
          },
          "timestamp": {
            "type": "string",
            "description": "When this ticker was captured, ISO 8601 in UTC with milliseconds."
          },
          "timestampMs": {
            "type": "integer",
            "description": "The same instant in milliseconds since the Unix epoch.",
            "format": "int64"
          }
        }
      },
      "TickersResponse": {
        "required": [
          "tickers"
        ],
        "type": "object",
        "properties": {
          "tickers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/TickerResponse"
            },
            "description": "One entry per traded market that currently has a ticker. Delisted markets are never included and a traded market without a ticker is left out until its ticker returns, so this list can be shorter than the one from GET /v1/markets."
          }
        }
      }
    },
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "description": "API key issued in the Coinero client application. Send the key verbatim, without a scheme prefix. Requests without a valid key are rejected with 401 and the error code MISSING_API_KEY or INVALID_API_KEY.",
        "name": "X-COINERO-APIKEY",
        "in": "header"
      }
    }
  },
  "tags": [
    {
      "name": "System",
      "description": "Server time and service health. Call these before you trust a timestamp or when the other endpoints start failing."
    },
    {
      "name": "Market data",
      "description": "Markets a client can trade on Coinero and their current client prices. buyPrice and sellPrice are the final client prices at Coinero: what a client pays or receives per unit, including the standard Coinero fee (individual discounts are not reflected) and, for quote currencies Coinero converts internally such as CZK, the currency margin. They match the prices shown in the Coinero client application at the moment of the request; they are not a binding offer, and a trade settles at the price valid when the order is placed. The other price fields (high, low, VWAP, price changes) are exchange statistics without fees. Fees are governed by the public price list."
    }
  ]
}