Introduction

NB: please note that this is version v1.2. Click here if you are looking for documentation for the previous v1_1 version.

To get started with the API, you need to use the base url together with an authorization token provided in the header.

Authorization
The authorization token you need to use depends on what type of request you want to make. There is an refresh token that works as your identity. It is used to generate access tokens that are used to request data from the API: e.g. get financial information for a given company.

JWT
We use a JSON Web Token for authorization. This enables us to send a payload inside the access token with additional information like expiration. That enables you to check if your token is still valid without doing an additional request.

You can learn more about it here.

Headers
All the endpoints require an authorization token (access or refresh token) with the Authorization header. You should also specify the Content-Type header as "application/json", but this is the only supported format so consider it optional.

Some endpoints also allow you to specify an Accept-Language header (en-UK and da-DK) to get the text in different languages.

Versions
This is version v1.2

To see the old version v1_1 click here

Base URL

https://api.risika.dk/{version}

Headers

Authorization: <access_token or refresh_token>
Content-Type: application/json

Generate an access token

This endpoint generates an access token from your refresh token. This token allows you to make unlimited requests for 10 minutes, after this timeframe you need to generate a new one. You are allowed to have multiple active access tokens at the same time.

This system is intented to replace a rate limit.

GET
/access/refresh_token

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/access/refresh_token/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <refresh_token>'

Example response

{
  "token": "jwt eyJ0eXAiOiJKV1QiLCJhbG ..."
}

Terminology

country: The two letter country code (e.g. dk, se, no)

local_id: The company's ID in the country (e.g. CVR in Denmark)

personal_id: An ID we have given so it's possible to lookup a person.

Company

These are all the endpoints that relates to the company itself. Here you will find basic information about the company: address, phone number, number of employees, etc. You will also find information about who is related to the company: the owners, board of directors, etc.

Basics

GET
/{country}/company/basics/{local_id}

Relations

GET
/{country}/company/relations/{local_id}

Company basics

This endpoint is used to get all the basic information about a given company. It will contain information such as address, phone number, number of employees, company name, etc.

GET
/{country}/company/basics/{local_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/company/basics/37677892/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "local_organization_id": {
    "country": "DK",
    "id": 37677892
  },
  "address": {
    "city": "København K",
    "coname": null,
    "number": "26, st.",
    "street": "Kronprinsessegade",
    "country": "DK",
    "zipcode": 1306,
    "postdistrict": "København K"
  },
  "status": "normal",
  "advertisement_protection": true,
  "financial_reports": true,
  "main_industry_code": {
    "code": 829100,
    "description": "Inkassovirksomhed og kreditoplysning"
  },
  "secondary_industry_codes": [
    {
      "section": "J",
      "priority": 1,
      "group_name": "Databehandling, webhosting og lignende serviceydelser; webportaler",
      "industry_code": 631100,
      "industry_description": "Databehandling, webhosting og lignende serviceydelser"
    },
    {
      "section": "J",
      "priority": 2,
      "group_name": "Computerprogrammering, konsulentbistand vedrørende informationsteknologi og lignende aktiviteter",
      "industry_code": 620200,
      "industry_description": "Konsulentbistand vedrørende informationsteknologi"
    }
  ],
  "number_of_employees": {
    "interval": "5-9",
    "source": null
  },
  "last_report_date": null,
  "date_of_incorporation": "2016-04-30",
  "company_type": {
    "short": "A/S",
    "long": "Aktieselskab"
  },
  "score": 3,
  "registered_capital": {
    "value": 501310.0,
    "currency": null
  },
  "company_name": "RISIKA A/S",
  "company_secondary_names": [
    {
      "name": "Global Business Platform ApS",
      "valid_to": "2017-05-17",
      "valid_from": "2016-04-30"
    },
    {
      "name": "Globus Platform ApS",
      "valid_to": "2017-05-17",
      "valid_from": "2017-01-14"
    }
  ],
  "holding_company": false,
  "powers_to_bind": "Selskabet tegnes af en direktør i forening med et medlem af bestyrelsen eller af den samlede bestyrelse",
  "email": {
    "email": "contact@risika.dk",
    "hidden": false
  },
  "phone": {
    "phone_number": "42905757",
    "hidden": false
  }
}

Company relations

This endpoint is used to get all the relational information for a given company. You will get the owners, directors, together with a date for when the person got the role.

Example request

