Does AI recommend your business? Take the free check
oddrank

The Oddrank API

Pull your own measurements into Power BI, Looker Studio or your own system. The API only reads: it changes nothing and only sees the measurements of your own account. It comes with a subscription.

Creating a key

Log in, go to Account and under Connect your own systems choose a name for your key, such as Power BI. The account owner can do this, and an admin if your team has roles. You see the key once: copy it straight away. We only keep a fingerprint, so a lost key is gone; create a new one. You can have 10 at a time, and revoke each one there. A revoked key stops working everywhere at once.

Send the key in a header, with every request:

Authorization: Bearer odr_…

Never in the link. A link ends up in logs, in your browser history and in a shared report. If there is a key in the link, the API refuses the request: revoke that key and create a new one.

The standing per site and market

GET https://oddrank.nl/api/v1/stand
GET https://oddrank.nl/api/v1/stand?vorm=csv

Per site and per market the latest measurement: the date, the score with its margin, how often AI names you, the score per assistant (in JSON), and the change against the measurement before in the same site and market. A market is country and language, such as nl-nl or be-fr. If a measurement failed completely, the fields are empty instead of 0.

The CSV has the columns site, markt, datum, score, marge_laag, marge_hoog, aandeel_genoemd, vorige_datum, vorige_score, verschil.

Your measurements over a period

GET https://oddrank.nl/api/v1/export?van=2026-09-01&tot=2026-11-30&tabel=vragen
GET https://oddrank.nl/api/v1/export?van=2026-09-01&tot=2026-11-30&vorm=json

All measurements from van up to and including tot, as CSV per table or everything together as JSON. The same tables as the export in your dashboard, with the columns site and markt (the market, such as nl-nl). With site=yoursite.com only that site.

The tables: vragen, concurrenten, bronnen, verloop, producten, productvragen, winkels, advertentiekansen. What they contain is described with the export for Looker Studio. The tables about products, shops and ads only exist for a measurement that has them.

Limits and errors

At most 120 requests per hour, for all your keys together, and of those at most 12 exports over a period. Plenty to refresh a report every quarter of an hour; the measurements themselves change at most once a week. A new measurement shows up in the standing within 5 minutes.

  • 400: the key is in the link, or the period is not valid
  • 401: no key, or a key that does not work (any more)
  • 403: the subscription is not active
  • 404: no measurement in that period, or a site that is not in your account
  • 429: the limit of your account has been reached; try again in an hour
  • 503: something is going wrong on our side

An error comes as JSON with a field fout. With taal=en the text is in English.

Example: Power BI

In Power BI Desktop: Get data, Blank query, Advanced editor, and paste this. Replace the key with yours. When refreshing, choose anonymous as the sign-in method: the key already goes along in the header.

let
    Bron = Csv.Document(
        Web.Contents("https://oddrank.nl/api/v1/stand", [
            Query = [vorm = "csv"],
            Headers = [Authorization = "Bearer odr_your-key"]
        ]),
        [Delimiter = ",", Encoding = 65001]
    ),
    Tabel = Table.PromoteHeaders(Bron)
in
    Tabel

Example: Looker Studio

Looker Studio cannot send a header with a CSV address itself. So it goes through Google Sheets: a small script fetches the CSV with the key in the header and puts it in a sheet, and Looker Studio reads that sheet.

  1. Open a new Google Sheet and choose Extensions, Apps Script.
  2. Under Project settings, Script properties, add a property ODDRANK_SLEUTEL with your key as its value.
  3. Paste the script below and run haalOddrank once.
  4. Under Triggers add a time-driven trigger, for example every day.
  5. In Looker Studio choose Google Sheets as the data source and then the sheet Oddrank.
function haalOddrank() {
  // The key lives in the script properties, not in the sheet.
  const sleutel = PropertiesService.getScriptProperties().getProperty("ODDRANK_SLEUTEL");
  const tot = new Date();
  const van = new Date(tot.getTime() - 365 * 24 * 3600 * 1000);
  const dag = (d) => Utilities.formatDate(d, "UTC", "yyyy-MM-dd");
  const url = "https://oddrank.nl/api/v1/export?vorm=csv&tabel=vragen&van=" + dag(van) + "&tot=" + dag(tot);
  const antwoord = UrlFetchApp.fetch(url, { headers: { Authorization: "Bearer " + sleutel } });
  const rijen = Utilities.parseCsv(antwoord.getContentText().replace(/^\uFEFF/, ""));
  const blad = SpreadsheetApp.getActive().getSheetByName("Oddrank") || SpreadsheetApp.getActive().insertSheet("Oddrank");
  blad.clearContents();
  blad.getRange(1, 1, rijen.length, rijen[0].length).setValues(rijen);
}

Nudges in Slack or Teams

Under Account, Connect your own systems, paste the address of an incoming webhook. Then you get the same nudges as on your phone in that channel: at most one a day, never at night, without names or addresses. The button sends a test message.

  • Slack: create an app with Incoming Webhooks and choose the channel. The address starts with https://hooks.slack.com/.
  • Microsoft Teams: choose Workflows on the channel and the workflow that posts a message when a webhook request is received. Copy the address the workflow gives. A flow in Power Automate with such an address works too.

We do not accept an address from any other domain. More about security