EntrarRegistar

A API do P2P Dash

Os dados da tua carteira P2P em JSON, para uma folha de cálculo, um script ou o teu próprio dashboard. Crias um token na tua conta, envia-lo com cada pedido e recebes os mesmos números que vês no P2P Dash.

Só de leituraGrátisPrimeira versão

O teu primeiro pedido

Três passos num terminal em macOS ou Linux. Se preferires começar no Google Sheets, tens um exemplo mais abaixo.

1

Cria um token

No P2P Dash, abre o menu de utilizador e entra em «Tokens de API». Dá um nome ao token, escolhe «Leitura» em «Os teus dados» e define quando expira. O token só aparece uma vez, por isso copia-o logo.

2

Mantém-no fora do código

Guarda-o numa variável de ambiente, aqui P2PDASH_TOKEN, e não num ficheiro que partilhas. Quem tiver o token pode ler os teus números.

3

Envia um pedido

Cada pedido leva o token no cabeçalho Authorization. A resposta vem em JSON, com os teus dados dentro de data.

Pedido
export P2PDASH_TOKEN="p2pdash_..."

curl https://app.p2pdash.com/api/v1/account/summary \
  -H "Authorization: Bearer $P2PDASH_TOKEN"

No Windows, em PowerShell, define o token com $env:P2PDASH_TOKEN = "p2pdash_...", escreve curl.exe em vez de curl, põe o pedido numa só linha e usa $env:P2PDASH_TOKEN no cabeçalho.

Resposta
{
  "data": {
    "platformCount": 4,
    "firstDate": "2021-03-02",
    "lastDate": "2026-11-09",
    "interest": 1781.4,
    "principalRepayment": 37443.05,
    "fee": 12.4,
    "tax": 0,
    "bonus": 85,
    "deposit": 12000,
    "withdrawal": 1500,
    "investment": 48210.33,
    "defaultLoss": 120.5,
    "internalTransfer": 0,
    "transactionCount": 14873,
    "totalBalance": 12233.5,
    "availableBalance": 1586.72,
    "investedBalance": 10646.78,
    "netDeposits": 10500,
    "netIncome": 1733.5
  }
}

Estes números são exemplos. totalBalance é quanto vale a tua conta: depósitos menos levantamentos mais tudo o que ganhaste, depois de comissões, impostos e perdas.

Exemplos

Quatro coisas que podes fazer com a API. Copia o código, define o teu token e adapta a partir daí.

O teu saldo no Google Sheets

Na tua folha, abre Extensões → Apps Script e cola esta função. Em Definições do projeto → Propriedades do script, adiciona P2PDASH_TOKEN com o teu token. Depois escreve a fórmula numa célula. Funciona com qualquer campo do resumo, por exemplo "netIncome".

Google Apps Script
function P2PDASH(field) {
  const token = PropertiesService.getScriptProperties()
    .getProperty("P2PDASH_TOKEN");
  const res = UrlFetchApp.fetch(
    "https://app.p2pdash.com/api/v1/account/summary",
    { headers: { Authorization: "Bearer " + token } },
  );
  return JSON.parse(res.getContentText()).data[field];
}
Resultado
=P2PDASH("totalBalance")   →  12233.5

O Sheets guarda o resultado e só volta a perguntar quando a fórmula muda. Para atualizar, junta um segundo argumento como =P2PDASH("totalBalance", A1) e altera A1. Cada célula é um pedido. Quem puder editar a folha também consegue ler o token no Apps Script, por isso não faças isto numa folha que outras pessoas editam.

Juros por mês

A série temporal com granularity=month dá-te um ponto por cada mês com dados. Instala a biblioteca uma vez com pip install requests.

Python
import os
import requests

res = requests.get(
    "https://app.p2pdash.com/api/v1/account/timeseries",
    params={"granularity": "month", "from": "2026-08-01", "to": "2026-10-31"},
    headers={"Authorization": f"Bearer {os.environ['P2PDASH_TOKEN']}"},
)
res.raise_for_status()

for point in res.json()["data"]:
    print(point["date"][:7], f"{point['interest']:.2f}")
Resultado
2026-08 94.80
2026-09 96.42
2026-10 98.15

XIRR por plataforma

Guarda isto como xirr.mjs e corre node xirr.mjs (Node.js 18 ou mais recente). O XIRR vem como fração: 0.0984 quer dizer 9,84% por ano. Uma plataforma sem dados suficientes recebe null.

