Documentação da API
Receitas de integração com BI
Exemplos prontos para copiar e colar que conectam ferramentas de BI e ambientes de execução comuns à API de relatórios da Saldo.tech. Cada receita pressupõe que você já gerou uma chave de API da instituição; caso contrário, acesse Painel → Chaves de API para criar uma.
Consulte a referência completa de endpoints e os detalhes de autenticação na documentação da API.
cURL
A forma mais rápida de verificar se sua chave funciona e explorar o formato das respostas pelo terminal.
# Last 30 days of redemptions
curl https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting/redemptions \
-H "Authorization: Bearer slk_..." \
| jq '.data | length'
# Filter by date range
curl "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting/redemptions?from=2026-04-01T00:00:00Z&to=2026-05-01T00:00:00Z" \
-H "Authorization: Bearer slk_..."
# Engagement funnel for the last 7 days
FROM=$(date -u -v-7d +"%Y-%m-%dT%H:%M:%SZ")
curl "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting/funnel?from=$FROM" \
-H "Authorization: Bearer slk_..."Python (requests + pandas)
Carregue todos os resgates em um DataFrame para análise ad hoc ou ingestão em pipeline. Lida com a paginação automaticamente.
import os
import requests
import pandas as pd
API_KEY = os.environ["SALDO_API_KEY"]
BASE = "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting"
def fetch_all(path: str, params: dict | None = None) -> list[dict]:
rows: list[dict] = []
cursor = None
while True:
q = {"limit": 1000, **(params or {})}
if cursor:
q["cursor"] = cursor
r = requests.get(
f"{BASE}/{path}",
headers={"Authorization": f"Bearer {API_KEY}"},
params=q,
timeout=30,
)
r.raise_for_status()
body = r.json()
rows.extend(body["data"])
cursor = body["pagination"]["next_cursor"]
if not cursor:
return rows
# Last quarter's redemptions
redemptions = fetch_all(
"redemptions",
{"from": "2026-02-01T00:00:00Z", "to": "2026-05-01T00:00:00Z"},
)
df = pd.json_normalize(redemptions)
print(df.groupby("offer.merchant_name")["institution_payout_amount"].sum().sort_values(ascending=False))Node.js (fetch)
Iterador assíncrono pronto para uso que pagina grandes conjuntos de resultados sem manter tudo em memória.
const API_KEY = process.env.SALDO_API_KEY;
const BASE = "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting";
async function* paginate(path, params = {}) {
let cursor = null;
while (true) {
const url = new URL(`${BASE}/${path}`);
Object.entries({ limit: 1000, ...params }).forEach(([k, v]) =>
url.searchParams.set(k, String(v)),
);
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const body = await res.json();
for (const row of body.data) yield row;
cursor = body.pagination.next_cursor;
if (!cursor) return;
}
}
let total = 0;
for await (const settlement of paginate("settlements", { status: "settled" })) {
total += settlement.institution_payout_amount;
}
console.log(`Total settled payouts: $${total.toFixed(2)}`);Google Sheets (Apps Script)
Atualize uma planilha com os KPIs mais recentes do funil sob demanda. Abra Extensões → Apps Script e cole isto.
function refreshFunnel() {
const apiKey = PropertiesService.getScriptProperties().getProperty("SALDO_API_KEY");
const url = "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting/funnel";
const res = UrlFetchApp.fetch(url, {
headers: { Authorization: "Bearer " + apiKey },
muteHttpExceptions: true,
});
const body = JSON.parse(res.getContentText());
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Funnel");
sheet.getRange("A1").setValue("Last refreshed");
sheet.getRange("B1").setValue(new Date());
sheet.getRange("A3:B3").setValues([["Metric", "Value"]]);
sheet.getRange("A4:B8").setValues([
["Widget Views", body.data.widget_views],
["Unique Cardholders", body.data.unique_cardholders],
["Offer Impressions", body.data.offer_impressions],
["Offer Adds", body.data.offer_add_successes],
["Redemptions", body.data.redemptions],
]);
}
// Set up: Project Settings → Script Properties → add SALDO_API_KEY
// Then Triggers → Add Trigger → refreshFunnel → Time-driven → daily.Power BI (Power Query M)
Conecte o Power BI diretamente ao seu livro de liquidações como fonte de dados atualizável. Percorre o cursor automaticamente.
let
ApiKey = "slk_...",
BaseUrl = "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting/settlements",
FetchPage = (cursor as nullable text) =>
let
Query = if cursor = null then [limit="1000"] else [limit="1000", cursor=cursor],
Source = Json.Document(Web.Contents(BaseUrl, [
Query = Query,
Headers = [#"Authorization" = "Bearer " & ApiKey]
]))
in Source,
Loop = List.Generate(
() => FetchPage(null),
each Record.HasFields(_, "data") and List.Count(_[data]) > 0,
each FetchPage(_[pagination][next_cursor]),
each _[data]
),
AllRows = List.Combine(Loop),
AsTable = Table.FromRecords(AllRows),
Typed = Table.TransformColumnTypes(AsTable, {
{"created_at", type datetimezone},
{"settled_at", type datetimezone},
{"merchant_funded_amount", Currency.Type},
{"saldo_revenue", Currency.Type},
{"institution_payout_amount", Currency.Type}
})
in
TypedMetabase (consulta HTTP)
Consulta HTTP nativa pronta para uso com o driver de requisições HTTP do Metabase. Funciona com qualquer um dos endpoints de relatórios JSON.
{
"method": "GET",
"url": "https://saldo-consumer-api-git-staging-kalantech.vercel.app/api/v1/reporting/redemptions",
"headers": {
"Authorization": "Bearer {{secret_api_key}}"
},
"parameters": {
"from": "{{from_date}}",
"to": "{{to_date}}",
"limit": 1000
},
"result": {
"path": "data"
}
}
# Define a Metabase secret named secret_api_key holding your slk_... value.
# Pass from_date / to_date as Metabase parameters in the dashboard filter UI.
# Note: cursor pagination is single-page in this driver — for more than
# 1000 rows, use a scheduled ETL into a SQL warehouse Metabase can read.Precisa de uma receita que não temos?
Conte-nos qual stack de BI você usa; estamos priorizando as integrações mais solicitadas a seguir.