API

A FlowBTC possui as mais avançadas API’s do mercado. Com elas você pode incluir informações em tempo real do mercado de Bitcoin em seu blog ou site. Para usuários com conhecimento de programação, também é possível integrações mais avançadas com seu site, apps e até robô de trading.

REST

Informações básicas da nossa api REST pública.

Requisição

URL: https://publicapi.flowbtc.com.br/v1/

Resposta

Um objeto contento as seguintes propriedades: 

status: Se a requisição obteve sucesso ou falha 
data: as informações que foram obtidas em caso de sucesso 
message: um texto com informações adicionais em caso de erro.Exemplo: 

{
  "status": "success",
  "data": {
    "product": "BTCBRL",
    "bestOffer": 30000
  },
  "message": "mensagem"
}

Book

Obtenha dados do book.

Requisição

URL: https://publicapi.flowbtc.com.br/v1/book/{produto} 

Possíveis produtos: BTCBRL, ETHBRL, ETHBTC, LTCBRL, BCHBRL e XRPBRL 
Exemplo: https://publicapi.flowbtc.com.br/v1/book/BTCBRL 

Possíveis parâmetros de query:

depth: até que profundidade do book deseja ir. Valor padrão é 10. 

Exemplo: https://publicapi.flowbtc.com.br/v1/book/BTCBRL?depth=5

Resposta

Um objeto com um array de bids e asks com as seguintes propriedades: 

Accounts: Quantidade de contas com ordem a esse preço; 
ActionDateTime: Timestamp em que occoreu a ordem; 
LastTradePrice: Preço do último trade; 
Orders: Número de ordens a esse preço; 
Price: Preço; 
Quantity: Quantidade a esse preço; 
Exemplo: 

{
  "status": "success",
  "data": {
    "bids": [
      {
        "Accounts": 1,
        "ActionDateTime": 1534795656358,
        "LastTradePrice": 26160.55,
        "Orders": 1,
        "Price": 25941.84,
        "Quantity": 0.05
      },
      {
        "Accounts": 1,
        "ActionDateTime": 1534795656358,
        "LastTradePrice": 26160.55,
        "Orders": 1,
        "Price": 25941.44,
        "Quantity": 0.00291455
      }
    ],
    "asks": [
      {
        "Accounts": 1,
        "ActionDateTime": 1534795650483,
        "LastTradePrice": 26160.55,
        "Orders": 1,
        "Price": 26181.66,
        "Quantity": 0.15
      },
      {
        "Accounts": 1,
        "ActionDateTime": 1534795508334,
        "LastTradePrice": 26100,
        "Orders": 1,
        "Price": 26300,
        "Quantity": 0.04327948
      }
    ]
  },
  "message": null
}

Ticker

Obtenha dados do ticker.

Requisição

URL: https://publicapi.flowbtc.com.br/v1/ticker/{produto} 

Possíveis produtos: BTCBRL, ETHBRL, ETHBTC, LTCBRL, BCHBRL e XRPBRL 
Exemplo: https://publicapi.flowbtc.com.br/v1/ticker/BTCBRL 

Resposta

Um array contento objetos com as seguintes propriedades: 

BestBid: Melhor oferta de compra; 
BestOffer: Melhor oferta de venda; 
LastTradedPx: Preço do último trade; 
LastTradedQty: Quantidade do último trade; 
LastTradeTime: Timestamp do último trade; 
SessionOpen: Preço de abertura (Últimas 24h); 
SessionHigh: Preço máximo (Últimas 24h); 
SessionClose: Preço de fechamento (Últimas 24h); 
Volume: Volume de trades; 
CurrentDayVolume: Volume do dia; 
CurrentDayNumTrades: Número de trades no dia; 
CurrentDayPxChange: Variação de preço no dia; 
Rolling24HrVolume: Volume nas últimas 24h; 
Rolling24HrNumTrades: Número de trade nas últimas 24h; 
Rolling24HrPxChange: Variação de preço nas últimas 24h; 

Exemplo: 

{
  "status": "success",
  "data": {
    "BestBid": 24280.08,
    "BestOffer": 24518.21,
    "LastTradedPx": 24380.1,
    "LastTradedQty": 0.01,
    "SessionOpen": 25786.16,
    "SessionHigh": 27100,
    "SessionLow": 24380.1,
    "SessionClose": 25590,
    "Volume": 0.01,
    "CurrentDayVolume": 0.75388947,
    "CurrentDayNumTrades": 37,
    "CurrentDayPxChange": -1209.9,
    "Rolling24HrVolume": 0.83041127,
    "Rolling24HrPxChange": -4.874442973476934
  },
  "message": null
}

WebSocket

Link para a conexão:

wss://api.flowbtc.com.br/WSGateway/

Frame da Mensagem

Descreve o tipo de chamada à qual a mensagem está relacionada. Os valores válidos são:

{
  "m": 0,
  "i": 0,
  "n": "function",
  "o": "payload"
}

m: Tipo da Mensagem

Todas as Chamadas e Respostas do WebSocket são incorporadas em um objeto JSON formatado em string contendo as informações relevantes sobre a chamada ou resposta, bem como o payload.

0 = Request
1 = Reply
2 = Subscribe To Event
3 = Event
4 = Unsubscribe from Event
5 = Error

i: Número Sequencial

Este é o número sequencial da mensagem. O número sequencial do lado do cliente deve ser sempre um número par, de modo que sua variável de número de sequência sempre deve ser incrementada em 2. Todas as mensagens conterão um número de sequência original (tipos de mensagem 0, 2, 3, 4) ou conterá o ID da mensagem de solicitação na qual a mensagem está em resposta (tipos de mensagem 1, 5).

i += 2 (tipos da mensagem 0, 2, 3, 4)

n: Nome da Função

Este é o nome da função remota na qual a mensagem é uma solicitação ou uma resposta. Por exemplo, se você deseja fazer uma chamada para uma função, a solicitação deve conter seu nome neste campo. A resposta também retornará o nome neste campo.

n: "WebAuthenticateUser"

o: Corpo da Requisição (Payload)

Este é um JSON que deve ser formatado em string que contém os dados que estão sendo enviados com a mensagem, como parâmetros em uma solicitação ou como os dados em uma resposta a uma solicitação.

{
  "UserName": "usuário",
  "Password": "senha"
}

Como usar o frame

Ao enviar uma solicitação para nossa API usando javascript, deve-se formatar tanto o payload quanto o frame para string. Uma chamada seria da seguinte forma:

var frame =
{
  "m": 0,
  "i": 0,
  "n": "function name",
  "o": ""
}

var requestPayload =
{
  "Parameter1": "Value",
  "Parameter2": 0
}

frame.o = json.Stringify(requestPayload);
WS.Send(json.Stringify(frame));

Ao receber um frame da nossa API, use-o para determinar o contexto e, em seguida, converta o conteúdo para JSON:

var frame = json.Parse(wsMessage);

if (frame.i == 1) {
   //This is a Reply
   if (frame.n == "WebAuthenticateUser") {
       var LoginReply = json.Parse(frame.o);
       if (LoginReply.Authenticated) {
           var user = LoginReply.User;
       }
   }
}

Padrões de retorno da API

Respostas com payloads sem dados ou erros comuns seguirão o seguinte padrão:

// Chamada bem-sucedida sem objeto de retorno
{
  "result": true,
  "errormsg": null,
  "errorcode": 0,
  "detail": null
}

// Chamada sem sucesso devido a falta de autorização
{
  "result": false,
  "errormsg": "Not Authorized",
  "errorcode": 20,
  "detail": null
}

// Chamada sem sucesso devido a parâmetros de solicitação inválidos
{
  "result": false,
  "errormsg": "Invalid Request",
  "errorcode": 100,
  "detail": null
}

// Chamada sem sucesso devido a falha na operação
{
  "result": false,
  "errormsg": "Operation Failed",
  "errorcode": 101,
  "detail": null
}

// Chamada sem sucesso devido a uma falha inesperada no servidor
{
  "result": false,
  "errormsg": "Server Error",
  "errorcode": 102,
  "detail": null
}

// Chamada sem sucesso devido a falta de algum recurso (id do usuário não encontrado, etc)
{
  "result": false,
  "errormsg": "Resource Not Found",
  "errorcode": 104,
  "detail": null
}

WebAuthenticateUser

Nessesário para usar qualquer uma das chamadas autenticadas.

Requisição

{
  "UserName": "usuário",
  "Password": "senha"
}

Resposta

{
  "Authenticated": true,
  "SessionToken": "7d0ccf3a-ae63-44f5-a409-2301d80228bc",
  "UserId": 1
}

SubscribeAccountEvents

Conecte-se aos eventos da conta, como pedidos, negociações, depósitos e retiradas. É altamente recomendável que você use essa conexão para rastrear os estados dos seus pedidos.

Requisição

{
  "AccountId": 1,
  "OMSId": 1
}

Resposta

{
  "result": true
}

SubscribeTrades

Recupera os recentes de trades e conecta o usuário as atualizações do instrumento especificado.

Requisição

{
  "OMSId": 1,
  "Symbol ou InstrumentId": "BTCUSD ou 1",
  "IncludeLastCount": 100
}

Resposta

"[\n  [\n    87,\n    1,\n    0.01,\n    450.98,\n    9222816249026513000,\n    9222816249026513000,\n    635872032000000000,\n    0,\n    1\n  ]\n]\n\nValores do Array de resposta:\n\n[0] Trade Number [64 bit Integer]\n\n[1] InstrumentId [Integer]\n\n[2] Quantity [Decimal]\n\n[3] Price [Decimal]\n\n[4] Order1Id [Integer]\n\n[5] Order2Id [Integer]\n\n[6] Timestamp\n\n[7] Direction [Integer] 0=NoChange 1=Uptick 2=Downtick\n\n[8] TakerSide [Integer] Side of trade representing the Taker"

UnsubscribeTrades

Desconecta o usuário do feed do mercado.

Requisição

{
  "OMSId": 1,
  "Symbol ou InstrumentId": "BTCUSD ou 1"
}

Resposta

{
  "result": true
}

SubscribeTicker

Obtenha dados de ticker para preencher um gráfico e assinar futuros ticks. "Interval" especifica com que frequência obter atualizações e "IncludeLastCount" limita o número de registros no histórico.

Requisição

{
  "OMSId": 1,
  "InstrumentId": 1,
  "Interval": "60",
  "IncludeLastCount": 1000
}

Resposta

"[\n  [\n    1468896617000,\n    680,\n    680,\n    680,\n    680,\n    0.4,\n    674.18,\n    680\n  ]\n]\n\nValores do Array de resposta:\n\n[0] Timestamp\n\n[1] HighPrice [Decimal]\n\n[2] LowPrice [Decimal]\n\n[3] OpenPrice [Decimal]\n\n[4] ClosePrice [Decimal]\n\n[5] Volume [Decimal]\n\n[6] Bid [Decimal]\n\n[7] Ask [Decimal]"

UnsubscribeTicker

Desconecta o usuário do feed de ticks.

Requisição

{
  "OMSId": 1,
  "InstrumentId": 1
}

Resposta

{
  "result": true,
  "errormsg": null,
  "errorcode": 0,
  "detail": null
}

Authenticate2FA

2º passo no processo de autenticação do Google 2FA. O endpoint só é disponibilizado para a sessão após a ativação de EnableGoogle2FA e o fornecimento do GoogleQRCode a partir dessa resposta.

Requisição

{
  "Code": "YourCode"
}

Resposta

{
  "Authenticated": true,
  "SessionToken": "7d0ccf3a-ae63-44f5-a409-2301d80228bc"
}

LogOut

Cancela a tentativa de autenticação 2FA pendente.

Requisição

{}

Resposta

{
  "result": true,
  "errormsg": null,
  "errorcode": 0,
  "detail": null
}

GetTickerHistory

Obter dados de ticker para preencher um gráfico.

Requisição

{
  "OMSId": 1,
  "InstrumentId": 1,
  "FromDate": "2016-07-18",
  "ToDate": "2016-07-21",
  "Interval": "60"
}

Resposta

"[\n  [\n    1468896617000,\n    680,\n    680,\n    680,\n    680,\n    0.4,\n    674.18,\n    680\n  ]\n]\n\nValores do Array de resposta:\n\n[0] Timestamp\n\n[1] HighPrice [Decimal]\n\n[2] LowPrice [Decimal]\n\n[3] OpenPrice [Decimal]\n\n[4] ClosePrice [Decimal]\n\n[5] Volume [Decimal]\n\n[6] Bid [Decimal]\n\n[7] Ask [Decimal]"

GetProduct

Solicita as informações de um único produto da API.

Requisição

{
  "OMSId": 1,
  "Symbol ou ProductId": "BTCBRL ou 1"
}

Resposta

{
  "OMSId": 1,
  "ProductId": 1,
  "Product": "BTCBRL",
  "ProductFullName": "Bitcoin",
  "ProductType": "CryptoCurrency",
  "DecimalPlaces": 9
}

GetProducts

Solicita uma lista de produtos disponíveis da API.

Requisição

{
  "OMSId": 1
}

Resposta

[
  {
    "OMSId": 1,
    "ProductId": 1,
    "Product": "BTCBRL",
    "ProductFullName": "Bitcoin",
    "ProductType": "CryptoCurrency",
    "DecimalPlaces": 9
  }
]

GetUserInfo

Pega as infromações do usuário atualmente autenticado.

Requisição

{}

Resposta

{
  "UserId": 58,
  "UserName": "testusername",
  "Email": "abc@ap.com",
  "PasswordHash": "",
  "PendingEmailCode": "",
  "EmailVerified": true,
  "AccountId": 0,
  "DateTimeCreated": "2016-04-21T21:48:22Z",
  "AffiliateId": 0,
  "RefererId": 0,
  "OMSId": 1,
  "Use2FA": false,
  "PendingCodeTime": "2016-07-20T19:28:44Z"
}

SetUserInfo

Definir as informações do usuário atualmente autenticado.

Requisição

{
  "UserId": 58,
  "UserName": "testusername",
  "Email": "abc@ap.com",
  "PasswordHash": "",
  "PendingEmailCode": "",
  "EmailVerified": true,
  "AccountId": 4,
  "DateTimeCreated": "2016-04-21T21:48:22Z",
  "AffiliateId": 0,
  "RefererId": 0,
  "OMSId": 1,
  "Use2FA": false,
  "PendingCodeTime": "2016-07-21T22:56:10Z"
}

Resposta

{
  "UserId": 58,
  "UserName": "testusername",
  "Email": "abc@ap.com",
  "PasswordHash": "",
  "PendingEmailCode": "",
  "EmailVerified": true,
  "AccountId": 4,
  "DateTimeCreated": "2016-04-21T21:48:22Z",
  "AffiliateId": 0,
  "RefererId": 0,
  "OMSId": 1,
  "Use2FA": false,
  "PendingCodeTime": "2016-07-21T22:56:10Z"
}

GetAccountInfo

Obtenha as informações de uma conta específica, se a sessão atual estiver autorizada para ver as informações da conta.

Requisição

{
  "OMSId": 1,
  "AccountId": 40
}

Resposta

{
  "OMSID": 1,
  "AccountId": 40,
  "AccountName": "Primary Account",
  "AccountType": "Asset",
  "FeeGroupID": 0,
  "ParentID": 0,
  "RiskType": "Normal",
  "VerificationLevel": 0,
  "FeeProductType": "BaseProduct",
  "FeeProduct": 0,
  "RefererId": 0,
  "AffiliateId": null,
  "SupportedVenueIds": []
}

GetAccountTrades

Recupera o histórico de transações de uma conta específica.

Requisição

{
  "OMSId": 1,
  "AccountId": 4,
  "Count": 50,
  "StartIndex": 0
}

Resposta

[
  {
    "OMSId": 1,
    "TradeId": 230,
    "OrderId": 9861,
    "AccountId": 4,
    "ClientOrderId": 0,
    "InstrumentId": 1,
    "Side": "Buy",
    "Quantity": 2,
    "Price": 95,
    "Value": 190,
    "TradeTime": 635978015145675000,
    "ContraAcctId": 3,
    "OrderTradeRevision": 1,
    "Direction": "NoChange"
  }
]

CreateDepositTicket

Cria um ticket de depósito para ser rastreado pelo sistema de tickets.

Requisição

{
  "AccountId": 1,
  "AssetId": 1,
  "Amount": 100,
  "OMSId": 1,
  "DepositInfo": "Result of GetDepositInfo"
}

Resposta

{
  "success": true,
  "requestcode": "special code for future use"
}

CreateWithdrawTicket

Este endpoint inicia uma retirada de fundos.

Requisição

{
  "OMSId": 1,
  "AccountId": 18,
  "ProductId": 1,
  "Amount": 0.01,
  "TemplateType": "ToExternalBitcoinAddress",
  "TemplateForm": "{\"TemplateType\":\"ToExternalBitcoinAddress\",\"Comment\":\"\",\"ExternalAddress\":\"54123214\"}"
}

Resposta

{
  "result": true
}

SendOrder

Envia uma nova ordem para a API. É importante que você esteja "SUBSCRIBED TO ACCOUNT ACTIONS --> TODO" para ver eventos de status atualizados para pedidos inseridos. Como alternativa, você também pode chamar GetOpenOrders e/ou GetOrderHistory para verificar o status do seu pedido. Lembre-se de que, se o seu pedido não estiver mais em um estado de funcionamento, você não o encontrará usando GetOpenOrders.

Requisição

{
  "AccountId": 5,
  "ClientOrderId": 99,
  "Quantity": 1,
  "DisplayQuantity": 0,
  "LimitPrice": 95,
  "OrderIdOCO": 0,
  "OrderType": 2,
  "PegPriceType": 1,
  "InstrumentId": 1,
  "TrailingAmount": 1,
  "LimitOffset": 2,
  "Side": 0,
  "StopPrice": 96,
  "TimeInForce": 1,
  "OMSId": 1
}

Resposta

{
  "status": "Accepted",
  "errormsg": "",
  "OrderId": 123
}

ModifyOrder

Envia uma solicitação de modificação de uma ordem para a exchange. Somente a quantidade de um pedido pode ser alterada sem cancelar o pedido.

Requisição

{
  "OMSId": 1,
  "OrderId": 0,
  "InstrumentId": 1,
  "PreviousOrderRevision": 0,
  "Quantity": 0
}

Resposta

{}

CancelReplaceOrder

Cancela uma ordem aberta e a substitui por uma nova.

Requisição

{
  "AccountId": 5,
  "OrderIdToReplace": 1,
  "ClientOrderId": 99,
  "Quantity": 1,
  "DisplayQuantity": 0,
  "LimitPrice": 95,
  "OrderIdOCO": 0,
  "OrderType": 2,
  "PegPriceType": 1,
  "InstrumentId": 1,
  "TrailingAmount": 1,
  "LimitOffset": 2,
  "Side": 0,
  "StopPrice": 96.6,
  "TimeInForce": 1,
  "OMSId": 1
}

Resposta

{
  "status": "Processing",
  "errormsg": ""
}

CancelOrder

Cancela uma ordem aberta - Podendo ser cancelada por OrderId usando o id retornado quando o pedido foi criado ou pelo ClOrderId e AccountId do pedido. Se AccountId não for especificado, a conta de usuário padrão será usada.

Requisição

{
  "OMSId": 1,
  "AccountId": 0,
  "ClOrderId": 0,
  "OrderId": 0
}

Resposta

{
  "status": "Processing",
  "errormsg": ""
}

CancelAllOrders

Cancela todas as ordens de um instrumento/conta especificado. Pode especificar UserId ou AccountId, se nenhum dos dois for fornecido, os valores padrão serão os valores de usuário autenticados. Somente um operador pode cancelar pedidos de outro usuário ou conta.

Requisição

{
  "AccountId": 4,
  "UserId": 2,
  "OMSId": 1,
  "InstrumentId": 1
}

Resposta

{
  "status": "Processing",
  "errormsg": ""
}

GetOrderStatus

Obtém o status operacional atual de um pedido enviado ao OMS.

Requisição

{
  "OMSId": 1,
  "AccountId": 4,
  "OrderId": 1
}

Resposta

{
  "Side": "Sell",
  "OrderId": 9849,
  "Price": 97,
  "Quantity": 0.29,
  "Instrument": 1,
  "Account": 4,
  "OrderType": "Limit",
  "ClientOrderId": 0,
  "OrderState": "Working",
  "ReceiveTime": 0,
  "OrigQuantity": 1,
  "QuantityExecuted": 0.71,
  "AvgPrice": 0,
  "ChangeReason": "Unknown",
  "OrigOrderId": 9849,
  "OrigClOrdId": 1,
  "EnteredBy": 2
}

GetOrderFee

Pega a taxa computada para execução de ordens.

Requisição

{
  "OMSId": 1,
  "AccountId": 4,
  "InstrumentId": 1,
  "ProductId": 1,
  "Amount": 500,
  "OrderType": "Market",
  "MakerTaker": "Maker"
}

Resposta

{
  "OrderFee": 0,
  "ProductId": 1
}

GetOrderHistory

Recupera uma lista das últimas 100 ordens feitas em sua conta.

Requisição

{
  "OMSId": 1,
  "AccountId": 1
}

Resposta

[
  {
    "Side": "Sell",
    "OrderId": 9849,
    "Price": 97,
    "Quantity": 0.29,
    "Instrument": 1,
    "Account": 4,
    "OrderType": "Limit",
    "ClientOrderId": 0,
    "OrderState": "Working",
    "ReceiveTime": 0,
    "OrigQuantity": 1,
    "QuantityExecuted": 0.71,
    "AvgPrice": 0,
    "ChangeReason": "Unknown",
    "OrigOrderId": 9849,
    "OrigClOrdId": 1,
    "EnteredBy": 2
  }
]

GetOpenOrders

Recupera as ordens abertas de todas as contas do usuário atual.

Requisição

{
  "OMSId": 1,
  "AccountId": 1
}

Resposta

[
  {
    "Side": "Sell",
    "OrderId": 9849,
    "Price": 97,
    "Quantity": 0.29,
    "Instrument": 1,
    "Account": 4,
    "OrderType": "Limit",
    "ClientOrderId": 0,
    "OrderState": "Working",
    "ReceiveTime": 0,
    "OrigQuantity": 1,
    "QuantityExecuted": 0.71,
    "AvgPrice": 0,
    "ChangeReason": "Unknown",
    "OrigOrderId": 9849,
    "OrigClOrdId": 1,
    "EnteredBy": 2
  }
]