Recept
Siffrorna till Excel och Power BI
Bokföringen ligger där den ska ligga, men analysen gör du kanske hellre där du redan arbetar. En läsnyckel räcker — och den kan inte ändra någonting.
Debet & Kredit kör på din egen server, så bas-URL:en är din — inte vår. Skriv in den här, så byts den ut i varje kodexempel i dokumentationen.
1. Skapa en läsnyckel
Under Inställningar → API-nycklar, med behörigheten Läsa och ingenting annat. Det är förvalet. En nyckel som hamnar i en delad rapportfil kan då inte göra mer skada än att visa siffror du ändå tänkte visa — och du ser i listan om den används från en adress du inte känner igen.
2. Välj rätt endpoint
| Adress | När |
|---|---|
| /api/stats/monthly | Resultat per månad. Rätt för en trendkurva eller en resultatrapport. |
| /api/stats/daily | Dag för dag, högst 90 dagar per anrop. Rätt för en försäljningsuppföljning. |
| /api/stats/overview | Hela lägesbilden i ett svar. Tyngst av alla — hämta den sällan och spara resultatet. |
| /api/v1/verifikat | Verifikat rad för rad, när du vill räkna själv i stället för att läsa våra summor. |
3. Hämta
curl -X GET "https://din-installation.se/api/stats/monthly" \
-H "Authorization: Bearer dk_live_DIN_NYCKEL"Power Query (Excel och Power BI)
Data → Hämta data → Från webben → Avancerat, och klistra in frågan nedan i den avancerade redigeraren. Lägg nyckeln i en parameter som heter DebeaApiNyckel — då följer den inte med när du delar rapporten.
let
// Lägg nyckeln i en parameter, inte i frågan. Då följer den inte med när
// du delar rapporten, och den syns inte i frågeredigeraren för mottagaren.
Nyckel = DebeaApiNyckel,
Bas = "https://din-installation.se",
Svar = Web.Contents(
Bas,
[
RelativePath = "api/stats/monthly",
Headers = [ #"Authorization" = "Bearer " & Nyckel ]
]
),
Json = Json.Document(Svar),
Manader = Json[months],
Tabell = Table.FromRecords(Manader),
Typad = Table.TransformColumnTypes(Tabell, {
{"month", type text},
{"revenue", Int64.Type},
{"costs", Int64.Type},
{"result", Int64.Type}
})
in
TypadRelativePath och Headers används i stället för en färdig URL-sträng. Power BI kräver det för att kunna uppdatera schemalagt: en fråga med hela adressen inbakad avvisas som "dynamisk datakälla" vid uppdatering i tjänsten.
Google Sheets
// Google Sheets → Tillägg → Apps Script.
// Nyckeln läggs i skriptegenskaperna, aldrig i en cell: en cell syns för
// alla som har läsrätt till kalkylarket.
function hamtaManadsresultat() {
const nyckel = PropertiesService.getScriptProperties().getProperty("DEBEA_API_KEY");
const svar = UrlFetchApp.fetch("https://din-installation.se/api/stats/monthly", {
headers: { Authorization: "Bearer " + nyckel },
muteHttpExceptions: true,
});
if (svar.getResponseCode() !== 200) {
const fel = JSON.parse(svar.getContentText());
throw new Error(fel.error + ": " + fel.message);
}
const data = JSON.parse(svar.getContentText());
const rader = data.months.map(m => [m.month, m.revenue, m.costs, m.result]);
const blad = SpreadsheetApp.getActiveSheet();
blad.getRange(1, 1, 1, 4).setValues([["Månad", "Intäkter", "Kostnader", "Resultat"]]);
blad.getRange(2, 1, rader.length, 4).setValues(rader);
}Två fallgropar
Summera aldrig unpaid_amount
I /api/stats/daily är fältet ett ögonblicksvärde — utestående kundfordringar just nu — och upprepas därför identiskt i varje dagpost. Summerar du kolumnen får du talet gånger antalet dagar. Läs det ur vilken rad som helst.
Takten räcker gott, men inte till en uppdatering per minut
600 anrop per timme och nyckel som förval. En rapport som uppdateras var femtonde minut använder fyra. Sätter du automatisk uppdatering i Power BI, kontrollera att den inte står på kortaste intervallet "för säkerhets skull" — vid 429 säger Retry-After hur länge du ska vänta.