curl --request GET \
  --url 'https://api.risika.dk/v1.2/dk/company/relations/37677892' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "relations": [
    {
      "personal_id": 4000693282,
      "name": "Peter Christian Schmiegelow",
      "type": "PERSON",
      "functions": [
        {
          "function": "BESTYRELSE",
          "valid_from": "2019-03-18",
          "valid_to": null
        }
      ]
    },
    {
      "personal_id": 3369870,
      "name": "inforevision statsautoriseret revisionsaktieselskab",
      "type": "VIRKSOMHED",
      "functions": [
        {
          "function": "REVISION",
          "valid_from": "2019-02-13",
          "valid_to": null
        }
      ],
      "local_organization_id": {
        "country": "DK",
        "id": "19263096"
      }
    },
    {
      "personal_id": 4006873173,
      "name": "Timm Jeppesen",
      "type": "PERSON",
      "functions": [
        {
          "function": "ADMINISTRERENDE DIREKT\u00d8R",
          "valid_from": "2018-04-01",
          "valid_to": null
        },
        {
          "function": "DIREKTION",
          "valid_from": "2017-05-18",
          "valid_to": "2018-03-31"
        },
        {
          "function": "real_owner",
          "valid_from": "2017-05-18",
          "valid_to": "2018-03-05",
          "shares": 50.0
        },
        {
          "function": "real_owner",
          "valid_from": "2018-03-06",
          "valid_to": "2018-10-28",
          "shares": 45.0
        },
        {
          "function": "real_owner",
          "valid_from": "2018-10-29",
          "valid_to": "2019-02-17",
          "shares": 41.4
        },
        {
          "function": "real_owner",
          "valid_from": "2019-02-18",
          "valid_to": null,
          "shares": 34.050000000000004
        }
      ]
    },
    {
      "personal_id": 4007482058,
      "name": "Perceval ApS",
      "type": "VIRKSOMHED",
      "functions": [
        {
          "function": "unknown",
          "valid_from": "1903-01-01",
          "valid_to": null
        },
        {
          "function": "legal_owner",
          "valid_from": "2019-02-18",
          "valid_to": null,
          "shares_interval": "10-14.99%"
        },
        {
          "function": "legal_owner",
          "valid_from": "2018-10-29",
          "valid_to": "2019-02-17",
          "shares_interval": "20-24.99%"
        },
        {
          "function": "legal_owner",
          "valid_from": "2018-03-06",
          "valid_to": "2018-10-28",
          "shares_interval": "25-33.33%"
        }
      ],
      "local_organization_id": {
        "country": "DK",
        "id": "39258072"
      }
    },
    {
      "personal_id": 4000569667,
      "name": "Niels Gade-Jacobsen",
      "type": "PERSON",
      "functions": [
        {
          "function": "BESTYRELSE",
          "valid_from": "2019-01-14",
          "valid_to": "2019-03-18"
        }
      ]
    },
    {
      "personal_id": 4004175969,
      "name": "Mads Guttorm Jakobsen",
      "type": "PERSON",
      "functions": [
        {
          "function": "FORMAND",
          "valid_from": "2019-01-14",
          "valid_to": null
        }
      ]
    },
    {
      "personal_id": 4000652101,
      "name": "Nicolai Rasmussen",
      "type": "PERSON",
      "functions": [
        {
          "function": "DIREKTION",
          "valid_from": "2018-04-01",
          "valid_to": null
        },
        {
          "function": "real_owner",
          "valid_from": "2018-04-01",
          "valid_to": "2018-10-28",
          "shares": 30.0
        },
        {
          "function": "real_owner",
          "valid_from": "2018-10-29",
          "valid_to": "2019-02-18",
          "shares": 27.0
        }
      ]
    },
    {
      "personal_id": 4000679462,
      "name": "Poul Erik Mølgaard Rasmussen",
      "type": "PERSON",
      "functions": [
        {
          "function": "DIREKTION",
          "valid_from": "2016-07-01",
          "valid_to": "2016-12-31"
        }
      ]
    },
    {
      "personal_id": 4000397851,
      "name": "Martin Lavesen",
      "type": "PERSON",
      "functions": [
        {
          "function": "BESTYRELSE",
          "valid_from": "2019-01-14",
          "valid_to": null
        }
      ]
    },
    {
      "personal_id": 4007487941,
      "name": "Sort Hest Limited",
      "type": "ANDEN_DELTAGER",
      "functions": [
        {
          "function": "unknown",
          "valid_from": "1903-01-01",
          "valid_to": null
        },
        {
          "function": "legal_owner",
          "valid_from": "2019-02-18",
          "valid_to": null,
          "shares_interval": "10-14.99%"
        }
      ]
    },
    {
      "personal_id": 4000625364,
      "name": "Hanne Bach-Nielsen",
      "type": "PERSON",
      "functions": [
        {
          "function": "DIREKTION",
          "valid_from": "2016-12-31",
          "valid_to": "2017-05-18"
        },
        {
          "function": "real_owner",
          "valid_from": "2016-12-31",
          "valid_to": "2018-03-05",
          "shares": 50.0
        },
        {
          "function": "real_owner",
          "valid_from": "2018-03-06",
          "valid_to": "2018-04-01",
          "shares": 30.0
        }
      ]
    },
    {
      "personal_id": 4006873174,
      "name": "TJ Formueinvest ApS",
      "type": "VIRKSOMHED",
      "functions": [
        {
          "function": "unknown",
          "valid_from": "1903-01-01",
          "valid_to": null
        },
        {
          "function": "legal_owner",
          "valid_from": "2018-03-06",
          "valid_to": null,
          "shares_interval": "33.34-49.99%"
        },
        {
          "function": "legal_owner",
          "valid_from": "2017-05-18",
          "valid_to": "2018-03-05",
          "shares_interval": "50-66.65%"
        }
      ],
      "local_organization_id": {
        "country": "DK",
        "id": "38599070"
      }
    },
    {
      "personal_id": 4005959089,
      "name": "N. Rasmussen Holding ApS",
      "type": "VIRKSOMHED",
      "functions": [
        {
          "function": "STIFTERE",
          "valid_from": "2016-04-30",
          "valid_to": null
        },
        {
          "function": "legal_owner",
          "valid_from": "2019-02-18",
          "valid_to": null,
          "shares_interval": "20-24.99%"
        },
        {
          "function": "legal_owner",
          "valid_from": "2018-03-06",
          "valid_to": "2019-02-17",
          "shares_interval": "25-33.33%"
        },
        {
          "function": "legal_owner",
          "valid_from": "2017-05-18",
          "valid_to": "2018-03-05",
          "shares_interval": "50-66.65%"
        },
        {
          "function": "legal_owner",
          "valid_from": "2016-07-01",
          "valid_to": "2017-05-17",
          "shares_interval": "100%"
        }
      ],
      "local_organization_id": {
        "country": "DK",
        "id": "36701927"
      }
    },
    {
      "personal_id": 4006184467,
      "name": "Simon Turner",
      "type": "ANDEN_DELTAGER",
      "functions": [
        {
          "function": "unknown",
          "valid_from": "1903-01-01",
          "valid_to": null
        },
        {
          "function": "legal_owner",
          "valid_from": "2019-02-18",
          "valid_to": null,
          "shares_interval": "10-14.99%"
        }
      ]
    }
  ]
}