JavaScript (Node.js)
const res = await fetch("https://app.p2pdash.com/api/v1/account/metrics", {
  headers: { Authorization: `Bearer ${process.env.P2PDASH_TOKEN}` },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data } = await res.json();

for (const p of data.xirr.platforms) {
  const xirr = p.allTimeXirr === null
    ? "-"
    : (p.allTimeXirr * 100).toFixed(2) + "%";
  console.log(p.name.padEnd(12), xirr);
}
Resultado
Platform A   9.84%
Platform B   10.37%
Platform C   11.20%
Platform D   -

Números para a declaração de impostos

Juros e bónus por plataforma para um ano, resumidos com jq. O que conta como rendimento depende das regras do teu país; a API só mostra o que está no P2P Dash.

curl + jq
curl -s "https://app.p2pdash.com/api/v1/account/tax?year=2025" \
  -H "Authorization: Bearer $P2PDASH_TOKEN" \
  | jq '.data[] | {name, interest: .years[0].interest, bonus: .years[0].bonus}'
Resultado
{
  "name": "Platform A",
  "interest": 412.37,
  "bonus": 25
}
{
  "name": "Platform B",
  "interest": 288.9,
  "bonus": 0
}

O que podes ler

A tua conta inteira, cada carteira e cada plataforma respondem às mesmas cinco perguntas. Aprendes uma vez e podes fazê-las a qualquer nível.

As cinco vistas

Cada vista existe três vezes. Para uma plataforma, vai primeiro buscar o ID dela a /api/v1/platforms e põe-no no lugar de {id}. As carteiras funcionam da mesma forma.

summary

Os totais desde o início: juros, bónus, comissões, perdas, depósitos, levantamentos e os saldos que resultam deles.

Conta inteira
GET /api/v1/account/summary
Uma carteira
GET /api/v1/portfolios/{id}/summary
Uma plataforma
GET /api/v1/platforms/{id}/summary
timeseries

Os mesmos números ao longo do tempo, por dia, mês ou ano, com o saldo no fim de cada período. Dá jeito para gráficos.

Conta inteira
GET /api/v1/account/timeseries
Uma carteira
GET /api/v1/portfolios/{id}/timeseries
Uma plataforma
GET /api/v1/platforms/{id}/timeseries
metrics

XIRR (desde o início e por ano, com e sem bónus), cash drag, saldo investido médio e o Índice de Liberdade de Capital, por plataforma e no total.

Conta inteira
GET /api/v1/account/metrics
Uma carteira
GET /api/v1/portfolios/{id}/metrics
Uma plataforma
GET /api/v1/platforms/{id}/metrics
income-projection

O que o teu saldo atual renderia por dia, mês e ano com o teu XIRR passado sem bónus. É uma projeção, não uma promessa.

Conta inteira
GET /api/v1/account/income-projection
Uma carteira
GET /api/v1/portfolios/{id}/income-projection
Uma plataforma
GET /api/v1/platforms/{id}/income-projection
tax

Juros, bónus, impostos retidos, comissões e perdas por plataforma e ano civil, do ano mais recente para o mais antigo.

Conta inteira
GET /api/v1/account/tax
Uma carteira
GET /api/v1/portfolios/{id}/tax
Uma plataforma
GET /api/v1/platforms/{id}/tax

Listas e detalhes

GET /api/v1/account
Que token estás a usar, os seus âmbitos e quando expira. Útil para confirmar que um token ainda funciona.
GET /api/v1/platforms
Todas as tuas plataformas com os IDs, as carteiras e os totais. Começa aqui para encontrar os IDs.
GET /api/v1/platforms/{id}
Uma plataforma, o mesmo objeto que aparece na lista.
GET /api/v1/platforms/{id}/intent-history
Quando mudaste o teu plano para uma plataforma (crescer, manter, sair, etc.).
GET /api/v1/portfolios
Todas as tuas carteiras com as respetivas plataformas.
GET /api/v1/portfolios/{id}
Uma carteira.
GET /api/v1/platform-types
Factos por tipo de plataforma: país, classes de ativos, regulação, ano de fundação. São iguais para todos os utilizadores.

Parâmetros de consulta

from, to
Só para timeseries. Dias no formato YYYY-MM-DD, ambos incluídos. Com month ou year alargam-se a períodos completos. Os saldos continuam a contar desde o teu primeiro dia com dados, por isso um from mais tarde não os põe a zero.
granularity
Só para timeseries. day (predefinição), month ou year. A data de cada ponto é o último dia do seu período. Um dia ou período sem dados não tem ponto nenhum, por isso não contes com zeros.
year
Só para tax. Um ano civil, por exemplo 2025. As plataformas sem dados nesse ano ficam de fora.

Todos os campos de todas as respostas estão no documento OpenAPI. Ferramentas como o Postman ou o Swagger UI conseguem lê-lo, e os geradores de código conseguem criar um cliente a partir dele.

Abrir o documento OpenAPI

Bom saber

As regras que valem para todos os endpoints.

Só de leitura

A API lê os teus dados e não altera nada. As importações e as definições continuam a fazer-se na app.

Tão atual como a tua última importação

O P2P Dash não vai buscar nada às plataformas. A API devolve o que importaste ou introduziste à mão, e lastDate diz-te qual é o último dia com dados.

60 pedidos, depois um minuto de pausa

Por token. A contagem só recomeça quando o token passa um minuto inteiro sem nenhum pedido, por isso um script que pergunta de poucos em poucos segundos também chega ao limite. Aí recebes um 429, e Retry-After diz quantos segundos tens de esperar. As respostas com sucesso mostram o que te resta em X-RateLimit-Remaining.

Valores em EUR

Os movimentos de dinheiro como deposit, withdrawal ou fee são sempre positivos; a direção está no nome. Os saldos e o netIncome podem ficar abaixo de zero. O XIRR e o cash drag são frações (0.075 é 7,5%), o Índice de Liberdade de Capital vai de 0 a 100.

Datas em UTC

Dias como YYYY-MM-DD, momentos no tempo em ISO 8601. Um dia é o dia que está na exportação, sem fusos horários a mudá-lo.

Tokens

Até 10 tokens ativos por conta, válidos por «30 dias», «90 dias», «1 ano» ou «Nunca». Se carregares em «Revogar» na página dos tokens, o token deixa de funcionar na hora.

Quando algo corre mal

Os erros chegam em JSON com um error.code fixo. Verifica o código, não a mensagem: a mensagem pode mudar, os códigos ficam.

EstadoCódigo e significado
400invalid_request

Um parâmetro está errado. details indica cada campo e o que está mal nele.

401unauthorized

O token falta, está mal escrito, foi revogado ou expirou.

403insufficient_scope

O token não tem permissão para ler esta parte da API.

404not_found

O caminho não existe, ou o ID não pertence a nenhuma plataforma ou carteira tua.

429rate_limited

60 pedidos sem um minuto de pausa. Espera os segundos que Retry-After indicar.

500internal_error

O erro é nosso. Tenta mais tarde e, se continuar a acontecer, escreve-nos.

Existem mais dois códigos 403, forbidden e plan_required. Com uma conta normal não os vais ver.

Exemplo: uma data que não existe

Pedido
curl "https://app.p2pdash.com/api/v1/account/timeseries?from=2025-02-30" \
  -H "Authorization: Bearer $P2PDASH_TOKEN"
Resposta
{
  "error": {
    "code": "invalid_request",
    "message": "Not a valid calendar date",
    "details": [
      {
        "field": "from",
        "message": "Not a valid calendar date"
      }
    ]
  }
}

Perguntas sobre a API

Antes do teu primeiro pedido.

A API custa alguma coisa?

Não. Tal como a app, neste momento é grátis para todas as contas.

Posso importar transações através da API?

Ainda não. A API só lê. Continuas a carregar as tuas exportações na app.

Preciso de saber programar?

Não muito. O exemplo do Google Sheets é copiar e colar, e o pedido com curl corre no terminal em macOS e Linux. Para ir mais longe, ajuda saber um pouco de Python ou JavaScript.

O que acontece se alguém ficar com o meu token?

Pode ler os teus números do P2P Dash, mas não consegue alterar nada e nunca vê o teu email nem a tua palavra-passe. Revoga o token na página dos tokens e ele deixa de funcionar de imediato.

A API vai mudar?

Sim, pode mudar. Esta é a primeira versão, e os campos ou os endpoints ainda podem mudar sem um novo número de versão. Se construíres algo em cima dela, conta com ter de ajustar de vez em quando.

Posso obter dados de outros utilizadores?

Não. Um token só lê os dados da conta que o criou. A única exceção é a lista de tipos de plataforma, que tem factos públicos sobre as plataformas.

Cria o teu primeiro token

Inicia sessão, abre «Tokens de API» no menu de utilizador e envia o teu primeiro pedido.

Ir para Tokens de API

Ainda não tens conta? Regista-te grátis e importa primeiro uma exportação, senão a API não tem nada para mostrar.