NAV Navbar
shell ruby python javascript php

Introdução

Seja bem vindo a documentação API da Kaledo! Você pode utilizar esta API para controlar os diversos fluxos de utilização do nosso clube

Temos exemplos de implementação em: Shell, Ruby, Python, JavaScript e PHP! Veja os exemplos de implementação na area a direita e troque para a linguagem de programação que desejar

Chave de acesso

Uma chave de acesso será concedida para a utilização do nosso ambiente de sandbox ou produção.

Para utilizar o ambiente de sandbox garanta que as suas requisições estejam indo para o endereço: https://clubecore-staging.convenia.com.br além de utilizar a chave correspondente ao ambiente de sandbox

Para utilizar o ambiente de produção garanta que as suas requisições estejam indo para o endereço: https://clubecore.convenia.com.br além de utilizar a chave correspondente ao ambiente de produção

Será necessário utilizar a sua chave de acesso em todas as requisições

Clube

Criar e autenticar usuários - Authenticate

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "{{base_url}}/clube/v1/authenticate/(sua-chave-de-api)",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => array('document' => '123.456.789-01'),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("{{base_url}}/clube/v1/authenticate/(sua-chave-de-api)")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
form_data = [['document', '123.456.789-01']]
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=document;')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("123.456.789-01")
dataList.append('--'+boundary+'--')
dataList.append('')
body = '\r\n'.join(dataList)
payload = body
headers = {
   'Content-type': 'multipart/form-data; boundary={}'.format(boundary) 
}
conn.request("POST", "/clube/v1/authenticate/(sua-chave-de-api)", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
curl --location --request POST '{{base_url}}/clube/v1/authenticate/(sua-chave-de-api)' \
--form 'document=123.456.789-01'
var request = require('request');
var options = {
  'method': 'POST',
  'url': '{{base_url}}/clube/v1/authenticate/(sua-chave-de-api)',
  'headers': {
  },
  formData: {
    'document': '123.456.789-01'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": "",
  "data": "https://seu-dominio.com.br/login?token={{token}}&activate=true",
  "token": "{{token}}",
  "redirect": null,
  "success": true
}

Este endpoint é responsável por criar e autenticar o usuário. Caso o usuário não exista na nossa base ele será cadastrado neste momento. Caso o mesmo já exista, apenas a autenticação será realizada. O retorno deste endpoint será uma url de acesso ao seu clube. Basta redirecionar o usuário para essa url e ele entrará logado no clube

HTTP Request

POST https://{{base_url}}/clube/v1/authenticate/(sua-chave-de-api)

Query Parameters

Parameter Required Description
document true CPF do usuário. Pode ser enviado formatado ou não.
name false Primeiro nome do usuário.
last_name false Sobrenome do usuário.
email false Email do usuário.
birthday false Data de nascimento do usuário no formato YYYY-MM-DD (1970-12-30).
phone false Celular do usuário. Formato: XXXXXXXXXXX.
gender false Gênero do usuário, envie uma string com o gênero do mesmo.
state false Estado do usuário, envie uma string com as letras iniciais, ex: "SP".
city false Cidade do usuário, enviar em formato string, ex: "São Paulo".

Vitrine - Listagem de categorias

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/clube/v1/categories/(sua-chave-de-api)?limit=3&page=1",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/clube/v1/categories/(sua-chave-de-api)?limit=3&page=1")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Get.new(url)

response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("https://{{base_url}}")
payload = ''
headers = {}
conn.request("GET", "/clube/v1/categories/(sua-chave-de-api)?limit=3&page=1", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method GET \
  --timeout=0 \
  --header '' \
   'https://{{base_url}}/clube/v1/categories/(sua-chave-de-api)?limit=3&page=1'
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://{{base_url}}/clube/v1/categories/(sua-chave-de-api)?limit=3&page=1',
  'headers': {
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": "",
  "data": [
    {
      "id": "706f3380-dc4c-11e7-9541-53abaf05200b",
      "name": "Produtos e Serviços",
      "slug": "produtos-e-servicos"
    },
    {
      "id": "7071a4c0-dc4c-11e7-a3ba-f1d5eacf9e7e",
      "name": "Lazer",
      "slug": "lazer"
    },
    {
      "id": "70769a80-dc4c-11e7-1825-8185065dokpl",
      "name": "Bem-estar e saúde",
      "slug": "bem-estar-e-saude"
    },
    {
      "id": "70769a80-dc4c-11e7-8925-8185065d28de",
      "name": "Alimentos e Bebidas",
      "slug": "alimentos-e-bebidas"
    },
    {
      "id": "70769a80-dc4c-11e7-8925-8185065d2fet",
      "name": "Educação",
      "slug": "educacao"
    }
  ],
  "redirect": null,
  "success": true
}

Este endpoint permite fazer uma listagem das categorias que possuimos no clube, permitindo combinar as informações retornadas nas filtragens dos demais.

HTTP Request

GET https://{{base_url}}/clube/v1/categories/(sua-chave-de-api)

URL Parameters

Parameter Description
limit Limite de recursos a serem retornados pelo endpoint
page Os recursos serão retornados de forma paginada. Utilize este parâmetro para controlar a página do recurso

Vitrine - Listagem de parceiros

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/clube/v1/perks/(sua-chave-de-api)?limit=3&page=1",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/clube/v1/perks/(sua-chave-de-api)?limit=3&page=1")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Get.new(url)

response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("https://{{base_url}}")
payload = ''
headers = {}
conn.request("GET", "/clube/v1/perks/(sua-chave-de-api)?limit=3&page=1", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method GET \
  --timeout=0 \
  --header '' \
   'https://{{base_url}}/clube/v1/perks/(sua-chave-de-api)?limit=3&page=1'
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://{{base_url}}/clube/v1/perks/(sua-chave-de-api)?limit=3&page=1',
  'headers': {
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
    "message": null,
    "data": {
        "results": [
            {
                "slug": "convenia-75U",
                "name": "Parceiro Convenia",
                "description": "Convenia Parceiro",
                "logo": "https://www.example.com",
                "categories": [
                    {
                        "id": "706f3380-dc4c-11e7-9541-53abaf05200b",
                        "name": "Produtos e Serviços",
                        "slug": "produtos-e-servicos"
                    }
                ],
                "addresses": [
                    {
                      "state": "SP ",
                      "city": "São Paulo",
                      "code": "01234-567",
                      "complement": "",
                      "neighborhood": "Vila Mariana",
                      "number": "680 - Loja 5B ",
                      "street": "Rua Franca Pinto",
                    }
                ]
            },
            {
                "slug": "convenia-r55",
                "name": "Parceiro Convenia - 2",
                "description": "Convenia Parceiro - 2",
                "logo": "https://www.example2.com",
                "categories": [
                    {
                        "id": "706f3380-dc4c-11e7-9541-53abaf05200b",
                        "name": "Produtos e Serviços",
                        "slug": "produtos-e-servicos"
                    }
                ],
                "addresses": [
                    {
                      "state": "SP ",
                      "city": "São Paulo",
                      "code": "01234-567",
                      "complement": "",
                      "neighborhood": "Vila Mariana",
                      "number": "680 - Loja 5B ",
                      "street": "Rua Franca Pinto",
                    },
                    {
                      "state": "SP ",
                      "city": "São Paulo",
                      "code": "01234-567",
                      "complement": "",
                      "neighborhood": "Vila Mariana",
                      "number": "680 - Loja 5B ",
                      "street": "Rua Franca Pinto",
                    }
                ]
            },
            {
                "slug": "convenia-gs3",
                "name": "Parceiro Convenia - 3",
                "description": "Convenia Parceiro - 3",
                "logo": "https://www.example3.com",
                "categories": [
                    {
                        "id": "706f3380-dc4c-11e7-9541-53abaf05200b",
                        "name": "Produtos e Serviços",
                        "slug": "produtos-e-servicos"
                    }
                ],
                "addresses": []
            }
        ],
        "pagination": {
            "total": 6,
            "count": 3,
            "per_page": 3,
            "current_page": 1,
            "total_pages": 2
        }
    },
    "redirect": null,
    "success": true
}

Este endpoint permite fazer uma listagem de parceiros de forma limitada.

Este endpoint não exibe nenhuma informação que possibilite ao usuário fazer o resgate de algum benefício, para fazer a efetiva utilização do benefício utilize o endpoint Authenticate

Este endpoint retorna os resultados de forma paginada, para controlar a quantidade de recursos retornados utilize o parâmetro limit

HTTP Request

GET https://{{base_url}}/clube/v1/perks/(sua-chave-de-api)

URL Parameters

Parameter Description
limit Limite de recursos a serem retornados pelo endpoint
page Os recursos serão retornados de forma paginada. Utilize este parâmetro para controlar a página do recurso

Vitrine - Listagem de ofertas

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/clube/v1/campaigns/(sua-chave-de-api)",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/clube/v1/campaigns/(sua-chave-de-api)?limit=3&page=1")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Get.new(url)

response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("https://{{base_url}}")
payload = ''
headers = {}
conn.request("GET", "/clube/v1/campaigns/(sua-chave-de-api)?limit=3&page=1", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method GET \
  --timeout=0 \
  --header '' \
   'https://{{base_url}}/clube/v1/campaigns/(sua-chave-de-api)?limit=3'
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://{{base_url}}/clube/v1/campaigns/(sua-chave-de-api)',
  'headers': {
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": {
    "results": [
      {
        "id": "5f0306c0-mf87-7yhf-s901-alsmvuw92b34",
        "name": "Convenia Parceiro - 1",
        "title": "Título da oferta",
        "description": "Descrição do benefício",
        "slug": "convenia-parceiro-e0E",
        "symbol": "%",
        "value": 0,
        "event": "online",
        "perk_name": "Convenia Parceiro",
        "perk_logo": "https://www.example.com",
        "perk_slug": "convenia-perk-75U",
        "updated_at": 1694550836,
        "end_date": 1695414836,
        "how_to_use": [
          "Clique no botão abaixo para ser redirecionado ao ambiente da parceria;",
          "Clique no botão abaixo para ser redirecionado ao ambiente da parceria;",
        ],
        "important": "**\\- Oferta válida para seleção de produtos do site oficial do parceiro com até 25% que são cumulativos com 5% de desconto da parceria com o clube;**\n\\- Ao acessar o site os produtos já estarão com desconto aplicado;\n\\- Não cumulativa com outras promoções do pontofrio.com.br;\n\\- A melhor promoção será considerada no final da compra;\n\\- Não é válida para produtos de marketplace;\n\\- Não elegível ao frete.",
        "is_highlighted": 0
      },
      {
        "id": "5f0306c0-mf87-7yhf-s901-fkmiwhfybt6",
        "name": "Convenia Parceiro - 2",
        "title": "Título da oferta",
        "description": "Descrição do benefício",
        "slug": "convenia-parceiro-fwe",
        "symbol": "%",
        "value": 0,
        "event": "online",
        "perk_name": "Convenia Parceiro",
        "perk_logo": "https://www.example.com",
        "perk_slug": "convenia-perk-8uf",
        "updated_at": 1694550836,
        "end_date": 1695414836,
        "how_to_use": [
          "Clique no botão abaixo para ser redirecionado ao ambiente da parceria;",
          "Clique no botão abaixo para ser redirecionado ao ambiente da parceria;",
        ],
        "important": "**\\- Oferta válida para seleção de produtos do site oficial do parceiro com até 25% que são cumulativos com 5% de desconto da parceria com o clube;**\n\\- Ao acessar o site os produtos já estarão com desconto aplicado;\n\\- Não cumulativa com outras promoções do pontofrio.com.br;\n\\- A melhor promoção será considerada no final da compra;\n\\- Não é válida para produtos de marketplace;\n\\- Não elegível ao frete.",
        "is_highlighted": 0
      },
      {
        "id": "5f0306c0-mf87-7yhf-s901-fhsu128374hsv",
        "name": "Convenia Parceiro - 3",
        "title": "Título da oferta",
        "description": "Descrição do benefício",
        "slug": "convenia-parceiro-f8u",
        "symbol": "%",
        "value": 0,
        "event": "online",
        "perk_name": "Convenia Parceiro",
        "perk_logo": "https://www.example.com",
        "perk_slug": "convenia-perk-f23",
        "updated_at": 1694550836,
        "end_date": 1695414836,
        "how_to_use": [
          "Clique no botão abaixo para ser redirecionado ao ambiente da parceria;".
          "Clique no botão abaixo para ser redirecionado ao ambiente da parceria;".
        ],
        "important": "**\\- Oferta válida para seleção de produtos do site oficial do parceiro com até 25% que são cumulativos com 5% de desconto da parceria com o clube;**\n\\- Ao acessar o site os produtos já estarão com desconto aplicado;\n\\- Não cumulativa com outras promoções do pontofrio.com.br;\n\\- A melhor promoção será considerada no final da compra;\n\\- Não é válida para produtos de marketplace;\n\\- Não elegível ao frete.",
        "is_highlighted": 1
      }
    ],
    "pagination": {
      "total": 6,
      "count": 3,
      "per_page": 3,
      "current_page": 1,
      "total_pages": 2
    }
  },
  "redirect": null,
  "success": true
}

Este endpoint permite fazer uma listagem de ofertas de forma limitada. Este endpoint não exibe nenhuma informação que possibilite ao usuário fazer o resgate do benefício, para fazer a efetiva utilização do benefício utilize o endpoint Authenticate

Este endpoint retorna os resultados de forma paginada, para controlar a quantidade de recursos retornados utilize o parâmetro limit

O endpoint possui uma série de filtros, utilize-os como parâmetros na url, por exemplo: name=cinemark

Algumas opções de filtros disponíveis:

HTTP Request

GET https://{{base_url}}/clube/v1/campaigns/(sua-chave-de-api)

URL Parameters

Parameter Description
limit Limite de recursos a serem retornados pelo endpoint
page Os recursos serão retornados de forma paginada. Utilize este parâmetro para controlar a página do recurso

Vitrine - Listagem de banners

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/clube/v1/banners/(sua-chave-de-api)",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/clube/v1/banners/(sua-chave-de-api)?limit=3&page=1")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Get.new(url)

response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("https://{{base_url}}")
payload = ''
headers = {}
conn.request("GET", "/clube/v1/banners/(sua-chave-de-api)?limit=3&page=1", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method GET \
  --timeout=0 \
  --header '' \
   'https://{{base_url}}/clube/v1/banners/(sua-chave-de-api)?limit=3'
var request = require('request');
var options = {
  'method': 'GET',
  'url': 'https://{{base_url}}/clube/v1/banners/(sua-chave-de-api)',
  'headers': {
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": {
    "results": [
      {
        "id": "19fac352-0b68-404e-87aa-e88b8f1a6073",
        "name": "Banner Kaledo - Home",
        "link": "https://kaledo.com.br",
        "image": "https://kaledo.com.br/banner.png",
        "end_date": "2024-02-12",
        "image_secondary": "http://www.feest.biz/",
        "partner_slug": "kaledo-partner-x8jd",
        "campaign_slug": "kaledo-campaign-x901",
        "type": 0
      },
      {
        "id": "19fac352-0b68-404e-87aa-e88b8f1a6073",
        "name": "Banner Kaledo - Resultado",
        "link": "https://kaledo.com.br",
        "image": "https://leffler.info/dolorum-qui-aliquam-aut-dolorum-similique-illo.html",
        "end_date": "2024-02-12",
        "image_secondary": "http://www.feest.biz/",
        "partner_slug": "kaledo-partner-x8jd",
        "campaign_slug": "kaledo-campaign-x901",
        "type": 1
      },
      {
        "id": "19fac352-0b68-404e-87aa-e88b8f1a6073",
        "name": "Banner Kaledo - Home - Insitucional (sem parceiro ou oferta)",
        "link": "https://kaledo.com.br",
        "image": "https://leffler.info/dolorum-qui-aliquam-aut-dolorum-similique-illo.html",
        "end_date": "2024-02-12",
        "image_secondary": "http://www.feest.biz/",
        "partner_slug": null,
        "campaign_slug": null,
        "type": 0
      }
    ],
    "pagination": {
      "total": 3,
      "count": 3,
      "per_page": 3,
      "current_page": 1,
      "total_pages": 2
    }
  },
  "redirect": null,
  "success": true
}

Este endpoint permite fazer uma listagem de banners de forma limitada, projetado para ser utilizado em uma vitrine esse endpoint não necessita de tokens em seu header, sendo o único campo obrigatório para a sua utilização uma chave de API válida.

Este endpoint retorna os resultados de forma paginada, para controlar a quantidade de recursos retornados utilize o parâmetro limit

O endpoint possui uma série de filtros, utilize-os como query params na url, por exemplo: name=cinemark

Algumas opções de filtros disponíveis:

Exemplo:

GET https://{{base_url}}/clube/v1/banners/(sua-chave-de-api)?home=true

HTTP Request

GET https://{{base_url}}/clube/v1/banners/(sua-chave-de-api)

URL Parameters

Parameter Description
limit Limite de recursos a serem retornados pelo endpoint
page Os recursos serão retornados de forma paginada. Utilize este parâmetro para controlar a página do recurso

Gestor

Aqui estão os endpoints de acesso da nossa area administrativa (gestor.convenia.com.br)

OBS: importante lembrar que para ter acesso a estes endpoints é necessário ter uma conta ativa e que tenha acesso ao painel do gestor

Login gestor

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "{{base_url}}/painel/v1/authenticate/(sua-chave-de-api)",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => array('document' => '12345678901','password' => 'swordfish'),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/painel/v1/authenticate/(sua-chave-de-api)")

http = Net::HTTP.new(url.host, url.port);
request = Net::HTTP::Post.new(url)
form_data = [['document', '12345678901'],['password', 'swordfish']]
request.set_form form_data, 'multipart/form-data'
response = http.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=document;')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("12345678901")
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=password;')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("swordfish")
dataList.append('--'+boundary+'--')
dataList.append('')
body = '\r\n'.join(dataList)
payload = body
headers = {
   'Content-type': 'multipart/form-data; boundary={}'.format(boundary) 
}
conn.request("POST", "https://{{base_url}}/painel/v1/authenticate/(sua-chave-de-api)", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method POST \
  --timeout=0 \
  --header '' \
  --body-data 'document=12345678901&password=swordfish' \
   'https://{{base_url}}/painel/v1/authenticate/(sua-chave-de-api)'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://{{base_url}}/painel/v1/authenticate/(sua-chave-de-api)',
  'headers': {
  },
  formData: {
    'document': '12345678901',
    'password': 'swordfish'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": [
    {
      "id": "7042f7a0-abcd-11e7-ae9a-07sh17abvk72",
      "name": "Usuário Convenia",
      "email": "clubeconvenia@example.com",
      "document": "123.456.789-10",
      "birthday": "1970-01-01",
      "gender": "masculino",
      "civil_state": "1",
      "state": null,
      "city": null,
      "extra": null,
      "avatar": null,
      "created_at": 1512767851,
      "updated_at": "2019-02-12 17:21:05",
      "deleted_at": null,
      "phone": "(99) 99999-9999",
      "last_name": "Connvenia"
    },
    {
      "token": "{{ token }}"
    }
  ],
  "redirect": null,
  "success": true
}

Utilize esse endpoint para fazer login no gestor e receber o token que será necessário para as próximas requisições.

Este token tem validade de 15 dias, após a expiração é necessário realizar um novo processo de login

HTTP Request

POST https://{{base_url}}/painel/v1/authenticate/(sua-chave-de-api)

Query Parameters

Parameter Required Description
document true CPF do usuário. Pode ser enviado formatado ou não.
password true Senha do usuário.

Habilitar usuários

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/invite",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => array('users[0]' => '123456778912','users[1]' => '987765543210'),
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer token-no-formato-jwt-gerado-no-login"
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/invite")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer token-no-formato-jwt-gerado-no-login"
form_data = [['users[0]', '123456778912'],['users[1]', '987765543210']]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[0];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("123456778912")
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[1];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("987765543210")
dataList.append('--'+boundary+'--')
dataList.append('')
body = '\r\n'.join(dataList)
payload = body
headers = {
  'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login',
  'Content-type': 'multipart/form-data; boundary={}'.format(boundary)
}
conn.request("POST", "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/invite", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method POST \
  --timeout=0 \
  --header 'Authorization: Bearer token-no-formato-jwt-gerado-no-login' \
  --body-data 'users[0]=123456778912&users[1]=987765543210' \
   'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/invite'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/invite',
  'headers': {
    'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login'
  },
  formData: {
    'users[0]': '123456778912',
    'users[1]': '987765543210'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": "",
  "data": {
    "invited": [],
    "existent": [],
    "invalid": [
      "123456778912",
      "987765543210"
    ],
    "type": null
  },
  "redirect": null,
  "success": true
}

Utilize esse endpoint para habilitar usuários e permitir que os mesmos acessem o seu clube.

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

Envie um array com os CPF's dos usuários que deseja habilitar

HTTP Request

POST https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/invite

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
users[0] true CPF do usuário. Pode ser enviado formatado ou não: 123456778912
users[1] true CPF do usuário. Pode ser enviado formatado ou não: 987765543210

Bloquear usuários

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/block",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => array('users[0]' => '123456778912','users[1]' => '987765543210'),
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer token-no-formato-jwt-gerado-no-login"
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/block")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer token-no-formato-jwt-gerado-no-login"
form_data = [['users[0]', '123456778912'],['users[1]', '987765543210']]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[0];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("123456778912")
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[1];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("987765543210")
dataList.append('--'+boundary+'--')
dataList.append('')
body = '\r\n'.join(dataList)
payload = body
headers = {
  'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login',
  'Content-type': 'multipart/form-data; boundary={}'.format(boundary)
}
conn.request("POST", "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/block", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method POST \
  --timeout=0 \
  --header 'Authorization: Bearer token-no-formato-jwt-gerado-no-login' \
  --body-data 'users[0]=123456778912&users[1]=987765543210' \
   'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/block'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/block',
  'headers': {
    'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login'
  },
  formData: {
    'users[0]': '123456778912',
    'users[1]': '987765543210'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": {
    "errors": [],
    "blocked": [
      "12345678901",
      "09876543209",
      "09876543212"
    ],
    "errors_count": 0,
    "blocked_count": 3
  },
  "redirect": null,
  "success": true
}

Utilize este endpoint para bloquear os usuários em batch. Envie um array com os CPF's dos usuários que deseja bloquear

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

HTTP Request

POST https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/block

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
users[0] true CPF do usuário. Pode ser enviado formatado ou não: 123456778912
users[1] true CPF do usuário. Pode ser enviado formatado ou não: 987765543210

Desbloquear usuários

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/unblock",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => array('users[0]' => '123456778912','users[1]' => '987765543210'),
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer token-no-formato-jwt-gerado-no-login"
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/unblock")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer token-no-formato-jwt-gerado-no-login"
form_data = [['users[0]', '123456778912'],['users[1]', '987765543210']]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[0];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("123456778912")
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[1];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("987765543210")
dataList.append('--'+boundary+'--')
dataList.append('')
body = '\r\n'.join(dataList)
payload = body
headers = {
  'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login',
  'Content-type': 'multipart/form-data; boundary={}'.format(boundary)
}
conn.request("POST", "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/unblock", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method POST \
  --timeout=0 \
  --header 'Authorization: Bearer token-no-formato-jwt-gerado-no-login' \
  --body-data 'users[0]=123456778912&users[1]=987765543210' \
   'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/unblock'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/unblock',
  'headers': {
    'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login'
  },
  formData: {
    'users[0]': '123456778912',
    'users[1]': '987765543210'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": {
    "errors": [],
    "unblocked": [
      "12345678901",
      "09876543209",
      "09876543212"
    ],
    "errors_count": 0,
    "unblocked_count": 3
  },
  "redirect": null,
  "success": true
}

Utilize este endpoint para desbloquear os usuários em batch. Envie um array com os CPF's dos usuários que deseja desbloquear

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

HTTP Request

POST https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/unblock

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
users[0] true CPF do usuário. Pode ser enviado formatado ou não: 123456778912
users[1] true CPF do usuário. Pode ser enviado formatado ou não: 987765543210

Deletar usuários

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/remove",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => array('users[0]' => '123456778912','users[1]' => '987765543210'),
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer token-no-formato-jwt-gerado-no-login"
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/remove")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = "Bearer token-no-formato-jwt-gerado-no-login"
form_data = [['users[0]', '123456778912'],['users[1]', '987765543210']]
request.set_form form_data, 'multipart/form-data'
response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
dataList = []
boundary = 'wL36Yn8afVp8Ag7AmP8qZ0SA4n1v9T'
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[0];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("123456778912")
dataList.append('--' + boundary)
dataList.append('Content-Disposition: form-data; name=users[1];')

dataList.append('Content-Type: {}'.format('multipart/form-data'))
dataList.append('')

dataList.append("987765543210")
dataList.append('--'+boundary+'--')
dataList.append('')
body = '\r\n'.join(dataList)
payload = body
headers = {
  'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login',
  'Content-type': 'multipart/form-data; boundary={}'.format(boundary)
}
conn.request("POST", "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/remove", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method POST \
  --timeout=0 \
  --header 'Authorization: Bearer token-no-formato-jwt-gerado-no-login' \
  --body-data 'users[0]=123456778912&users[1]=987765543210' \
   'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/remove'
var request = require('request');
var options = {
  'method': 'POST',
  'url': 'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/remove',
  'headers': {
    'Authorization': 'Bearer token-no-formato-jwt-gerado-no-login'
  },
  formData: {
    'users[0]': '123456778912',
    'users[1]': '987765543210'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": {
    "errors": [],
    "removed": [
      "12345678901",
      "09876543209",
      "09876543212"
    ],
    "errors_count": 0,
    "removed_count": 3
  },
  "redirect": null,
  "success": true
}

Utilize este endpoint para deletar os usuários em batch. Envie um array com os CPF's dos usuários que deseja remover.

Atenção, após realizada, essa operação não poderá ser desfeita e todos os dados do usuário dentro do seu clube como: cupons, vouchers e saldo de cashback serão permanentemente removidos.

OBS: Este endpoint aceita no máximo 500 usuários por requisição

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

HTTP Request

POST https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/remove

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
users[0] true CPF do usuário. Pode ser enviado formatado ou não: 123456778912
users[1] true CPF do usuário. Pode ser enviado formatado ou não: 987765543210

Atualizar dados de usuário

<?php

$curl = curl_init();

$cpf = '123.456.789-01';

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/$cpf",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PATCH",
  CURLOPT_POSTFIELDS => "name=Usuario&last_name=Convenia",
  CURLOPT_HTTPHEADER => array(
    "Content-Type: application/x-www-form-urlencoded"
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
require "uri"
require "net/http"

url = URI("https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/{cpf}")

https = Net::HTTP.new(url.host, url.port);
https.use_ssl = true

request = Net::HTTP::Patch.new(url)
request["Content-Type"] = "application/x-www-form-urlencoded"
request.body = "name=Usuario&last_name=Convenia"

response = https.request(request)
puts response.read_body
import http.client
import mimetypes
conn = http.client.HTTPSConnection("{{base_url}}")
payload = 'name=Usuario&last_name=Convenia'
headers = {
  'Content-Type': 'application/x-www-form-urlencoded'
}
conn.request("PATCH", "https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/{cpf}", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
wget --no-check-certificate --quiet \
  --method PATCH \
  --timeout=0 \
  --header 'Content-Type: application/x-www-form-urlencoded' \
  --body-data 'name=Usuario&last_name=Convenia' \
   'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/{cpf}'
var request = require('request');
var options = {
  'method': 'PATCH',
  'url': 'https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/{cpf}',
  'headers': {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  form: {
    'name': 'Usuario',
    'last_name': 'Convenia'
  }
};
request(options, function (error, response) { 
  if (error) throw new Error(error);
  console.log(response.body);
});

As chamadas acima terão um retorno como este:

{
  "data": {
    "name": "Usuario",
    "last_name": "Convenia",
    "email": "usuario1@convenia.com.br",
    "phone": "(11) 1234-45678",
    "birthday": "1909-03-15 00:00:00",
    "gender": "masculino",
    "city": "São Paulo",
    "state": "SP",
    "avatar": "https://example.com"
  }
}

Utilize esse endpoint para atualizar os dados de **Nome e Sobrenome do seu usuário.

Utilize o cpf do usuário na rota substituindo a palavra cpf pelo respectivo cpf. Exemplo:

https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/123456789122

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

HTTP Request

PATCH https://{{base_url}}/painel/v1/company/(sua-chave-de-api)/user/{cpf}

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
name true Primeiro nome do usuário.
last_name false Sobrenome do usuário.

Obter lista de relatórios disponíveis

<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://{{base_url}}/painel/v1/company/{{chave_api}}/report/list",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer {{token}}",
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
require 'uri'
require 'net/http'

url = URI("http://{{base_url}}/painel/v1/company/{{chave_api}}/report/list")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer {{token}}'
request["cache-control"] = 'no-cache'

response = http.request(request)
puts response.read_body
import http.client

conn = http.client.HTTPConnection("{{base_url}}")

headers = {
    'Authorization': "Bearer {{token}}",
    'cache-control': "no-cache",
    }

conn.request("GET", "painel,v1,company,{{chave_api}},report,list", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
wget --quiet \
  --method GET \
  --header 'Authorization: Bearer {{token}}' \
  --header 'cache-control: no-cache' \
  --output-document \
  - 'http://{{base_url}}/painel/v1/company/{{chave_api}}/report/list'
var request = require("request");

var options = { method: 'GET',
  url: 'http://{{base_url}}/painel/v1/company/{{chave_api}}/report/list',
  headers: 
   { 
     'cache-control': 'no-cache',
     Authorization: 'Bearer {{token}}' } 
    };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": [
    {
      "name": "Cliques",
      "text": "Acesse o histórico de cliques realizados pelos usuários nas ofertas do clube Convenia.",
      "url": "click",
      "period": true
    },
    {
      "name": "Ofertas",
      "text": "Confira todas as ofertas ativas no clube atualmente.",
      "url": "campaigns",
      "period": false
    },
    {
      "name": "Parceiros",
      "text": "Veja a relação de todos os parceiros disponibilizados pelo clube Convenia.",
      "url": "perks",
      "period": false
    },
    {
      "name": "Parceiros exclusivos",
      "text": "Veja a relação dos parceiros exclusivos cadastrados no seu clube.",
      "url": "exclusive-perks",
      "period": false
    },
    {
      "name": "Usuários ativos",
      "text": "Confira todos os usuários que se cadastraram e acessaram seu clube pelo menos uma vez.",
      "url": "users",
      "period": true
    },
    {
      "name": "CPF's habilitados",
      "text": "Veja a relação de CPF's dos usuários que estão habilitados para acessar o seu clube.",
      "url": "documents",
      "period": false
    },
    {
      "name": "Login de usuários ativos",
      "text": "Acesse o histórico de acessos realizados pelos usuários ativos no seu clube.",
      "url": "login",
      "period": true
    },
    {
      "name": "Cliques exclusivos",
      "text": "Acesse o histórico de cliques realizados pelos usuários nas ofertas exclusivas do seu clube.",
      "url": "exclusive-click",
      "period": true
    },
    {
      "name": "Ofertas exclusivas",
      "text": "Confira a relação das ofertas exclusivas cadastradas no seu clube.",
      "url": "exclusive-campaigns",
      "period": false
    },
    {
      "name": "Compras",
      "text": "Veja as transações realizadas pelos usuários em descontos do tipo \"Compras\" disponibilizados no clube",
      "url": "users-purchases",
      "period": true
    }
  ],
  "redirect": null,
  "success": true
}

Utilize esse endpoint para obter a lista de relatórios que são disponibilizados no painel do gestor. Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

Retorno

Parameter Description
name nome do relatório
text descrição do relatório
url link do relatório (deverá ser usado no próximo endpoint da documentação)
period período do relatório, caso true o relatório pode ser gerado com um intervalo de tempo, podendo se escolher uma data de início e outra de fim. Caso essa opção seja utilizada, enviar os parâmetros: start_date e end_date como query params no formato YYYY-mm-dd ex: ?start_date=2019-09-01&end_date=2019-09-02

HTTP Request

GET https://{{base_url}}/painel/v1/company/(sua-chave-de-api/report/list

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Obter relatório

<?php

$curl = curl_init();
$report = "relatorio-desejado";

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://{{base_url}}/painel/v1/company/{{chave_api}}/report/$report",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer {{token}}",
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
require 'uri'
require 'net/http'

url = URI("http://{{base_url}}/painel/v1/company/{{chave_api}}/report/{{url}}")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer {{token}}'
request["cache-control"] = 'no-cache'

response = http.request(request)
puts response.read_body
import http.client

conn = http.client.HTTPConnection("{{base_url}}")

headers = {
    'Authorization': "Bearer {{token}}",
    'cache-control': "no-cache",
    }

conn.request("GET", "painel,v1,company,{{chave_api}},report,{{url}}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
wget --quiet \
  --method GET \
  --header 'Authorization: Bearer {{token}}' \
  --header 'cache-control: no-cache' \
  --output-document \
  - 'http://{{base_url}}/painel/v1/company/{{chave_api}}/report/{{url}}'
var request = require("request");

var options = { method: 'GET',
  url: 'http://{{base_url}}/painel/v1/company/{{chave_api}}/report/{{url}}',
  headers: 
   { 
     'cache-control': 'no-cache',
     Authorization: 'Bearer {{token}}' } 
    };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

As chamadas acima terão um retorno como este:

{
  "message": "processing",
  "data": {
    "processing": true
  },
  "redirect": null,
  "success": true
}

Utilize esse endpoint para obter um relatório a partir da listagem anterior de relatórios. Após requisitar o relatório o mesmo será enviado para o email do gestor que fez a requisição

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

Aqui deverá ser utilizado o valor retornado no campo url do endpoint anterior

HTTP Request

GET https://{{base_url}}/painel/v1/company/(sua-chave-de-api/report/{{url}}

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
start_date false Data de início do relatório (se aplicável ao relatório em questão). Enviar como query param. Ex: https://{{base_url}}/painel/v1/company/(sua-chave-de-api/report/{{url}}?start_date=2019-09-01&end_date=2019-09-02
end_date false Data de início do relatório (se aplicável ao relatório em questão). Enviar como query param. Ex: https://{{base_url}}/painel/v1/company/(sua-chave-de-api/report/{{url}}?start_date=2019-09-01&end_date=2019-09-02

Criar parceiros exclusivos

<?php

$curl = curl_init();
$report = "relatorio-desejado";

curl_setopt_array($curl, array(
  CURLOPT_URL => "http://{{base_url}}/painel/v1/company/{{chave_api}}/report/$report",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "Authorization: Bearer {{token}}",
    "cache-control: no-cache"
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
require 'uri'
require 'net/http'

url = URI("http://{{base_url}}/painel/v1/company/{{chave_api}}/report/{{url}}")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer {{token}}'
request["cache-control"] = 'no-cache'

response = http.request(request)
puts response.read_body
import http.client

conn = http.client.HTTPConnection("{{base_url}}")

headers = {
    'Authorization': "Bearer {{token}}",
    'cache-control': "no-cache",
    }

conn.request("GET", "painel,v1,company,{{chave_api}},report,{{url}}", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
wget --quiet \
  --method GET \
  --header 'Authorization: Bearer {{token}}' \
  --header 'cache-control: no-cache' \
  --output-document \
  - 'http://{{base_url}}/painel/v1/company/{{chave_api}}/report/{{url}}'
var request = require("request");

var options = { method: 'GET',
  url: 'http://{{base_url}}/painel/v1/company/{{chave_api}}/report/{{url}}',
  headers: 
   { 
     'cache-control': 'no-cache',
     Authorization: 'Bearer {{token}}' } 
    };

request(options, function (error, response, body) {
  if (error) throw new Error(error);

  console.log(body);
});

As chamadas acima terão um retorno como este:

{
  "message": "processing",
  "data": {
    "processing": true
  },
  "redirect": null,
  "success": true
}

Utilize esse endpoint para obter um relatório a partir da listagem anterior de relatórios. Após requisitar o relatório o mesmo será enviado para o email do gestor que fez a requisição

Neste endpoint é necessário ustilizar o token gerado no passo Login do painel do gestor

Aqui deverá ser utilizado o valor retornado no campo url do endpoint anterior

HTTP Request

GET https://{{base_url}}/painel/v1/company/(sua-chave-de-api/report/{{url}}

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
start_date false Data de início do relatório (se aplicável ao relatório em questão). Enviar como query param. Ex: https://{{base_url}}/painel/v1/company/{{sua-chave-de-api}}/report/{{url}}?start_date=2019-09-01&end_date=2019-09-02
end_date false Data de início do relatório (se aplicável ao relatório em questão). Enviar como query param. Ex: https://{{base_url}}/painel/v1/company/{{sua-chave-de-api}}/report/{{url}}?start_date=2019-09-01&end_date=2019-09-02

Importação de base em massa (via CSV)

<?php
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import-preview",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"model-importacao.csv\"\r\nContent-Type: text/csv\r\n\r\n\r\n-----011000010111000001101001--\r\n",
  CURLOPT_HTTPHEADER => [
    "Authorization: {{ token }}",
    "Content-Type: multipart/form-data; boundary=---011000010111000001101001"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
curl --request POST \
  --url https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import-preview \
  --header 'Authorization: {{ token }}' \
  --header 'Content-Type: multipart/form-data' \
  --form 'file=@model-importacao.csv'
const form = new FormData();
form.append("file", "model-importacao.csv");

fetch("http://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import-preview", {
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data",
    "Authorization": "{{ token }}"
  }
})
  .then(response => {
    console.log(response);
  })
  .catch(err => {
    console.error(err);
  });

axios.request(options).then(function (response) {
  console.log(response.data);
}).catch(function (error) {
  console.error(error);
});

As chamadas acima terão um retorno como este:

{
  "message": "",
  "data": {
    "id": "{{ id_da_importação }}",
    "status": 1
  },
  "redirect": null,
  "success": true
}

A importação de base em massa é feita através de 3 processos:

1- Preview de importação: neste processo a base é enviada para este endpoint para ser pré processada. Assim que o processamento for finalizado, um "resumo" da importação será retornado informando quais os CPF's serão cadastrados, mantidos ou removidos. Além disso, também serão exibidos os que estiverem com algum erro ou que estão repetidos no arquivo.

2- Após verificar o resumo, o endpoint de confirmar a importação será utilizado para dar prosseguimento ao processo de importação, após a finalização do mesmo um email é enviado para o usuário que solicitou a importação informando que o processo foi finalizado.

3- O endpoint de status pode ser consultado a qualquer momento para se verificar o status da importação de base

Passo 1: Preview de importação

Utilize este endpoint para dar início ao processo de atualização de base. Para isso, envie um arquivo seguindo este modelo.

OBS: O arquivo deve conter TODOS os CPF's que devem ter acesso ao clube. Os CPF's que não estiverem no arquivo e por sua vez já estejam no clube serão excluídos. Os CPF's que não estão no clube e estão no arquivo serão convidados e poderão ativar a sua conta posteriormente.

O processo de atualização será cancelado automaticamente após 1 hora caso a confirmação não ocorra.

Após o envio correto para este endpoint, será retornado um ID de importação. Esse id deverá ser usado para consultar o status da importação e para confirmar a mesma.

HTTP Request

POST https://{{base_url}}/painel/v1/company/{{sua-chave-de-api}}/import-preview

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
file true Arquivo de importação. Deve ser nos formatos xls, xlsx ou csv.
Coluna A1 OBRIGATÓRIAMENTE deve conter o nome "CPF"

Confirmar importação de base

<?php
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "http://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "",
  CURLOPT_HTTPHEADER => [
    "Authorization: {{ token }}",
    "Content-Type: multipart/form-data"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
curl --request POST \
  --url https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}} \
  --header 'Authorization: {{ token }}' \
  --header 'Content-Type: multipart/form-data'
const form = new FormData();

fetch("https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}", {
  "method": "POST",
  "headers": {
    "Content-Type": "multipart/form-data",
    "Authorization": "{{ token }}"
  }
})
  .then(response => {
    console.log(response);
  })
  .catch(err => {
    console.error(err);
  });

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": null,
  "redirect": null,
  "success": true
}

Utilize esse endpoint para confirmar a importação referenciada pelo id da importação

HTTP Request

POST https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
id_importacao true Id da importação

Verificar status da importação de base

<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "http://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}/status",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_POSTFIELDS => "",
  CURLOPT_HTTPHEADER => [
    "Authorization: {{ token }}",
    "Content-Type: multipart/form-data"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
curl --request GET \
  --url http://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}/status \
  --header 'Authorization: {{ token }}' \
  --header 'Content-Type: multipart/form-data'
const form = new FormData();

fetch("https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}/status", {
  "method": "GET",
  "headers": {
    "Content-Type": "multipart/form-data",
    "Authorization": "{{ token }}}}"
  }
})
  .then(response => {
    console.log(response);
  })
  .catch(err => {
    console.error(err);
  });

As chamadas acima terão um retorno como este:

{
  "message": null,
  "data": {
    "status": "{{ código do status da importação }}",
    "details": {
      "file": "{{ quantidade total de cpfs enviados }}",
      "kept": "{{ quantidade de cpfs mantidos }}",
      "type": 0,
      "keyLow": "{{id da importação }}",
      "created": "{{ quantidade de cpfs novos }}",
      "invalid": "{{ quantidade de cpfs invalidos }}",
      "removed": "{{ quantidade de cpfs removidos }}",
      "confirmed": "{{ confirmação de importação. Valores: TRUE ou FALSE }}",
      "duplicated": "{{ quantidade de cpfs duplicados }}"
    }
  },
  "redirect": null,
  "success": true
}

Utilize esse endpoint para verifica o status da importação referenciada pelo id de importação.

Código dos status:
0 = "Preview em progresso"
1 = "Preview finalizado (aguardando confirmação)"
2 = "Atualização em progresso"
3 = "Atualização finalizada"
4 = "Preview cancelado"
5 = "Erro interno"
6 = "Arquivo sem documentos válidos"

HTTP Request

GET https://{{base_url}}/painel/v1/company/{{sua-chave-da-api}}/import/{{id-da-importacao}}/status

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
id_importacao true Id da importação

Criação de Banners

Os banners são imagens com destaque que serão disponibilizadas dentro da plataforma. Essas imagens poderão ter relação direta com um parceiro/oferta, permitindo que esse vínculo ocorra no momento do cadastro

OBS: Só é permitido a existência de 3 banners online no clube, portanto, antes de cadastrar um novo, será necessário inativar algum outro.

<?php
$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "http://{{base_url}}/painel/v1/banner",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"name\"\r\n\r\nTeste Banner\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"type\"\r\n\r\n1\r\n-----0010111000001101001\r\nContent-Disposition: form-data; name=\"image\"; filename=\"kaledo.PNG\"\r\nContent-Type: image/png\r\n\r\n\r\n-----011000001101001\r\nContent-Disposition: form-data; name=\"start_date\"\r\n\r\n2023-01-30 00:00:01\r\n-----0110000100001101001\r\nContent-Disposition: form-data; name=\"status\"\r\n\r\n1\r\n-----010111000001101001\r\nContent-Disposition: form-data; name=\"end_date\"\r\n\r\n2025-01-30 10:00:00\r\n-----0110000101110001\r\nContent-Disposition: form-data; name=\"image_secondary\"; filename=\"kaledo.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data;"
  CURLOPT_COOKIE => "dtCookie=v_4_srv_3_sn_3BC61CE6A7790B1737F61401EF8_perc_100000_ol_0_mul_1_app-3Aea7c4b59f27d43eb_1",
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer {{ token }}",
    "Content-Type: multipart/form-data; boundary=---011000010111000001101001"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
curl --request POST \
  --url https://{{ base_url }}/painel/v1/banner \
  --header 'Authorization: Bearer {{ token }}' \
  --header 'Content-Type: multipart/form-data; boundary=---011000010111000001101001' \
  --cookie dtCookie=v_4_srv_3_sn_3BC61CH9S8DHF37F4A69261401EF8_perc_100000_ol_0_mul_1_app-3Aea7c4b59f27d43eb_1 \
  --form name=Teste Banner \
  --form '{{image}}' \
  --form 'start_date=2023-01-30 00:00:01' \
  --form status=1 \
  --form 'end_date=2025-01-30 10:00:00' \
  --form '{{image}}' \
const form = new FormData();

form.append("name", "Teste Banner");
form.append("image", "C:\\Users\User\kaledo.png");
form.append("start_date", "2023-01-30 00:00:01");
form.append("status", "1");
form.append("end_date", "2025-01-30 10:00:00");
form.append("image_secondary", "C:\\Users\\User\\kaledo.jpg");

fetch("http://{{base_url}}/painel/v1/banner", {
  "method": "POST",
  "headers": {
    "cookie": "dtCookie=v_4_srv_3_sn_3BC61CE6fs778shdfA69261401EF8_perc_100000_ol_0_mul_1_app-jf8s7amofs",
    "Content-Type": "multipart/form-data; boundary=---011000010111000001101001",
    "Authorization": "Bearer {{token}}"
  }
})
  .then(response => {
    console.log(response);
  })
  .catch(err => {
    console.error(err);
  });

As chamadas acima terão um retorno como este:

{
  "message": "",
  "data": {
    "id": "fa6ea390-e65e-11eb-bdde-1d13a11s8b8d",
    "name": "Teste Banner",
    "image": "https://clube-newcore.s3.us-west-2.amazonaws.com/banners/testebanner.png",
    "status": 1,
    "created_at": 1626458116,
    "updated_at": 1626458116,
    "image_secondary": "https://clube-newcore.s3.us-west-2.amazonaws.com/banners/testebanner_secundary.png",
    "start_date": 1675047601,
    "end_date": 1738242000,
    "campaign_id": null,
    "partner_id": null,
  },
  "redirect": null,
  "success": true
}

Utilize esse endpoint para criar um banner exclusivo

HTTP Request

POST https://{{base_url}}/painel/v1/banner

Headers

Parameter Required Description
Authorization true Bearer token-no-formato-jwt-gerado-no-login

Query Parameters

Parameter Required Description
name true Nome do banner
start_date true Data de ínicio do banner no formato YYYY-mm-dd HH:mm:ss
end_date false Data final do banner (YYYY-mm-dd HH:mm:ss)
partner_id false Id do parceiro do banner
campaign_id false Id da campanha do banner
status true Status do banner (ativo =1 ou agendado)

Os parametros abaixo devem ser enviados como file

Parameter Required Description
image true Imagem principal
image_secondary ture Imagem secundaria (mobile)

Errors

A API da Kaledo apresenta os seguintes erros HTTP:

Error Code Meaning
400 Bad Request -- Your request is invalid.
401 Unauthorized -- Your API key is wrong.
403 Forbidden -- The kitten requested is hidden for administrators only.
404 Not Found -- The specified kitten could not be found.
405 Method Not Allowed -- You tried to access a kitten with an invalid method.
406 Not Acceptable -- You requested a format that isn't json.
410 Gone -- The kitten requested has been removed from our servers.
418 I'm a teapot.
429 Too Many Requests -- You're requesting too many kittens! Slow down!
500 Internal Server Error -- We had a problem with our server. Try again later.
503 Service Unavailable -- We're temporarily offline for maintenance. Please try again later.