Person

We provide an endpoint for looking up the companies that a person is associated with (ownership, board of directors, etc.).

Relations

GET
/{country}/person/relations/{personal_id}

Person relations

When you get the people associated with a company, you also receive a personal_id. You can use this ID to get all the relations associated with this person.

GET
/{country}/person/relations/{personal_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/person/relations/4006873173 \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "name": "Timm Jeppesen",
  "type": "person",
  "relations": [
    {
      "local_organization_id": {
        "country": "DK",
        "id": "37677892"
      },
      "company_active": true,
      "company_name": "RISIKA A/S",
      "score": 3,
      "functions": [
        {
          "function": "ADMINISTRERENDE DIREKT\u00d8R",
          "valid_to": null,
          "valid_from": "2018-04-01"
        },
        {
          "function": "REEL EJER",
          "valid_to": null,
          "valid_from": "2017-05-18"
        },
        {
          "function": "DIREKTION",
          "valid_to": "2018-03-31",
          "valid_from": "2017-05-18"
        }
      ],
      "shares": [

      ]
    },
    {
      "local_organization_id": {
        "country": "DK",
        "id": "38599070"
      },
      "company_active": true,
      "company_name": "TJ Formueinvest ApS",
      "score": 1,
      "functions": [
        {
          "function": "STIFTERE",
          "valid_to": null,
          "valid_from": "2017-04-26"
        },
        {
          "function": "REEL EJER",
          "valid_to": null,
          "valid_from": "2017-04-26"
        },
        {
          "function": "DIREKTION",
          "valid_to": null,
          "valid_from": "2017-04-26"
        }
      ],
      "shares": [

      ]
    },
    {
      "local_organization_id": {
        "country": "DK",
        "id": "39228327"
      },
      "company_active": true,
      "company_name": "MoneyFlow Group ApS",
      "score": 3,
      "functions": [
        {
          "function": "BESTYRELSE",
          "valid_to": null,
          "valid_from": "2018-02-13"
        }
      ],
      "shares": [

      ]
    },
    {
      "local_organization_id": {
        "country": "DK",
        "id": "39276208"
      },
      "company_active": true,
      "company_name": "TNT Holding DK ApS",
      "score": 1,
      "functions": [
        {
          "function": "REEL EJER",
          "valid_to": "2018-02-07",
          "valid_from": "2018-01-23"
        },
        {
          "function": "DIREKTION",
          "valid_to": null,
          "valid_from": "2018-01-23"
        }
      ],
      "shares": [

      ]
    }
  ]
}

Financial

These are all the endpoints for financial information. Here you will have access to the numbers from their financial report, key figures, information about the auditor and a link to their official financial report. We provide information from the three latest financial reports.

NOTE: the result from these endpoints cannot be expected to be sorted, you will need to handle this yourself. There is a date on all objects in the response.

Numbers

GET
/{country}/financial/numbers/{local_id}

Ratios

GET
/{country}/financial/ratios/{local_id}

Performance

GET
/{country}/financial/performance/{local_id}

Stats

GET
/{country}/financial/stats/{local_id}

Financial numbers

This endpoint provides you with all the relevant financial numbers for the most recent financial report for a given company.

GET
/{country}/financial/numbers/{local_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/financial/numbers/37677892/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

[
  {
    "period": {
      "start": "2016-07-01",
      "end": "2017-12-31"
    },
    "revenue": null,
    "other_income": null,
    "costs": 0.0,
    "gross_result": -114631.0,
    "operating_costs": 0.0,
    "other_operating_income": 0.0,
    "staff_expenses": 0.0,
    "ebitda": -114631.0,
    "depreciation": 56216.0,
    "ebit": -170847.0,
    "interest_income": 0.0,
    "interest_expenses": 0.0,
    "other_net_financial_income": 0.0,
    "net_financial_income": 0.0,
    "ordinary_profit": -96415.0,
    "extraordinary_item": 0.0,
    "profit_loss_before_tax": -170847.0,
    "tax_expenses": -37216.0,
    "profit_loss": -133631.0,
    "goodwill": 0.0,
    "other_intangible_assets": 199881.0,
    "intangible_assets": 199881.0,
    "land_and_buildings": 0.0,
    "plant_equipment_and_fixtures": 0.0,
    "other_property_plant_and_equipment": 0.0,
    "property_plant_and_equipment": 0.0,
    "noncurrent_receivables": 0.0,
    "noncurrent_investments": 0.0,
    "other_noncurrent_financial_assets": 2500.0,
    "noncurrent_financial_assets": 2500.0,
    "noncurrent_assets": 202381.0,
    "inventories": 0.0,
    "current_prepayments": 0.0,
    "short_term_receivables_from_sales_and_services": 0.0,
    "short_term_receivables_from_group_enterprises": 0.0,
    "other_short_term_receivables": 110505.0,
    "short_term_receivables": 110505.0,
    "current_financial_assets": 0.0,
    "cash": 25461.0,
    "current_assets": 135966.0,
    "assets": 338347.0,
    "contributed_capital": 50000.0,
    "reserves": 375907.0,
    "dividend": 0.0,
    "retained_earnings": -289538.0,
    "equity_before_minority_interests": 136369.0,
    "minority_interests": 0.0,
    "equity": 136369.0,
    "provisions": 43974.0,
    "long_term_debt_to_group_enterprises": 0.0,
    "long_term_debt_to_banks": 0.0,
    "long_term_mortgage_debt": 0.0,
    "equity_loan": 0.0,
    "deferred_tax": 0.0,
    "other_long_term_debt": 0.0,
    "long_term_debt": 0.0,
    "short_term_debt_to_group_enterprises": 0.0,
    "short_term_debt_to_banks": 0.0,
    "short_term_mortgage_debt": 0.0,
    "short_term_trade_payables": 76324.0,
    "short_term_tax_payables": 0.0,
    "other_short_term_debt": 81680.0,
    "short_term_debt": 158004.0,
    "debt": 158004.0,
    "liabilities_and_equity": 338347.0
  },
  {
    "period": {
      "start": "2018-01-01",
      "end": "2018-12-31"
    },
    "revenue": null,
    "other_income": null,
    "costs": 0.0,
    "gross_result": -557581.0,
    "operating_costs": 0.0,
    "other_operating_income": 190000.0,
    "staff_expenses": 128950.0,
    "ebitda": -496531.0,
    "depreciation": 417673.0,
    "ebit": -914204.0,
    "interest_income": 0.0,
    "interest_expenses": -22900.0,
    "other_net_financial_income": 0.0,
    "net_financial_income": -22900.0,
    "ordinary_profit": -534098.0,
    "extraordinary_item": 0.0,
    "profit_loss_before_tax": -937104.0,
    "tax_expenses": -201503.0,
    "profit_loss": -735601.0,
    "goodwill": 0.0,
    "other_intangible_assets": 0.0,
    "intangible_assets": 1380614.0,
    "land_and_buildings": 0.0,
    "plant_equipment_and_fixtures": 0.0,
    "other_property_plant_and_equipment": 0.0,
    "property_plant_and_equipment": 0.0,
    "noncurrent_receivables": 0.0,
    "noncurrent_investments": 0.0,
    "other_noncurrent_financial_assets": 0.0,
    "noncurrent_financial_assets": 0.0,
    "noncurrent_assets": 1380614.0,
    "inventories": 0.0,
    "current_prepayments": 0.0,
    "short_term_receivables_from_sales_and_services": 13662.0,
    "short_term_receivables_from_group_enterprises": 0.0,
    "other_short_term_receivables": 571258.0,
    "short_term_receivables": 584920.0,
    "current_financial_assets": 0.0,
    "cash": 45317.0,
    "current_assets": 630237.0,
    "assets": 2010851.0,
    "contributed_capital": 399406.0,
    "reserves": 1076879.0,
    "dividend": 0.0,
    "retained_earnings": -576556.0,
    "equity_before_minority_interests": 899729.0,
    "minority_interests": 0.0,
    "equity": 899729.0,
    "provisions": 681195.0,
    "long_term_debt_to_group_enterprises": 0.0,
    "long_term_debt_to_banks": 0.0,
    "long_term_mortgage_debt": 0.0,
    "equity_loan": 0.0,
    "deferred_tax": 0.0,
    "other_long_term_debt": 0.0,
    "long_term_debt": 0.0,
    "short_term_debt_to_group_enterprises": 0.0,
    "short_term_debt_to_banks": 0.0,
    "short_term_mortgage_debt": 0.0,
    "short_term_trade_payables": 61334.0,
    "short_term_tax_payables": 0.0,
    "other_short_term_debt": 165437.0,
    "short_term_debt": 429927.0,
    "debt": 429927.0,
    "liabilities_and_equity": 2010851.0
  }
]

Financial ratios

This endpoint provides some ratios that we have calculated from their financial report. These include ratios like interest coverage, return on equity (ROE), return on investment (ROI), etc.

GET
/{country}financial/ratios/{local_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/financial/ratios/37677892/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

[
  {
    "period": {
      "start": "2016-07-01",
      "end": "2017-12-31"
    },
    "gross_margin": null,
    "operating_margin": null,
    "profit_margin": null,
    "return_on_equity": -0.9799,
    "return_on_assets": -0.395,
    "return_on_net_assets": -0.741,
    "basic_earning_power": -0.5049,
    "current_ratio": 0.8605,
    "current_assets_to_equity": 0.997,
    "cash_ratio": 0.1611,
    "capacity_ratio": -2.0391,
    "asset_turnover": null,
    "inventory_conversion_ratio": null,
    "debt_ratio": 0.467,
    "debt_to_equity_ratio": 1.1587,
    "income_to_debt_ratio": -0.8457,
    "ebitda_to_debt_ratio": -0.7255,
    "interest_coverage": null,
    "solidity_ratio": 0.403,
    "liabilities_to_equity_ratio": 1.4811,
    "one_year_change_in_equity": 0.5051
  },
  {
    "period": {
      "start": "2018-01-01",
      "end": "2018-12-31"
    },
    "gross_margin": null,
    "operating_margin": null,
    "profit_margin": null,
    "return_on_equity": -0.8176,
    "return_on_assets": -0.3658,
    "return_on_net_assets": -0.4653,
    "basic_earning_power": -0.4546,
    "current_ratio": 1.4659,
    "current_assets_to_equity": 0.7005,
    "cash_ratio": 0.1054,
    "capacity_ratio": -1.5635,
    "asset_turnover": null,
    "inventory_conversion_ratio": null,
    "debt_ratio": 0.2138,
    "debt_to_equity_ratio": 0.4778,
    "income_to_debt_ratio": -1.711,
    "ebitda_to_debt_ratio": -1.1549,
    "interest_coverage": -21.6826,
    "solidity_ratio": 0.4474,
    "liabilities_to_equity_ratio": 1.235,
    "one_year_change_in_equity": 0.5502
  }
]

Financial performance

This endpoint calculates the performance compared to the rest of the market. That helps to put the numbers into perspective.

GET
/{country}/financial/performance/{local_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/financial/performance/37677892/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "gross_margin": {
    "performance": null,
    "explanation": null
  },
  "operating_margin": {
    "performance": null,
    "explanation": null
  },
  "profit_margin": {
    "performance": null,
    "explanation": null
  },
  "return_on_equity": {
    "performance": 10,
    "explanation": "Egenkapitalsforrentning er evnen til at skabe sundt afkast. Virksomheden har en meget svag egenkapitalsforretning, da den ligger blandt de 10% laveste ratede virksomheder i samme branche."
  },
  "return_on_assets": {
    "performance": 20,
    "explanation": "Afkastningsgrad er evnen til skabe afkast til investorer. Virksomheden har en meget svag afkastningsgrad, da den ligger blandt de 20% laveste ratede virksomheder i samme branche."
  },
  "return_on_net_assets": {
    "performance": 10,
    "explanation": null
  },
  "basic_earning_power": {
    "performance": 10,
    "explanation": null
  },
  "current_ratio": {
    "performance": 60,
    "explanation": "Likviditetsgrad er evnen til at betale regninger og afdrage på gæld. Virksomheden har en middel likviditetsgrad, sammenlignet med andre virksomheder i samme branche."
  },
  "current_assets_to_equity": {
    "performance": 20,
    "explanation": null
  },
  "cash_ratio": {
    "performance": 40,
    "explanation": null
  },
  "capacity_ratio": {
    "performance": 10,
    "explanation": null
  },
  "asset_turnover": {
    "performance": null,
    "explanation": null
  },
  "inventory_conversion_ratio": {
    "performance": null,
    "explanation": null
  },
  "debt_ratio": {
    "performance": 100,
    "explanation": null
  },
  "debt_to_equity_ratio": {
    "performance": 100,
    "explanation": "Gearing er evnen til at stå imod større interne eller eksterne kriser. Virksomheden har en meget stærk gearing, da den ligger blandt de 10% højeste ratede virksomheder i samme branche."
  },
  "income_to_debt_ratio": {
    "performance": 10,
    "explanation": null
  },
  "ebitda_to_debt_ratio": {
    "performance": 10,
    "explanation": null
  },
  "interest_coverage": {
    "performance": 20,
    "explanation": "Rentedækningsgrad er evnen til at tilbagebetale renter på gæld. Virksomheden har en meget svag rentedækningsgrad, da den ligger blandt de 20% laveste ratede virksomheder i samme branche."
  },
  "solidity_ratio": {
    "performance": 60,
    "explanation": "Soliditetsgrad er evnen til at bære større tab. Virksomheden har en middel soliditetsgrad, sammenlignet med andre virksomheder i samme branche."
  },
  "liabilities_to_equity_ratio": {
    "performance": 100,
    "explanation": null
  },
  "one_year_change_in_equity": {
    "performance": 10,
    "explanation": null
  }
}

Financial stats

This endpoint has information about each financial report. We provide information about who audited the report, when it was approved, a link to the actual PDF report, whether they are IFRS (International Financial Reporting Standards) compliant, etc.

GET
/{country}/financial/stats/{local_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/financial/stats/37677892/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

[
  {
    "period": {
      "start": "2016-07-01",
      "end": "2017-12-31"
    },
    "pdf_link": "http://regnskaber.virk.dk/29877673/ZG9rdW1lbnRsYWdlcjovLzAzLzM2LzhlL2E0L2Q4LzdkMmMtNDBmYy04ZWIxLWFmYzFhZTg4YjNhOQ.pdf",
    "type": "ANNUAL REPORT",
    "class_of_reporting_entity": "REPORTING CLASS B",
    "approval_date": "2018-05-25",
    "general_meeting_date": "2018-05-25",
    "auditor": {
      "name": null,
      "description": "uautoriseret titel",
      "type_of_assistance": "NO AUDITOR ASSISTANCE",
      "company_id": null,
      "company_name": null
    },
    "currency": "DKK",
    "ifrs": false
  },
  {
    "period": {
      "start": "2018-01-01",
      "end": "2018-12-31"
    },
    "pdf_link": "http://regnskaber.virk.dk/29877673/ZG9rdW1lbnRsYWdlcjovLzAzLzhlL2FhLzgwL2ZiL2EzN2QtNDA2Ny05NDVkLWRhN2MxNWQ5MzhlMA.pdf",
    "type": "ANNUAL REPORT",
    "class_of_reporting_entity": "REPORTING CLASS B",
    "approval_date": "2019-04-10",
    "general_meeting_date": "2019-04-19",
    "auditor": {
      "name": "Michael Dam-Johansen",
      "description": "statsautoriseret revisor",
      "type_of_assistance": "AUDITOR'S REPORT",
      "company_id": "19263096",
      "company_name": "inforevision statsautoriseret revisionsaktieselskab"
    },
    "currency": "DKK",
    "ifrs": false
  }
]

Highlights

This endpoint provides some highlights that we have selected by analyzing the company, the data in the financial report and the people associated with the company. A highlight can be classified as either positive, neutral or negative. We provide a message for each highlight to explain what it means for the given situation. Furthermore, we also provide a weight to indicate how important each highlight is.

NB: You can pass along the Accept-Header with either en-UK for English or da-DK for Danish.

GET
/{country}/highlights/{local_id}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/highlights/37677892/ \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>' \
  --header 'Accept-Language: da-DK'

Example response

{
  "highlights": {
    "age": {
      "title": "Ung virksomhed",
      "message": "Vær opmærksom på, at alderen på virksomheden er 3 år. Vores algoritme har vist, at det forøger risikoen, når virksomheder er under 5 år gamle og derfor har det påvirket den samlede score.",
      "description": "Advarsel om, at der er større risiko forbundet med denne virksomheden, da den en mindre end 5 år gammel.",
      "classification": "negative",
      "weight": 1900
    },
    "address": {
      "title": "Adressseskift",
      "message": "Virksomheden har skiftet adresse mere end 3 gange i løbet af de sidste 3 år.",
      "description": "Informationen fremkommer, hvis virksomheden har skiftet adresse inden for de sidste par år.",
      "classification": "neutral",
      "weight": 1850
    },
    "change_in_management": {
      "title": "Udskifting i ledelsen",
      "message": "Virksomheden har haft ændringer i direktionen og/eller bestyrelsen 3 eller flere gange sidste år.",
      "description": "Informationen fremkommer, hvis der har været udskiftninger i direktionen og/eller bestyrelsen det sidste 3 år.",
      "classification": "neutral",
      "weight": 1875
    },
    "powers_to_bind": {
      "title": "\u00c6ndring i tegningsregel",
      "message": "Virksomheden har ændret tegningsregel indenfor det sidste år.",
      "description": "Informationen fremkommer, hvis virksomheden har ændret tegningsregel inden for sidste år.",
      "classification": "neutral",
      "weight": 3750
    },
    "change_in_employees": {
      "title": "\u00c6ndring i antal ansatte",
      "message": "Virksomhedens antal ansatte er steget over de sidste 3 år.",
      "description": "Informationen fremkommer, hvis antallet af medarbejdere er steget eller faldet over de sidste 3 år.",
      "classification": "positive",
      "weight": 2500
    },
    "intangible_assets": {
      "title": "Stor andel immaterielle anlægsaktiver",
      "message": "Over 50% af egenkapitalen i selskabet består af immaterielle anlægsaktiver, hvilket kan betyde en øget finansiel risiko.",
      "description": "Informationen fremkommer, hvis virksomheden har en høj andel immaterielle anlægsaktiver, hvilket kan være en risiko-faktor.",
      "classification": "negative",
      "weight": 1950
    },
    "type_of_auditor_assistance": {
      "title": "Revisionsniveau",
      "message": "Virksomhedens seneste regnskab er blevet revideret af en revisor.",
      "description": "Informationen fremkommer, hvis virksomheden ikke har fået lavet fuld revision af seneste regnskab.",
      "classification": "neutral",
      "weight": null
    },
    "connected_bankruptcies": {
      "title": "Konkursanalyse",
      "message": "Der er 1 konkurs i blandt de personer der har relation til virksomheden. Det har ikke trukket ned i den samlede kreditscore.",
      "description": "Informationen fremkommer, hvis der har været konkurser blandt de personer, der har relation til virksomheden.",
      "classification": "neutral",
      "weight": 3200
    }
  }
}

Rating

These endpoints are essentially a way to sum up the entire company. We provide a number to represent how risky the company is (Risika score), and a credit recomendation.

Grades

GET
/{country}/rating/scores/{local_id}

Credit

GET
/{country}/rating/credit/{local_id}

Scores (Risika score)

NB: only works for Danish companies at the moment. If you want the Risika Score for Swedish or Norwegian companies, you can use the /company/basics endpoint to get the current score for the company.

This endpoint provides historical Risika scores.

We calculate the grade for each financial report available. This way, you will both have their current score but also the historic one, and will be able to see the development of their score over time.

Note: the list of scores is not sorted, but we do provide a date.

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/rating/scores/37677892 \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

[
  {
    "date": "2018-12-31",
    "score": 3
  },
  {
    "date": "2017-12-31",
    "score": 3
  }
]

Credit

This endpoint provides a credit recomendation for the company you requested. We provide you a credit max, credit days and an upfront payment recomendation.

You can pass a credit parameter, but it is not required.

The credit max does not depend on the credit you provide. We do, however, use the specified credit to calculate the max amount of days you should provide the specified amount of credit.

We also provide an upfront payment amount. If the credit you provided is greater than the credit max, we will recommend that you request the remaining payment upfront.

GET
/{country}/rating/credit/{local_id}?credit={amount}

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/rating/credit/37677892?credit=1000 \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "upfront": null,
  "credit_days": 7,
  "credit_max": 9000
}

We provide two endpoints for searching – the first searches for companies, the second for people.

Company

POST
/{country}/search/company

Person

POST
/{country}/search/person

Search company

This endpoint enables you to search for companies by name instead of providing a local ID (e.g. CVR) number. We return very basic information about the company as a response: local ID and company name.

You can search with two different modes: minimal or full.

Minimal
Limited to 25 search results. The results are also much simpler, containing only the name, local ID and country code.

Full
There is no limit in the traditional sense, you use two additional parameters – to and from – which works as a way to paginate through the results. They default to a range of 0 – 100 if the to and from parameters aren't specified.

The results from the full mode also contains the Risika Score, company type, employee count and whether it is active.

POST
/{country}/search/company

Example request (minimal)

curl --request POST \
  --url https://api.risika.dk/v1.2/dk/search/company \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>' \
  --data '{ "mode": "minimal", "filters": { "company_name": "risika" } }'

Example response (minimal)

{
  "search_result": [
    {
      "local_organization_id": {
        "country": "DK",
        "id": "37677892"
      },
      "company_name": "RISIKA A/S"
    }
  ],
  "count": 1
}

Example request (full)

curl --request POST \
  --url https://api.risika.dk/v1.2/dk/search/company \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>' \
  --data '{ "mode": "full", "from": 0, "to": 100, "filters": { "company_name": "risika", "company_type": ["A/S"], "score": [1, 2, 3, 4, 5], "active": true } }'

Example response (full)

{
  "search_result": [
    {
      "local_organization_id": {
        "country": "DK",
        "id": "37677892"
      },
      "active": true,
      "company_name": "RISIKA A/S",
      "score": 3,
      "company_type": "A/S",
      "employees_interval": "5-9",
      "advertisement_protected": true,
      "address": {
        "city": "København K",
        "coname": null,
        "number": "26, st.",
        "street": "Kronprinsessegade",
        "country": "DK",
        "zipcode": 1306,
        "postdistrict": "København K"
      }
    }
  ],
  "rows": {
    "from": 0,
    "to": 1
  },
  "count": 1
}

Search person

TODO: write a description

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/search/person \
  --header 'Authorization: <access_token>'
  --data '{ "query": "Timm Jeppesen" }'

Example response

{
  "search_result": [
    {
      "personal_id": 4006873173,
      "name": "Timm Jeppesen",
      "aliases": [
        "Timm Jeppesen"
      ],
      "functions": [
        {
          "active": true,
          "function": "ADMINISTRERENDE DIREKT\u00d8R"
        },
        {
          "active": true,
          "function": "BESTYRELSE"
        },
        {
          "active": true,
          "function": "DIREKTION"
        },
        {
          "active": true,
          "function": "REEL EJER"
        },
        {
          "active": true,
          "function": "STIFTERE"
        }
      ],
      "active_company_relations": [
        "MoneyFlow Group ApS",
        "RISIKA A/S",
        "TJ Formueinvest ApS",
        "TNT Holding DK ApS"
      ],
      "last_update": 1547059767000
    }
  ],
  "count": 1
}

Webhook

We provide a webhook which enables you to receive updates as soon as they happen. To get them to work, you need to setup a URL (e.g. https://your-site.com/webhook) where you want to receive the updates. You then have two options, you can either register it on the dashboard from https://dashboard.risika.dk/developer or by using the API.

We provide four endpoints concerning wehooks: add, remove, status and test.

When you have added your webhook, we generate a secret for you which you can use to verify that the request is actually from us (we send a signature along with the request to your webhook).

Add

POST
/webhook/add

Remove

GET
/webhook/remove

Status

GET
/webhook/status

Test

GET
/webhook/test

Add Webhook

To add a webhook you simply send a POST request containing the URL you want to register. Alternatively, you can do it directly from the dashboard.

POST
/webhook/add

Example request

curl --request POST \
  --url https://api.risika.dk/v1.2/webhook/add \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>' \
  --data '{ "url": "https://example-webhook.com/webhook" }'

Example response

{
  "status": "ok"
}

Remove Webhook

You can only have single webhook registered to your account at a time, so you simply make a GET request and it will be removed.

GET
/webhook/remove

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/webhook/remove \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "status": "ok"
}

Webhook Status

To check if you have a webhook registered, and to see your secret, you can make a GET request to the status endpoint. The secret is used to verify that any incoming requests are actually from us.

GET
/webhook/status

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/webhook/status \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "url": "https://example-site.com/webhook",
  "secret": "e5l13ukdqld43lpj6e6jkm7dy1zl2tbdj1ugwf6rjlvpzn4cnzk42orbvffv92ue"
}

Test Webhook

To make sure you have set up the webhook correctly, you can make a request to our test endpoint. Within 2 minutes you should receive an example request with some data.

The example data you receive is also how it's going to look like when we send an actual update.

GET
/webhook/test

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/webhook/test \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "status": "ok"
}

Test example sent to your URL

{
  "signature": "81c92205af9c07f1jso29ac47ca0ad8c4ab53a59",
  "companies": [
    {
      "local_id": "37677892",
      "country": "dk"
    }
  ]
}

Lists

We provide a list for municipalities and regions to make it easier to filter the data when searching. The search offers a lot of flexiblity for filtering by postal code, but what if you want a more broad area? No problem, use our lists to select the relevant postal codes.

Municipalities

GET
/{country}/list/municipalities

Regions

GET
/{country}/list/regions

List municipalities

This list will display all the municipalties in Denmark. Each municipalty contains an array of all the postal codes within the area.

GET
/{country}list/municipalities

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/list/municipalities \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "municipalities": {
    "Læsø": [9940],
    "Vordingborg": [4720, 4733, 4735, 4750, 4760, 4771, 4772, 4773, 4780, 4791, 4792, 4793],
    "Høj-Taastrup": [2630, 2640, 4000],
    "Herlev": [2730, 2740, 2880],
    "Guldborgsund": [4800, 4840, 4850, 4862, 4863, 4871, 4872, 4873, 4874, 4880, 4891, 4892, 4894, 4930, 4990],
    "Vesthimmerlands": [9240, 9541, 9600, 9610, 9620, 9631, 9640, 9670, 9681],
    "Svendborg": [5700, 5762, 5771, 5772, 5854, 5874, 5881, 5882, 5883, 5884, 5892]
  }
}

List regions

This list will display all the regions in Denmark. Each region contains an array of all the postal codes within the area.

GET
/{country}/list/regions

Example request

curl --request GET \
  --url https://api.risika.dk/v1.2/dk/list/regions \
  --header 'Content-Type: application/json' \
  --header 'Authorization: <access_token>'

Example response

{
  "regions": {
    "Region Nordjylland": [
      7900,
      7950,
      7960,
      7970,
      7980,
      7990,
      7700,
      7730,
      7741,
      7742,
      7752,
      7755,
      7760,
      7770,
      9320,
      9330,
      9340
    ],
    "Region Hovedstaden": [
      1050,
      1051,
      1052,
      1053,
      1054,
      1055,
      1056,
      1057,
      1058,
      1059,
      1060,
      1061,
      1062,
      1063,
      1064,
      1065,
      1066,
      1067,
      1068,
      1069,
      1070,
      1071
    ]
  }
}

Errors you might encounter

Out in the wild, there are different kinds of errors you might encounter when you utilize the API. This section aims to provide you with information to help prevent them, and what might be causing the errors to help you fix them faster and make debugging easier.

Authorization

The authorization can fail in different ways, and each situation is different. We provide you with the necessary information to help solve the issue. The errors you might encounter are the following:

Missing authorization header
This happens when you haven't provided the Authorization header or when no authorization token has been provided.

Invalid authorization header: must start with JWT
This happens when the token you provided didn't start with 'jwt', even if the remaining token is correct.

Signature verification failed
This happens when the authorization token you provided was invalid.

Signature has expired
This will most likely happen when the access token you provided was generated more than 10 minutes ago, and you will need to request a new one.

When the authorization header has not been specified

{ "error": "Missing Authorization Header" }

When the token provided didn't begin with 'jwt'

{ "error": "Invalid Authorization Header: Must start with JWT" }

When the token provided was invalid

{ "error": "Signature verification failed" }

When the token has expired

{ "error": "Signature has expired" }

Endpoint

Unknown resource
This happens if the endpoint you provided doesn't exist.

When the endpoint doesn't exist

{ "error": "Unknown resource" }

CVR-number

Invalid CVR-number
The format of the CVR-number is not correct e.g. if didn't contain exactly 8 digits, it contained letters or other illegal characters.

No company with the CVR-number
We provide this error when the format was correct, but we didn't find a company associated with the CVR-number you provided.

When the number you provided isn't a CVR-number

{ "error": "Invalid CVR-number" }

When the CVR-number is not associated with a company

{ "error": "No company with the CVR-number 37677893" }

Credit

Credit must be greater than 0
We cannot do any calculations based on a credit of '0'. If you don't know the credit amount, leave out the credit parameter alltogether, and we'll provide you with a standard calculatation.

Value not recognized as a number
We weren't able to parse the amount of credit you specified. Make sure to leave out thousand separators and decimals.

The credit was zero

{ "error": "Credit must be greater than 0" }

The credit provided couldn't be parsed as a number

{ "error": "Value not recognized as a number" }
Show examples in: