NAV Navbar
javascript java shell

Introdução

Swipe API é uma solução para gestão de Ativos Digitais, Contas e transferências, feita para criar soluções financeiras rapidamente ou otimizar soluções já existentes.

Comparada a sistemas tradicionais, a solução oferece vantagens como:

A solução tem um design simples pensado para todo tipo de solução financeira, o que a torna versátil para uma série de exemplos de uso.

Precisa de ajuda? Entre em contato.

Run in Postman

Exemplos de uso

Como o foco da solução é fornecer os elementos básicos de qualquer aplicação financeira – contas, saldos, e ativos –, os casos de uso podem ser bem abrangentes. Alguns exemplos:

Redes DLT

A Swipe API funciona por meio da conexão com redes distribuídas (DLT), também chamadas em alguns casos de redes Blockchain.

Trabalhamos com 3 opções de redes voltadas a casos de uso específicos. Todos os conceitos funcionam da mesma forma em todas as redes, e o tempo médio de confirmação de cada Ação é de 6 segundos.

Atualmente trabalhamos com as seguintes opções de redes:

Rede Swipe

Recomendada para a maioria dos casos de uso, a Rede Swipe é uma rede permissionada – ou seja, cujo acesso é restrito apenas a usuários autorizados – que protege o acesso às informações, garantindo a privacidade dos dados.

Rede Stellar

Stellar é uma rede aberta indicada para aplicações globais. Esta rede é especialmente recomendada para projetos de remessa internacional ou fundraising (como ICOs ou STOs) por conta de sua grande adesão e conexão ao mercado por meio de uma corretora nativa ao protocolo.

Rede Dedicada

Em casos de maior demanda por escalabilidade, como é o caso em ambientes corporativos, recomendamos a utilização de uma rede com infraestrutura exclusiva. Para explorar a criação de uma rede dedicada para a sua empresa, entre em contato conosco.

Conceitos

Ativo

Um Ativo representa valores físicos ou digitais que podem ser transferidos entre pessoas ou empresas. Alguns exemplos:

Conta

Uma Conta possui saldos de um ou mais Ativos. Ela é representada por um identificador único.

Na maioria das aplicações, Contas costumam representar os usuários da aplicação.

Organização

Uma Organização é um tipo de Conta especial que pode emitir Ativos, criar Contas filhas e transferir os Ativos dessas contas. Organizações possuem um ou mais pares de credenciais (API Key e Secret).

Organizações costumam representar a empresa que disponibiliza a aplicação para os usuários.

Ação

Existem quatro tipos de Ações:

Todas as Ações ocorrem em uma rede DLT, de forma que todas as alterações sejam automaticamente registradas na rede. Assim, cada Ação gera um Recibo que comprova a sua inclusão na rede.

Criar nova Conta

Cria uma nova Conta filha da sua Organização, especificando os Ativos que ela suporta.

Destruir uma Conta

Remove uma Conta, inutilizando seu ID. Para esta Ação, é necessário que a conta não possua saldos de nenhum Ativo. Contas destruídas não podem ser recuperadas.

Emitir um Ativo

Cria um novo Ativo. Pode ser definido um limite máximo para a emissão, de modo a dar escassez ao Ativo.

Transferir Ativos

Executa uma transferência de um Ativo entre Contas ou entre a Organização e uma Conta. Se for transferido um Ativo que o destinatário não suporta, ele passará a suportá-lo automaticamente.

Lote de Ações

Algumas Ações podem ser enviadas e processadas em lote, de modo que todas as Ações do lote sejam processadas ao mesmo tempo. Assim, se alguma Ação falhar por algum motivo, todas as outras também falharão.

Um lote pode incluir mais de um tipo de Ação simultaneamente.

Ações que atualmente suportam essa funcionalidade:

Memo

Todo Lote de Ações suporta um campo opcional chamado Memo que possibilita uma forma de enriquecer um Lote com qualquer tipo informação. Alguns exemplos incluem adicionar um recibo de uma transação bancária, ou informações importantes sobre as partes que transacionaram.

Integração

Mantemos um SDK oficial em Node.js v0.9.1 e outro em Java/Kotlin v0.9.1 e lançamos suporte a outras linguagens conforme a demanda de nossos clientes.

Recomendamos fortemente a utilização de um SDK, pois eles abstraem boa parte da complexidade de integração, como autenticação, tratamento de erros e suporte a novas versões.

Como nossa API é baseada em REST, também é possível utilizá-la diretamente.

Ao longo desta seção, acompanhe na aba da direita exemplos para integração usando SDKs ou por meio de nossa API REST.

Integração por SDK

Selecione as abas ao lado para visualizar exemplos básicos de utilização do SDK em cada linguagem.

Instalação e Inicialização

/* 

Via npm:

`npm i @swp/swipe-sdk`

Via yarn:

`yarn add @swp/swipe-sdk`

*/
// ES2015 ou TypeScript
import * as Swipe from '@swp/swipe-sdk'
// ou CommonJS
const Swipe = require('@swp/swipe-sdk')
/*

Gradle

//Step 1. Add it in your root build.gradle at the end of repositories:

allprojects {
  repositories {
    ...
    maven { url 'https://jitpack.io' }
  }
} 

//Step 2. Add the dependency

dependencies {
    implementation 'com.github.swipetech:swp-java-sdk:0.9.1'
}


Maven

//Step 1. Add the JitPack repository to your build file 

<repositories>
  <repository>
      <id>jitpack.io</id>
      <url>https://jitpack.io</url>
  </repository>
</repositories> 


//Step 2. Add the dependency

<dependency>
    <groupId>com.github.swipetech</groupId>
    <artifactId>swp-java-sdk</artifactId>
    <version>0.9.1</version>
</dependency>

 */
// Inicia no ambiente de Produção
const swp = Swipe.init({
  apiKey: "your api key",
  secret: "your secret key",
  language: Swipe.languages.PT_BR,
})
// Inicia no ambiente de Sandbox
const swp = Swipe.init({
  apiKey: "your api key",
  secret: "your secret key",
  sandbox: true,
  language: Swipe.languages.PT_BR,
})
// Inicia no ambiente de Produção
 Swipe swp = new SwpBuilder()
                 .setApiKey("your api key")
                 .setSecret("your secret key")
                 .setLang(AcceptLanguage.PT_BR)
                 .build();
// Inicia no ambiente de Sandbox
 Swipe swp = new SwpBuilder()
                 .setApiKey("your api key")
                 .setSecret("your secret key")
                 .setLang(AcceptLanguage.PT_BR)
                 .setEnvAsSandbox()
                 .build();

Após a instalação, o primeiro passo é inicializar o SDK com uma API Key, um Secret e um Idioma válidos.

Para fins de testes, disponibilizamos um ambiente de Sandbox. Veja ao lado um exemplo.

Integração pela API REST

Selecione a aba shell ao lado para visualizar exemplos básicos de integração via API utilizando curl.

Ambientes

Use os domínios a seguir para suas requisições.

Autenticação

Note que só é necessário se preocupar com a autenticação das requisições caso opte por integrar diretamente à nossa API. A integração por SDK abstrai completamente essa complexidade.

Headers

curl -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <API_KEY>" \
  -H "X-Swp-Signature: <SIGNATURE>" \
  https://api.swipetech.io/organizations

Utilizamos um modelo de API Key e Secret para autenticar as requisições. Todas as requisições devem incluir os seguintes headers:

Assinatura (X-Swp-Signature)

const Crypto = require("crypto-js")
const Base64 = require("crypto-js/enc-base64")
const requestPath = "/accounts"
const bodyString = ""
const secret = "71ad81f98fbbab22c9d74948d2899a65027208197291d11e2065c3a9c62fe1f0"
const timestamp = Math.floor(Date.now() / 1000) // "1540920260"
const method = "GET"

const stringToSign = method + timestamp + requestPath + bodyString
const hmac = Crypto.HmacSHA256(stringToSign, secret)
const signature = Base64.stringify(hmac)

console.log(signature)
// /h02U+jDJWOG1npOvL1pH79hgGWT7mWymzxISP5IphA=

Para gerar uma assinatura da requisição, siga os passos a seguir, acompanhando a aba javascript ao lado:

Exemplo de assinatura:

Campo Valor
Path /accounts
Method GET
Body
Secret 71ad81f98fbbab22c9d74948d2899a65027208197291d11e2065c3a9c62fe1f0
Timestamp 1540920260
Signature /h02U+jDJWOG1npOvL1pH79hgGWT7mWymzxISP5IphA=

Idioma

curl -H "Content-Type: application/json" \
  -H "Accept-Language: pt-BR" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/organizations

Para configurar o idioma de resposta da API, utilize o seguinte header nas requisições:

Formatação dos valores de Ativos

É preciso observar as seguintes regras de formatação para os valores de Ativos.

Buscar informações

Nesta seção estão listados os endpoints usados para buscar mais detalhes sobre uma Organização, Contas ou Ativos.

Paginação para requisições GET

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts?limit=10&starting_after=10003
swp.getAllAccounts({limit: "10"})
  .then(({data, pagination}) => {
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.id)
    })

    // carregar a segunda página
    return swp.getAllAccounts({ limit: "10", starting_after: pagination.cursor})
  })
  .then(({data}) =>
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.id)
    })
  )

    SuccessResponse<List<DataDTOReceipt<AccountDTO>>> resp =
    swp.getAllAccounts(
        new PaginationParams(null, "3"), null
    );

    PaginationResponse pagination = resp.getPagination();

    resp.getData().forEach(it -> {
       System.out.println(it.getReceipt().getId());
       System.out.println(it.getValue().getId());
    });

    // Buscar próxima página
    swp.getAllAccounts(
        new PaginationParams(String.valueOf(pagination.getCursor()), "3"), null
    ).getData()
     .forEach(it -> {
        System.out.println(it.getReceipt().getId());
        System.out.println(it.getValue().getId());
    });

Utilizamos um modelo de paginação baseada em cursor. Os seguintes endpoints a suportam:

Para utilizar a paginação, existem dois parâmetros opcionais que são passados via query parameters na URL da requisição:

1. Organização

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/organizations
swp.getOrganization()
  .then(({data}) => console.log(data.value.name))
  .catch(error =>
    console.log(error)
  )
  OrgDTO org = swp.getOrganization().getData().getValue()

Busca informações sobre sua Organização.

GET /organizations

Retorno

2. Todas as Contas

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts?limit=10
swp.getAllAccounts({limit: "10"})
  .then(({data, pagination}) => {
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.id)
    })

    // carregando a segunda página
    return swp.getAllAccounts({ limit: "10", starting_after: pagination.cursor})
  })
  .then(({data}) =>
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.id)
    })
  )
  .catch(error =>
    console.log(error)
  )

    SuccessResponse<List<DataDTOReceipt<AccountDTO>>> resp =
    swp.getAllAccounts(
        new PaginationParams(null, "3"), null
    );

    PaginationResponse pagination = resp.getPagination();

    resp.getData().forEach(it -> {
       System.out.println(it.getReceipt().getId());
       System.out.println(it.getValue().getId());
    });

    // Buscar próxima página
    swp.getAllAccounts(
        new PaginationParams(String.valueOf(pagination.getCursor()), "3"), null
    ).getData()
     .forEach(it -> {
        System.out.println(it.getReceipt().getId());
        System.out.println(it.getValue().getId());
    });

Busca informações sobre todas as Contas já criadas pela sua Organização.

GET /accounts?tag=<tag>&limit=<limit>&starting_after=<starting_after>

Parâmetros de Query

Parâmetro Descrição
tag (opcional) Tags para filtragem
limit (opcional) Limite de itens por página
starting_after (opcional) ID do item a partir do qual a pagina deve começar

Retorno

3. Conta específica

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts/44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d
swp.getAccount("44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d")
  .then(({data}) =>
    console.log(data.receipt.id, data.value.id)
  )
  .catch(error =>
    console.log(error)
  )

   String ACC_ID = "3394abe6b49b3d718f572829adf2d7f186520d35be9e746e8d3d9366145b2fe1";

   AccountDTO acc = swp.getAccount(ACC_ID)
                       .getData()
                       .getValue();

Busca informações sobre uma Conta específica criada pela sua Organização.

GET /accounts/:id

Parâmetros de URL

Parâmetro Descrição
id ID da Conta

Retorno

4. Todos os Ativos

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/assets?limit=10
swp.getAllAssets({limit: "10"})
  .then(({ data, pagination }) => {
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.code)
    })

    // carregando a segunda página
    return swp.getAllAssets({ limit: "10", starting_after: pagination.cursor })
  })
  .then(({data}) =>
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.code)
    })
  )
  .catch(error =>
    console.log(error)
  )

 SuccessResponse<List<DataDTOReceipt<AssetDTO>>> resp =
              swp.getAllAssets(
                new PaginationParams(null, "3"), null
            );

  PaginationResponse pagination = resp.getPagination();

  resp.getData().forEach(it -> {
     System.out.println(it.getValue().getId());
  });

  // Buscar próxima página
  swp.getAllAssets(
      new PaginationParams(String.valueOf(pagination.getCursor()), "3"), null
  ).getData()
   .forEach(it -> {
      System.out.println(it.getReceipt().getId());
      System.out.println(it.getValue().getId());
  });

Busca todos os Ativos emitidos pela sua Organização.

GET /assets?tag=<tag>&limit=<limit>&starting_after=<starting_after>

Parâmetros de Query

Parâmetro Descrição
tag (opcional) Tags para filtragem
limit (opcional) Limite de itens por página
starting_after (opcional) ID do item a partir do qual a pagina deve começar

Retorno

5. Todas as Transferências relativas a uma Conta

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts/44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d/transfers?limit=10
const accountId = "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d"

swp.getAllTransfers(accountId, {limit: "10"})
  .then(({ data, pagination }) => {
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.amount)
    })

    // carregando a segunda página
    return swp.getAllTransfers(accountId, { limit: "10", starting_after: pagination.cursor })
  })
  .then(({data}) =>
    data.forEach(({ receipt, value }) => {
      console.log(receipt.id)
      console.log(value.amount)
    })
  )
  .catch(error =>
    console.log(error)
  )
  String ACC_ID = "3394abe6b49b3d718f572829adf2d7f186520d35be9e746e8d3d9366145b2fe1";

  //get first page
  SuccessResponse<List<DataDTOReceipt<TransferDTO>>> resp =
      swp.getAllTransfers(ACC_ID, new PaginationParams(null, "3"));

  PaginationResponse pagination = resp.getPagination();

  resp.getData().forEach(it -> System.out.println(it.getValue().getId()));

  // Buscar próxima página
  swp.getAllTransfers(ACC_ID, new PaginationParams(String.valueOf(pagination.getCursor()), "3"))
     .getData()
     .forEach(it -> {
          System.out.println(it.getReceipt().getId());
          System.out.println(it.getValue().getId());
     });

Busca todas as Transferências relacionadas a sua Organização ou Conta filha, incluindo transferências enviadas e recebidas.

GET /accounts/:id/transfers?limit=<limit>&starting_after=<starting_after>

Parâmetros de URL

Parâmetro Descrição
id ID da Conta ou da Organização

Parâmetros de Query

Parâmetro Descrição
limit (opcional) Limite de itens por página
starting_after (opcional) ID do item a partir do qual a pagina deve começar

Retorno

6. Lote de Transferências específico

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/transfers/44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d
swp.getTransfer("44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d")
  .then(({data}) =>
    data.value.actions.forEach(tf =>
      console.log(tf.amount)
    )
  )
  .catch(error =>
    console.log(error)
  )
  String TRANSFER_ID = "3394abe6b49b3d718f572829adf2d7f186520d35be9e746e8d3d9366145b2fe1";
  TransferBatchDTO batchDTO = swp.getTransfer(TRANSFER_ID).getData().getValue();
  TransferDTO transfer = batchDTO.getActions().get(0);

Busca informações sobre um lote de Transferências relacionadas a sua Organização ou Conta filha.

GET /transfers/:id

Parâmetros de URL

Parâmetro Descrição
id ID do lote de Transferências

Retorno

Realizar ações

1. Criar nova Conta

curl -X POST \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts
swp.createAccount({
  // Este campo é opcional. Por padrão, todas as Contas filhas suportam todos os Ativos da Organização e possuem saldo inicial zero.
  starting_balances: [
    {
      asset_id: '07773f06becd47385d1e8d1e9bad3bd588ccd880fe746819257a6246e33551d3',
      balance: '1.99'
    }
  ]
})
.then(({data}) =>
  console.log(data.value.id)
)
.catch(error =>
  console.log(error)
)

   String ASSET_ID = "07773f06becd47385d1e8d1e9bad3bd588ccd880fe746819257a6246e33551d3";

   String STARTING_BALANCE = "1.99";

   AccountDTO accDTO = swp.createAccount(
           new CreateAccountBuilder()
           .addStartingBalance(ASSET_ID, STARTING_BALANCE)
           .addTag("tag10")
           .build()
   ).getData()
   .getValue();

POST /accounts

Body

NewAccount

Retorno

2. Emitir um Ativo

curl -X POST \
  https://api.swipetech.io/assets \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  -d '{"code": "TOKEN", "limit": "10000000"}'
swp.issueAsset({
  code: "TOKEN",
  limit: "10000000"
})
  .then(({data}) =>
    console.log(data.value.id)
  )
  .catch(error =>
    console.log(error)
  )
    String CODE = "TOKEN";
    String LIMIT = "100";
    List<String> TAGS = new ArrayList();

    AssetDTO assetDTO = swp.issueAsset(
            new NewAssetDTO(CODE, LIMIT, TAGS)
    ).getData().getValue();

POST /assets

Body

NewAsset

Retorno

3. Realizar Transferências em lote

curl --request POST \
  -L https://api-sandbox.swipetech.io/transfers \
  -H 'accept: application/json' \
  -H 'accept-language: pt-BR' \
  -H 'content-type: application/json' \
  -H 'x-swp-api-key: <sua api key>' \
  -H 'x-swp-signature: <assinatura da requisição>' \
  -d '{"transfers":[{"from":"269de13d714b253b88fdf18620c3194078f7932d48855efc6e4d6dc57528c84c","to":"b0ea341bd255aa27eb38ef136aebfcaaffbc87103d872a4a218df7b434f5a6ad","amount":"121.22","asset":"b6039b3fb9c3e30945644cc394e6b1accb0a6c2844514aad0819a89d64b0184c"}],"memo":"01234567"}'
import { memoHash, sha256 } from "@swp/swipe-sdk"

const memo = memoHash(sha256("1234567"))

// Note que isso é uma lista, mesmo que haja somente uma Transferência
swp.makeTransfers({
  actions: [
    {
      from: "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d",
      to: "55c86a9027f2ff8c5d6ed1e2dbda01886b8b33f461341533d7391c14abe7aa40",
      asset: "07773f06becd47385d1e8d1e9bad3bd588ccd880fe746819257a6246e33551d3",
      amount: "1000",
    }
  ],
  memo
})
  .then(({data}) => {
    data.value.actions.forEach(tf => {
      console.log(tf.amount)
    })
  })
  .catch(error => {
    console.log(error)

    // exibir índice e código de erro das Transferências que falharam
    error.sub_errors
      .forEach((se, i) => {
        // é possível checar qual a Transferência que falhou através de seu campo `index`
        console.log(i, se.code, se.index)
      })
  })

String FROM = "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d";
String TO = "55c86a9027f2ff8c5d6ed1e2dbda01886b8b33f461341533d7391c14abe7aa40";
String ASSET = "07773f06becd47385d1e8d1e9bad3bd588ccd880fe746819257a6246e33551d3";
String AMOUNT = "1000";

swp.makeTransfers(
        new NewTransferBatchDTO(
                Arrays.asList(
                        new NewTransferDTO(FROM, TO, ASSET, AMOUNT)
                ),
                new Memo(MemoType.TEXT.name(), "1234")
        )
);

Executa uma lista de Transferências de forma atômica, isto é; se uma falhar, todas falharão.

Obs.: O campo opcional memo pode ser utilizado para salvar informações na rede.

POST /transfers

Body

TransferBatch

Retorno

4. Destruir uma Conta

curl -X DELETE \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts/44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d
swp.destroyAccount(accountID)
  .then(({data}) =>
    console.log(data.value.id)
  )
  .catch(error =>
    console.log(error)
  )
String ACC_ID = "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d";
SuccessResponse<DataDTOReceipt<AccountDTO>> resp = swp.destroyAccount(ACC_ID);

Destrói uma Conta. Essa Conta deve ter saldo zero para todos seus Ativos.

DELETE /accounts/:id

Parâmetros de URL

Parâmetro Descrição
id ID da Conta

Retorno

5. Ações em lote

curl -X POST \
  https://api.swipetech.io/actions \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  -d '{"actions": [{"type": "CREATE_ACC"}, {"type": "ISSUE_ASSET", "code": "TOKEN", "limit": "10000"}, {"type": "TRANSFER", "from": "269de13d714b253b88fdf18620c3194078f7932d48855efc6e4d6dc57528c84c", "to": "b0ea341bd255aa27eb38ef136aebfcaaffbc87103d872a4a218df7b434f5a6ad", "asset": "b6039b3fb9c3e30945644cc394e6b1accb0a6c2844514aad0819a89d64b0184c", "amount": "100"}], "memo": "Memo"}'
swp.makeActionBatch({
  actions: [
    {
      type: "CREATE_ACC"
    },
    {
      type: "ISSUE_ASSET",
      code: "TOKEN",
      limit: "10000"
    },
    {
      type: "TRANSFER",
      from: "269de13d714b253b88fdf18620c3194078f7932d48855efc6e4d6dc57528c84c",
      to: "b0ea341bd255aa27eb38ef136aebfcaaffbc87103d872a4a218df7b434f5a6ad",
      asset: "b6039b3fb9c3e30945644cc394e6b1accb0a6c2844514aad0819a89d64b0184c",
      amount: "100"
    }
  ],
  memo: {
    type: "TEXT",
    value: "1234567"
  }
})



// Também é possível construir Ações usando funções auxiliares
import { createAccountAction, issueAssetAction, transferAction, memoText } from "@swp/swipe-sdk"

const memo = memoText("1234567")

swp.makeActionBatch({
  actions: [
    createAccountAction(),
    issueAssetAction({
      code: "TOKEN",
      limit: "10000"
    }),
    transferAction({
      from: "269de13d714b253b88fdf18620c3194078f7932d48855efc6e4d6dc57528c84c",
      to: "b0ea341bd255aa27eb38ef136aebfcaaffbc87103d872a4a218df7b434f5a6ad",
      asset: "b6039b3fb9c3e30945644cc394e6b1accb0a6c2844514aad0819a89d64b0184c",
      amount: "100"
    })
  ],
  memo
})
String ASSET = "07773f06becd47385d1e8d1e9bad3bd588ccd880fe746819257a6246e33551d3";

String ISSUE_ASSET_CODE = "TOKEN";
String ISSUE_ASSET_LIMIT = "100";
List<String> ISSUE_ASSET_TAGS = null;

String TRANSFER_FROM = "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d";
String TRANSFER_TO = "55c86a9027f2ff8c5d6ed1e2dbda01886b8b33f461341533d7391c14abe7aa40";

String TRANSFER_AMOUNT = "1000";

String CREATE_ACC_STARTING_BALANCE = "10";

ActionBatchDTO result = swp.makeActionBatch(
        new ActionBatchBuilder()
                .addIssueAsset(ISSUE_ASSET_CODE, ISSUE_ASSET_LIMIT, ISSUE_ASSET_TAGS)
                .addTransfer(TRANSFER_FROM, TRANSFER_TO, ASSET, TRANSFER_AMOUNT)
                .addCreateAccount(
                        new CreateAccountBuilder()
                            .addStartingBalance(ASSET, CREATE_ACC_STARTING_BALANCE)
                            .build()
                )
                .build()
).getData()
 .getValue();

Executa um lote de Ações

Obs.: O campo opcional memo pode ser utilizado para salvar informações na rede.

POST /actions

Body

ActionBatch

Retorno

Lote de Ações com Memo

import { createAccountAction, sha256 } from "@swp/swipe-sdk"

const memo1 = {
  type: "TEXT",
  value: "conteúdo do memo"
}

const memo2 = {
  type: "HASH",
  value: sha256("conteúdo do memo")
}

swp.makeActionBatch({
  actions: [
    createAccountAction(),
  ],
  memo: memo1 // -> tipo TEXT
  // memo: memo2 -> tipo HASH
})

// Também é possível utilizar funções utilitárias para criação do Memo
import { createAccountAction, memoText, memoHash, sha256 } from "@swp/swipe-sdk"

const memo1 = memoText("conteúdo do memo")
const memo2 = memoHash(sha256("conteúdo do memo"))

swp.makeActionBatch({
  actions: [
    createAccountAction(),
  ],
  memo: memo1 // -> tipo TEXT
  // memo: memo2 -> tipo HASH
})

// Utilize esta função para checar ou gerar o valor do hash.
const hash = sha256("conteúdo do memo")
String ASSET = "07773f06becd47385d1e8d1e9bad3bd588ccd880fe746819257a6246e33551d3";

String TRANSFER_FROM = "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d";
String TRANSFER_TO = "55c86a9027f2ff8c5d6ed1e2dbda01886b8b33f461341533d7391c14abe7aa40";

String TRANSFER_AMOUNT = "1000";

ActionBatchDTO result = swp.makeActionBatch(
        new ActionBatchBuilder()
                .addTransfer(TRANSFER_FROM, TRANSFER_TO, ASSET, TRANSFER_AMOUNT)
                .addMemo(new Memo(MemoType.TEXT.name(), "hello world!"))
                .build()
).getData()
 .getValue();

Todo Lote de Ações pode incluir um campo Memo com informações adicionais.

Existem dois tipos de Memo:

Caso seja passado um valor inválido, a API retornará um erro de validação

Tags e filtros

Contas e Ativos podem conter uma ou mais tags, agregando informações para fins de organização dos dados.

1. Especificar tags na criação de Conta ou Ativo

curl -X POST \
  -L https://api.swipetech.io/accounts \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  -d '{"tags":["fornecedor"]}'

curl -X POST \
  -L https://api.swipetech.io/assets \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  -d '{"code": "TOKEN", "tags":["fornecedor"]}'
swp.createAccount({tags: ["fornecedor"]})
  .then(({data}) =>
    console.log(data.value.tags)
  )
  .catch(error =>
    console.log(error)
  )

swp.issueAsset({
  code: "TOKEN",
  tags: ["fornecedor"]
})
  .then(({data}) =>
    console.log(data.value.tags)
  )
  .catch(error =>
    console.log(error)
  )

AccountDTO accDTO = swp.createAccount(
        new CreateAccountBuilder().addTag("fornecedor").build()
).getData().getValue();

String CODE = "TOKEN";
String LIMIT = "100";
AssetDTO assetDTO = swp.issueAsset(
        new NewAssetDTO(CODE, LIMIT, Arrays.asList("fornecedor"))
).getData().getValue();

As Ações de criação de Conta e de emissão de um Ativo possuem um parâmetro opcional tags. Ao ser especificado, é aplicada uma string tags às Contas ou Ativos criados, que pode ser usada para separá-los em categorias.

Cada Conta ou Ativo pode conter, no máximo, 10 tags.

Cada tag possui um limite de 2 a 200 caracteres. São válidos:

2. Alterar tags

curl -X PUT \
  -L https://api.swipetech.io/tags/44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  -d '{"tags":["cliente"]}'
const id = '44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d'

swp.updateTags(id, ["cliente"])
  .then(({data}) =>
    console.log(data.value.tags)
  )
  .catch(error =>
    console.log(error)
  )
   String ACC_ID = "44d351a02f2307153be74984a59675f2733ad5deb1fa9fb08b0a36fe3d15fd6d";
   TagsDTO tags = swp.updateTags(ACC_ID, Arrays.asList("cliente")).getData().getValue();

PUT /tags/:id

Remove as tags de uma Conta ou Ativo e as substitui por um novo conjunto.

Parâmetros de URL

Parâmetro Descrição
id ID da Conta ou Ativo

Body

NewTags

Retorno

3. Filtrar Contas por tag

# Filtrando Contas por tag
curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/accounts?tag=fornecedor
// Filtrando Contas por tag
swp.getAllAccounts({ tag: "fornecedor" })
  .then(({data}) =>
    data.forEach(({value, receipt}) => {
      console.log(value.id)
      console.log(receipt.id)
    })
  )
  .catch(error =>
    console.log(error)
  )
  List<DataDTOReceipt<AccountDTO>> resp = 
      swp.getAllAccounts(null, new FilterDTO("fornecedor")).getData();

Filtra Contas que contêm uma tag específica.

GET /accounts?tag=<tag>

Parâmetros de URL

Parâmetro Descrição
tag Tag para filtragem

Retorno

4. Filtrar Ativos por tag

curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/assets?tag=fornecedor
swp.getAllAssets({ tag: "cripto" })
  .then(({data}) =>
    data.forEach(({value, receipt}) => {
      console.log(value.id)
      console.log(receipt.id)
    })
  )
  .catch(error =>
    console.log(error)
  )
     List<DataDTOReceipt<AssetDTO>> resp = 
          swp.getAllAssets(null, new FilterDTO("fornecedor")).getData();

Filtra Ativos que contêm uma tag específica.

GET /assets?tag=<tag>

Parâmetros de URL

Parâmetro Descrição
tag Tag para filtragem

Retorno

Outros

1. Resetar Organização (disponível apenas em ambiente sandbox)

curl -X DELETE \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/organizations
swp.resetOrganization()
  .then(() =>
    console.log("Feito!")
  )
  .catch(error =>
    console.log(error)
  )
  swp.resetOrganization();

Esta função retorna a Organização a seu estado inicial, ou seja:

DELETE /organizations

2. Revoke de um par de credenciais

Revoga um par de credenciais, tornando-as inválidas e impossibilitando o acesso à aplicação.

# Busca o token de Revoke
curl -X GET \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/organizations/revoke

# Efetiva o Revoke  
curl -X POST \
  -H "Content-Type: application/json" \
  -H "X-Swp-Api-Key: <sua api key>" \
  -H "X-Swp-Signature: <assinatura da requisição>" \
  https://api.swipetech.io/organizations/revoke/eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJUeXBlIjoiUkVWT0tFIENSRURFTlRJQUxTIiwiZXhwIjoxNTUwODYyNjY2LCJUaW1lc3RhbXAiOjE1NTA4NjIzNjZ9.s9UbrJmWQXVpIeXAb9gjWwRe19iWV1gYIaoxXOQ0_1A
swp.getToken()
  .then(({data}) => {
      console.log(data.value.token)
      // eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJUeXBlIjoiUkVWT0tFIENSRURFTlRJQUxTIiwiZXhwIjoxNTUwODYyNjY2LCJUaW1lc3RhbXAiOjE1NTA4NjIzNjZ9.s9UbrJmWQXVpIeXAb9gjWwRe19iWV1gYIaoxXOQ0_1A

      return swp.revokeCredentials(data.value.token)
  })
  .then(() => console.log("Revoke efetuado com sucesso"))
  .catch(error =>
    console.log(error)
  )
     ResponseToken respToken = swp.getToken().getData().getValue();
     swp.revokeCredentials(respToken.getToken()).getData();

Esta função ocorre em 2 passos. Primeiro, busca-se um token de Revoke (válido por 5 minutos):

GET /organizations/revoke

Retorno

Em seguida, utiliza-se o token obtido no passo anterior para executar o Revoke:

POST /organizations/revoke/:token

Parâmetros de URL

Parâmetro Descrição
token token de Revoke

Retorno

Tratamento de erros

Um erro possui alguns campos que ajudam a identificar a causa do problema.

code

O campo code mostra o grupo ao qual o erro pertence. A maioria deles possui um campo sub_errors com detalhes mais específicos. São estes os grupos:

msg

Este campo contém uma mensagem legível sobre a causa do problema.

sub_errors

sub_errors contém uma lista de sub-erros com detalhes específicos sobre a causa do problema. Assim como o campo error, ele possui code, msg (e field em caso de erro de validação):

not_found

validation_error

transfer_error

unauthorized

Idiomas suportados

const en_us = Swipe.languages.EN_US
const pt_br = Swipe.languages.PT_BR

O idioma é utilizado para configurar as mensagens de resposta da API. Atualmente são suportados:

Estruturas

SuccessResponse<T>

interface SuccessResponse<T> {
  data?: T
  pagination?: Pagination
  error: Error
}
Campo Tipo Descrição
data T (opcional) Informações da resposta
pagination Pagination (opcional) Informações sobre a paginação
error Error

Pagination

interface Pagination {
  cursor: string
}
Campo Tipo Descrição
cursor Valor que pode ser utilizado para consultar a próxima página

Data<T>

interface Data<T> {
  receipt: Receipt
  value: T
}
Campo Tipo Descrição
receipt Receipt Recibo da Ação
value T Tipo genérico que depende do contexto

Receipt

interface Receipt {
  id: string
  created_at: string
  type: ActionType
}
Campo Tipo Descrição
id string ID do Recibo
created_at string Data de criação do Recibo
type ActionType Tipo da Ação

ActionType

swp.actionTypes.Transfer             // "transfer"
swp.actionTypes.CreateAccount        // "create_account"
swp.actionTypes.CreateOrganization   // "create_organization"
swp.actionTypes.IssueAsset           // "issue_asset"
swp.actionTypes.DestroyAccount       // "destroy_account"
Constante Descrição
transfer Transferência
create_account Criação de uma nova Conta
destroy_account Destruição de uma Conta
create_organization Criação de Organização
issue_asset Emissão de Ativo

Organization

interface Organization extends Account {
  name: string
}
Campo Tipo Descrição
id string ID da Organização
name string Nome
balances Balance[] Lista de saldos da Organização para todos seus Ativos

Account

interface Account {
  id: string
  type?: string
  balances: Balance[]
  tags?: string[]
  fields: {[key: string]: string}
}
Campo Tipo Descrição
id string ID da Conta
type string String com valor CREATE_ACC, utilizada para identificar o tipo de Action na serialização/deserialização
balances Balance[] Lista de saldos para todos os Ativos suportados pela Conta
tags string[] Lista de Tags
fields {[key: string]: string} Campos chave-valor para guardar informações sobre a Conta

NewAccount

interface NewAccount {
  type?: string
  starting_balances?: StartingBalance[]
  tags?: string[]
  fields: {[key: string]: string}
}
Campo Tipo Descrição
type string String com valor CREATE_ACC, utilizada para identificar o tipo de Action na serialização/deserialização
starting_balances StartingBalance[] Lista de Ativos que a nova Conta suportará e seus respectivos saldos iniciais
tags string[] Lista de Tags
fields {[key: string]: string} Campos chave-valor para guardar informações sobre a Conta

Asset

interface Asset {
  id: string
  code: string
  limit: string
  tags: string[]
  type?: string
}
Campo Tipo Descrição
id string ID do Ativo
code string Texto entre 4 e 12 caracteres que representa o Ativo
limit string Quantidade máxima do Ativo a ser emitido
tags string[] Lista de tags associadas ao Ativo
type string String com valor ISSUE_ASSET, utilizada para identificar o tipo de Action na serialização/deserialização

NewAsset

interface NewAsset {
  code: string
  limit: string
  tags?: string[]
  type?: string
}
Campo Tipo Descrição
code string Texto entre 4 e 12 caracteres que representa o Ativo
limit string Número máximo de unidades a ser emitido
tags string[] Lista de tags a serem associadas ao Ativo
type string String com valor ISSUE_ASSET, utilizada para identificar o tipo de Action na serialização/deserialização

TransferBatch

interface TransferBatch {
  id: string
  actions: Transfer[]
  memo?: MemoValue
}
Campo Tipo Descrição
id string ID da Transferência
actions Transfer[] Lista de Transferências incluídas na transação
memo MemoValue Memo do Lote de Transferências

MemoValue

interface MemoValue {
  type: "TEXT" | "HASH"
  value: string 
}
Campo Tipo Descrição
type string Tipo do Memo
value string Valor do Memo

Transfer

interface Transfer {
  id: string
  from: string
  to: string
  asset: string
  amount: string
  op_code: OperationCode
  type?: string
}
Campo Tipo Descrição
id string ID da transferência para consultas
from string ID do remetente
to string ID do destinatário
amount string Valor a ser transferido
asset string ID do Ativo da Operação
action_code ActionCode Código de resposta da Operação
type string (opcional) String com valor TRANSFER, utilizada para identificar o tipo de Action na serialização/deserialização

NewTransfer

interface NewTransfer {
  from: string
  to: string
  amount: string
  asset: string
  type?: string
}
Campo Tipo Descrição
from string ID do remetente
to string ID do destinatário
amount string Valor a ser transferido
asset string ID do Ativo da Operação
type string String com valor TRANSFER, utilizada para identificar o tipo de Action na serialização/deserialização

ActionCode

swp.actionCodes.Ok            // "action_ok"
swp.actionCodes.Success       // "action_success"
swp.actionCodes.Underfunded   // "action_underfunded"
swp.actionCodes.NotProcessed  // "action_not_processed"
Constante Descrição
action_ok Transferência válida
action_success Transferência executada com sucesso
action_underfunded Saldo insuficiente
action_not_processed Transferência inválida

StartingBalance

interface StartingBalance {
  balance: string
  asset_id: string
}
Campo Tipo Descrição
asset_id string ID do Ativo
balance string Saldo atual do Ativo

Balance

interface Balance {
  balance: string
  asset_code: string
  asset_id: string
}
Campo Tipo Descrição
asset_code string código do Ativo
asset_id string ID do Ativo
balance string Saldo atual do Ativo

NewTags

interface NewTags {
  tags: string[]
}
Campo Tipo Descrição
tags string[] Array de tags

Tags

interface Tags {
  id: string
  tags: string[]
}
Campo Tipo Descrição
id string ID da entidade que possui as tags
tags string[] Array de tags

Error

interface Error {
  code: string
  msg: string
  sub_errors: SubError[]
}
Campo Tipo Descrição
code string Código que identifica a causa do problema
msg string Mensagem traduzida
sub_errors SubError[] Lista de sub-erros. Cada sub-erro possui informações mais detalhadas sobre a causa do problema

SubError

interface Error {
  code: string
  msg: string
  field: string
  index: number
}
Campo Tipo Descrição
code string Código que identifica a causa do problema
msg string Mensagem traduzida
field string Campo com qual o erro se relaciona (somente no caso de validation_error)
index number Campo para identificar qual operação dentro da transferência falhou (somente no caso de transfer_failed)

ActionBatch

interface ActionBatch {
  id?: string
  actions: Array<NewAccount | NewAsset | NewTransfer>
  memo?: MemoValue
}
Campo Tipo Descrição
id string ID do lote para consultas
actions Array<NewAccount | NewAsset | NewTransfer> Lista com Ações a serem executadas
memo MemoValue Memo do Lote

ResponseToken

interface ResponseToken {
  token: string
}
Campo Tipo Descrição
token string Valor do token

Changelog

Acompanhe alterações de código na aba javascript à direita.

v0.9.0

Novas funcionalidades

Breaking changes

API

v0.8.0

Novas funcionalidades

Bugfixes

Breaking changes

API

SDK em Node.js

  interface NewTransferBatch {
    actions: NewTransfer[]
    memo?: string
  }

  interface NewTransfer {
    from: string
    to: string
    asset: string
    amount: string
  }
interface Response<T> {
  data: T
  error: Error
}

interface DataReceipt<T> {
  value: T
  receipt: Receipt
}
interface ResponseList<T> {
  data: DataReceipt<T>[]
  pagination: PaginationResponse
  error: Error
}

interface PaginationResponse {
  cursor: number
}

Contato

Possui alguma dúvida, sugestão ou gostaria de testar nossa solução? Entre em contato conosco pelos seguintes canais: