← APIs / CBS Statistics
Verified

CBS Statistics

Apiosk Basicsby Apiosk Basics · General

Official Dutch statistics per economic sector (SBI): bankruptcies, sector balance sheets and profit-and-loss, company counts by size class, closures and turnover momentum.

dataapi
Price per request
$0.02
About

StatLine is the statistical database of CBS, the Dutch national statistics office, published as an open OData v4 service with no API key and no upstream fee. This listing curates the six tables that put a single company's filed annual accounts in context, plus the four calls needed to address them. Sector financials: 81837NED gives equity (eigen vermogen) and total assets (balanstotaal) per branch for all limited companies in the non-financial sector — the same population that files a jaarrekening with KVK — and 81156ned gives the full cost and revenue structure (bedrijfsopbrengsten, netto-omzet, inkoopwaarde, personele kosten, afschrijvingen, bedrijfsresultaat, resultaat voor belastingen). Sector risk: 82244NED counts court-declared bankruptcies per branch monthly and annually, 81589NED gives the stock of businesses per branch and size class down to 5-digit SBI, 83149NED gives closures per branch and size class, and 86414NED gives the share of businesses in a branch whose turnover rose, held or fell. IMPORTANT for anyone writing a query: CBS does not key its branch dimension on the SBI code. The dimension key is an opaque identifier such as 397200 and the SBI code appears only as the leading token of the Title, so resolve it with startswith(Title,'642 ') — the trailing space is mandatory — and truncate a 5-digit KVK code one digit at a time until it matches. Two of the six tables (81837NED, 81156ned) and 86414NED exclude SBI section K, so companies in finance (64-66) have no benchmark there and must fall back to 82244NED or 81589NED. Open data under CC BY 4.0 with attribution to CBS.

Base URL
https://gateway.apiosk.com/cbs-statline
Technical Specs
Auth Methodnone
Response FormatJSON
Endpoints16
Endpoints
MethodPathDescriptionCost
GET /odata/v1/CBS/{tableId}/BedrijfstakkenBranchesSBI2008Codes Resolve an SBI code to the branch identifier a CBS table is actually keyed on — the call that makes every other query in this listing possible. Zet een SBI-code uit het Handelsregister om naar de CBS-bedrijfstakcode. CBS carries NO SBI field: the full row schema is Identifier, Index, Title, Description, DimensionGroupId, and the SBI code appears only as the leading token of Title ("642 Financiele holdings"). Resolve with $filter=startswith(Title,'642 '), and note the TRAILING SPACE is mandatory — startswith(Title,'64') also returns 641, 642 and 649. A KVK SbiBusinessCode is usually 5 digits and CBS usually publishes coarser, so truncate one digit at a time (64210, 6421, 642, 64) and take the first hit; report which level matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and the unparseable ones ("SBI-code onbekend").
$0.02 default
View details
GET /odata/v1/CBS/{tableId}/Dimensions List the dimensions of one CBS table and the URLs of their code sets. Call this FIRST for any table you have not used before: the branch dimension is NOT always called the same thing. It is BedrijfstakkenBranchesSBI2008 in the six curated tables in this listing, but BedrijfskenmerkenSBI2008 in others, and an observation filter naming the wrong dimension returns HTTP 400. Each row gives Identifier (the property name used in $filter on Observations), Title, Kind and the CodesUrl / GroupsUrl to resolve its codes.
$0.02 default
View details
GET /odata/v1/CBS/{tableId}/MeasureCodes Resolve the measure codes of one CBS table to their titles and units. An observation row carries only a code such as M001327 or D002079; this is the only way to learn that they mean "Uitgesproken faillissementen" and "Bedrijfsresultaat". $expand does not exist anywhere in this API, so code resolution is ALWAYS a separate request and a client-side join. Note that measure Titles are not unique on their own — many read simply "Totaal" — so join MeasureGroups, or rely on the _1/_2 suffix pairing where a group code ends _1 and its total ends _2.
$0.02 default
View details
GET /odata/v1/CBS/81156ned Code books for CBS table 81156ned — "Bedrijfsleven; arbeids- en financiele gegevens, per branche". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/81156ned/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008 and Perioden. Measure titles here are not unique on their own — many read simply Totaal — so pair a group code ending _1 with its total ending _2, e.g. M002065_1 Personele kosten with M002065_2 Totaal. NOTE the table id is LOWER CASE in the URL. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 320 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 320 branch codes, down to 4-digit SBI. Non-financial business economy only: sections K, O, P, Q, R, S94, T and U are absent. Annual, PeriodenCodes are YYYYJJ00, latest 2024JJ00.
$0.05 default
View details
GET /odata/v1/CBS/81156ned/Observations Sector PROFIT AND LOSS per SBI branch — CBS table 81156ned, "Bedrijfsleven; arbeids- en financiele gegevens, per branche". The full cost and revenue structure of a branch: M001588_2 bedrijfsopbrengsten, M002061 netto-omzet, M002063_2 bedrijfskosten, M002065_2 personele kosten, D002078 afschrijvingen, D002079 bedrijfsresultaat, D002080 saldo financiele baten en lasten, D002081 resultaat voor belastingen — all in millions of euro — plus employment in jobs and labour volume. Lets a filer's own income statement lines be set beside the branch aggregate and a sector operating margin derived. Annual, Perioden format YYYYJJ00, latest 2024JJ00. 320 branch codes, down to 4-digit SBI, so matches are usually closer than in 81837NED. NOTE the table id is LOWER CASE in the URL. COVERAGE GAP: the non-financial business economy only — sections K (finance), O, P, Q, R, S94, T and U are absent, so a company in 64210 or 88911 has no benchmark here.
$0.05 default
View details
GET /odata/v1/CBS/81589NED Code books for CBS table 81589NED — "Bedrijven; bedrijfstak". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/81589NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008 and Perioden. With 1487 codes this is the one table where fetching the whole code list is worth a moment's thought; it is still a single call and still one charge. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 1487 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 1487 branch codes, down to full 5-digit SBI — the deepest in this listing, so a KVK SbiBusinessCode often matches exactly. Covers the financial sector. Quarterly, PeriodenCodes are YYYYKW0n, latest 2026KW03.
$0.05 default
View details
GET /odata/v1/CBS/81589NED/Observations Company stock per SBI branch and size class — CBS table 81589NED, "Bedrijven; bedrijfstak". The denominator for every rate in this listing, and the most SBI-granular table here: 1487 branch codes, down to full 5-digit SBI, so a KVK SbiBusinessCode often matches exactly. Gives the number of businesses in a branch broken out by size class (1, 2, 3-5, 5-10, 10-20, 20-50, 50-100, 100+ werkzame personen) and by legal-person status, quarterly, latest 2026KW03. Use it to size a peer group, or to turn a bankruptcy or closure count into a rate. Values are ROUNDED TO MULTIPLES OF 5, so the size bands need not sum exactly to the total and a small branch is imprecise — never present a derived percentage from a small cell to more than whole-number precision, and NEVER use a zero cell as a denominator — a returned 0 means "fewer than 3", not "none", so any rate computed against it is undefined rather than merely large. The size bands, the roll-ups and the legal-form split all measure the SAME cell, so summing every measure double-counts.
$0.05 default
View details
GET /odata/v1/CBS/81837NED Code books for CBS table 81837NED — "Financien alle ondernemingen; niet-financiele sector". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/81837NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008 and Perioden. Key measures: M000268 Eigen vermogen, M000360 Balanstotaal, M002394 Ondernemingengroep (the entity count behind each aggregate). RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 104 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 104 branch codes, mostly 2-digit SBI. Non-financial sector only: SBI section K (64-66) is absent, so a company in 64210 cannot be resolved here at all. Annual, PeriodenCodes are YYYYJJ00, latest 2024JJ00.
$0.05 default
View details
GET /odata/v1/CBS/81837NED/Observations Sector BALANCE SHEET per SBI branch — CBS table 81837NED, "Financien alle ondernemingen; niet-financiele sector". The closest thing to a peer group for a filed jaarrekening: its population is limited companies (N.V., B.V., cooperatie), the same population that files annual accounts with KVK, compiled from corporate tax returns and direct survey. Carries M000268 Eigen vermogen and M000360 Balanstotaal per branch, so a filer's own equity and total assets can be placed against a sector solvency ratio, plus M002394 Ondernemingengroep, the number of entities behind each aggregate, which turns any euro total into a per-company average. Annual, Perioden format YYYYJJ00, latest 2024JJ00. 104 branch codes, so mostly 2-digit SBI: expect to truncate a 5-digit KVK code. COVERAGE GAP: the non-financial sector only — SBI section K (64-66, banking, insurance, holdings) is absent, so a company in 64210 has no benchmark here; use 82244NED or 81589NED instead.
$0.05 default
View details
GET /odata/v1/CBS/82244NED Code books for CBS table 82244NED — "Faillissementen; bedrijven en instellingen, SBI 2008". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/82244NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008, TypeGefailleerde and Perioden. TypeGefailleerdeCodes matters as much as the branch codes: A047596 is the total across types, and leaving TypeGefailleerde unpinned in an Observations filter returns the same event under several breakdowns. The single measure is M001327 Uitgesproken faillissementen, unit Aantal. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 372 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 372 branch codes, down to 3-digit SBI. This is the ONLY table in the listing that covers SBI section K, so it is the fallback for finance: 396400 is 64 Bankwezen, 397200 is 642 Financiele holdings. Mixed frequencies in one table: YYYYJJ00 annual, YYYYKW0n quarterly, YYYYMM0n monthly.
$0.05 default
View details
GET /odata/v1/CBS/82244NED/Observations Bankruptcies per SBI branch — CBS table 82244NED, "Faillissementen; bedrijven en instellingen, SBI 2008". Court-declared bankruptcies (uitgesproken faillissementen, measure M001327) per branch, monthly, quarterly and annually. This is what turns a weak balance sheet into a risk statement. Unlike the two financial tables it DOES cover SBI section K, so it is the fallback for companies in finance: 396400 is "64 Bankwezen", 397200 is "642 Financiele holdings". 372 branch codes down to 3-digit SBI. Perioden mixes frequencies: YYYYJJ00 annual, YYYYKW0n quarterly, YYYYMM0n monthly — pin one or you will mix them in a single sum. PIN TypeGefailleerde TOO: leaving it open returns the same event under several breakdowns; A047596 is the total. The two most recent months are provisional (voorlopig). There is no denominator here, so an unnormalised count means little for a large branch — divide by the company stock from 81589NED for a rate — and check that stock is non-zero first, because 81589NED rounds to multiples of 5 and a rare branch comes back as 0.
$0.05 default
View details
GET /odata/v1/CBS/83149NED Code books for CBS table 83149NED — "Bedrijven; opheffingen, bedrijfsgrootte, rechtsvorm, bedrijfstak". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/83149NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008, a size-class dimension, a legal-form dimension and Perioden. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 401 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 401 branch codes, mostly 2- and 3-digit SBI. Covers the financial sector. Quarterly, PeriodenCodes are YYYYKW0n, latest 2026KW02 — one quarter behind 81589NED.
$0.05 default
View details
GET /odata/v1/CBS/83149NED/Observations Business closures per SBI branch and size class — CBS table 83149NED, "Bedrijven; opheffingen, bedrijfsgrootte, rechtsvorm, bedrijfstak". The other half of the risk picture, and the more common fate of a small B.V. with negative equity than bankruptcy: opheffingen include voluntary wind-downs, not just court-declared insolvency. Quarterly, latest 2026KW02, 401 branch codes, and the financial sector is present. Values are rounded to multiples of 5 like 81589NED, so bands need not sum to the total and a 0 can mean "fewer than 3". This table lags 81589NED by one quarter — do not divide a KW02 closure count by a KW03 company stock; align the periods explicitly.
$0.05 default
View details
GET /odata/v1/CBS/86414NED Code books for CBS table 86414NED — "Bedrijfsgegevens; omzetontwikkeling (stijgers-dalers), SBI 2008". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/86414NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: Bedrijfsgrootte, BedrijfstakkenBranchesSBI2008 and Perioden — three dimensions, so BedrijfsgrootteCodes is needed as well. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 160 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 160 branch codes, the coarsest here, so expect to truncate a 5-digit KVK code to 2 digits. No SBI section K. Quarterly, PeriodenCodes are YYYYKW0n, latest 2026KW02.
$0.05 default
View details
GET /odata/v1/CBS/86414NED/Observations Turnover momentum per SBI branch, as a distribution — CBS table 86414NED, "Bedrijfsgegevens; omzetontwikkeling (stijgers-dalers), SBI 2008". Unusually useful for benchmarking one company because it reports a DISTRIBUTION rather than an aggregate: what percentage of businesses in a branch and size class saw turnover rise, hold steady or fall, split into fast and normal movers. That answers "is this company's revenue drop its own problem or the whole sector's" in a way a branch total cannot. The freshest table in this listing. 160 branch codes, the coarsest here, so expect to truncate a 5-digit KVK code to 2 digits. Values are percentages over overlapping sets — the risers total equals fast risers plus normal risers, and likewise for fallers — so never add every measure together. COVERAGE GAP: no SBI section K, so no benchmark for finance.
$0.05 default
View details
GET /odata/v1/CBS/Datasets Search the CBS StatLine catalogue — 4,871 datasets. Zoek een CBS-tabel op titel, onderwerp of status. Returns each dataset's Identifier (the table id used by every other call here, e.g. 82244NED), Title, Description, Status, ObservationCount, Modified and ReleaseDate. Filter with $filter=contains(Title,'Faillissementen'), and ALWAYS add "and Status eq 'Regulier'" unless you want discontinued tables: 71 of the 105 SBI-keyed tables are Gediscontinueerd and still returned, leaving 34 Regulier. Use this to find a table, then /Dimensions to learn how it is keyed.
$0.05 default
View details
Endpoint documentation
GET/odata/v1/CBS/{tableId}/BedrijfstakkenBranchesSBI2008Codes
$0.02 default
Description

Resolve an SBI code to the branch identifier a CBS table is actually keyed on — the call that makes every other query in this listing possible. Zet een SBI-code uit het Handelsregister om naar de CBS-bedrijfstakcode. CBS carries NO SBI field: the full row schema is Identifier, Index, Title, Description, DimensionGroupId, and the SBI code appears only as the leading token of Title ("642 Financiele holdings"). Resolve with $filter=startswith(Title,'642 '), and note the TRAILING SPACE is mandatory — startswith(Title,'64') also returns 641, 642 and 649. A KVK SbiBusinessCode is usually 5 digits and CBS usually publishes coarser, so truncate one digit at a time (64210, 6421, 642, 64) and take the first hit; report which level matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and the unparseable ones ("SBI-code onbekend").

Documentation

GET /odata/v1/CBS/{tableId}/BedrijfstakkenBranchesSBI2008Codes — SBI code to CBS branch key. Trailing space in startswith is mandatory; truncate a 5-digit KVK code until it hits; never climb to T001081.

Pricing
$0.02 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "Resolution filter. Use startswith(Title,'<sbi> ') WITH a trailing space, e.g. startswith(Title,'642 '). Omit to list every branch code the table publishes.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum codes to return. The largest of the curated tables publishes 1487 branch codes.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "tableId": {
      "description": "CBS table identifier, e.g. 82244NED. All six curated tables in this listing use the BedrijfstakkenBranchesSBI2008 dimension; for any other table call /Dimensions first, because the dimension name varies.",
      "pattern": "^[0-9]{5}[A-Za-z]{3}$",
      "required": true,
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "tableId"
  ],
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS branch key, e.g. 397200. This is what an Observations $filter compares against. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "\"<SBI token> <Dutch label>\", e.g. \"642 Financiele holdings\". The SBI token may also be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "startswith(Title,'642 ')",
  "$select": "Identifier,Title",
  "tableId": "82244NED"
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/82244NED/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "397200",
      "Title": "642 Financiële holdings"
    }
  ]
}
GET/odata/v1/CBS/{tableId}/Dimensions
$0.02 default
Description

List the dimensions of one CBS table and the URLs of their code sets. Call this FIRST for any table you have not used before: the branch dimension is NOT always called the same thing. It is BedrijfstakkenBranchesSBI2008 in the six curated tables in this listing, but BedrijfskenmerkenSBI2008 in others, and an observation filter naming the wrong dimension returns HTTP 400. Each row gives Identifier (the property name used in $filter on Observations), Title, Kind and the CodesUrl / GroupsUrl to resolve its codes.

Documentation

GET /odata/v1/CBS/{tableId}/Dimensions — dimension discovery. The branch dimension name varies per table; read it here rather than assuming.

Pricing
$0.02 default
Parameters
{
  "properties": {
    "tableId": {
      "description": "CBS table identifier from the Datasets catalogue, e.g. 82244NED. Case sensitive: 81156ned is lower case.",
      "pattern": "^[0-9]{5}[A-Za-z]{3}$",
      "required": true,
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "tableId"
  ],
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "CodesUrl": {
            "type": "string"
          },
          "GroupsUrl": {
            "type": "string"
          },
          "Identifier": {
            "description": "The property name to use in an Observations $filter.",
            "type": "string"
          },
          "Kind": {
            "type": "string"
          },
          "Title": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "tableId": "82244NED"
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/82244NED/$metadata#Dimensions",
  "value": [
    {
      "Identifier": "BedrijfstakkenBranchesSBI2008",
      "Kind": "Dimension",
      "Title": "Bedrijfstakken/branches (SBI 2008)"
    },
    {
      "Identifier": "TypeGefailleerde",
      "Kind": "Dimension",
      "Title": "Type gefailleerde"
    },
    {
      "Identifier": "Perioden",
      "Kind": "TimeDimension",
      "Title": "Perioden"
    }
  ]
}
GET/odata/v1/CBS/{tableId}/MeasureCodes
$0.02 default
Description

Resolve the measure codes of one CBS table to their titles and units. An observation row carries only a code such as M001327 or D002079; this is the only way to learn that they mean "Uitgesproken faillissementen" and "Bedrijfsresultaat". $expand does not exist anywhere in this API, so code resolution is ALWAYS a separate request and a client-side join. Note that measure Titles are not unique on their own — many read simply "Totaal" — so join MeasureGroups, or rely on the _1/_2 suffix pairing where a group code ends _1 and its total ends _2.

Documentation

GET /odata/v1/CBS/{tableId}/MeasureCodes — measure code to title and unit. $expand is unsupported API-wide, so this join is always a separate call.

Pricing
$0.02 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "Filter over the measure codes, e.g. contains(Title,'Bedrijfsresultaat').",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title,Unit.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum codes to return. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "tableId": {
      "description": "CBS table identifier, e.g. 82244NED.",
      "pattern": "^[0-9]{5}[A-Za-z]{3}$",
      "required": true,
      "type": "string",
      "x-parameter-location": "path"
    }
  },
  "required": [
    "tableId"
  ],
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "Double or String. A String measure puts its value in StringValue, not Value.",
            "type": "string"
          },
          "Decimals": {
            "type": "integer"
          },
          "Description": {
            "type": "string"
          },
          "Identifier": {
            "description": "The value used in an Observations $filter as Measure eq '<Identifier>'.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "MeasureGroupId": {
            "type": "string"
          },
          "Title": {
            "description": "Often just \"Totaal\"; not unique without its group.",
            "type": "string"
          },
          "Unit": {
            "description": "e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title,Unit",
  "$top": 3,
  "tableId": "82244NED"
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/82244NED/$metadata#MeasureCodes(Identifier,Title,Unit)",
  "value": [
    {
      "Identifier": "M001327",
      "Title": "Uitgesproken faillissementen",
      "Unit": "Aantal"
    }
  ]
}
GET/odata/v1/CBS/81156ned
$0.05 default
Description

Code books for CBS table 81156ned — "Bedrijfsleven; arbeids- en financiele gegevens, per branche". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/81156ned/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008 and Perioden. Measure titles here are not unique on their own — many read simply Totaal — so pair a group code ending _1 with its total ending _2, e.g. M002065_1 Personele kosten with M002065_2 Totaal. NOTE the table id is LOWER CASE in the URL. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 320 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 320 branch codes, down to 4-digit SBI. Non-financial business economy only: sections K, O, P, Q, R, S94, T and U are absent. Annual, PeriodenCodes are YYYYJJ00, latest 2024JJ00.

Documentation

GET /odata/v1/CBS/81156ned — code books for 81156ned. Literal path: every Codes/Groups/Dimensions collection under it resolves here.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "OData filter over the collection, e.g. startswith(Title,'642 ') on the branch codes. Omit it to fetch the whole code list in one call, which is usually cheaper.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. Maximum 100000. Supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "On MeasureCodes only. A String measure fills StringValue, not Value.",
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS key an Observations $filter compares against, e.g. 397200. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "An SBI token then a Dutch label. The token may be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          },
          "Unit": {
            "description": "On MeasureCodes only, e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/81156ned/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "T001081",
      "Title": "A-U Alle economische activiteiten"
    }
  ]
}
GET/odata/v1/CBS/81156ned/Observations
$0.05 default
Description

Sector PROFIT AND LOSS per SBI branch — CBS table 81156ned, "Bedrijfsleven; arbeids- en financiele gegevens, per branche". The full cost and revenue structure of a branch: M001588_2 bedrijfsopbrengsten, M002061 netto-omzet, M002063_2 bedrijfskosten, M002065_2 personele kosten, D002078 afschrijvingen, D002079 bedrijfsresultaat, D002080 saldo financiele baten en lasten, D002081 resultaat voor belastingen — all in millions of euro — plus employment in jobs and labour volume. Lets a filer's own income statement lines be set beside the branch aggregate and a sector operating margin derived. Annual, Perioden format YYYYJJ00, latest 2024JJ00. 320 branch codes, down to 4-digit SBI, so matches are usually closer than in 81837NED. NOTE the table id is LOWER CASE in the URL. COVERAGE GAP: the non-financial business economy only — sections K (finance), O, P, Q, R, S94, T and U are absent, so a company in 64210 or 88911 has no benchmark here.

Documentation

GET /odata/v1/CBS/81156ned/Observations — sector profit and loss per SBI branch. Lower-case table id. Non-financial business economy only.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter over BedrijfstakkenBranchesSBI2008, Perioden and Measure, e.g. BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2024JJ00'. Supported: eq, ne, and, or, in, startswith, contains. NOT supported: $expand (400 everywhere). $apply is broken rather than absent: groupby returns 500, aggregate returns 400; only $apply=filter works.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Measure,Value.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. WARNING: supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.nextLink": {
      "type": "string"
    },
    "value": {
      "items": {
        "properties": {
          "BedrijfstakkenBranchesSBI2008": {
            "type": "string"
          },
          "Id": {
            "type": "integer"
          },
          "Measure": {
            "type": "string"
          },
          "Perioden": {
            "type": "string"
          },
          "StringValue": {
            "type": "string"
          },
          "Value": {
            "description": "Millions of euro for the financial measures; thousands of jobs for the employment measures. Read the unit from /MeasureCodes.",
            "type": "number"
          },
          "ValueAttribute": {
            "description": "None, Impossible (Value null) or Zero.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2024JJ00' and Measure in ('2021320_1','M001588_2','M002061','M002063_2')"
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/81156ned/$metadata#Observations",
  "value": [
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 139559,
      "Measure": "2021320_1",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 263.3,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 139563,
      "Measure": "M001588_2",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 71307.0,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 139564,
      "Measure": "M002061",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 66339.0,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 139566,
      "Measure": "M002063_2",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 65013.0,
      "ValueAttribute": "None"
    }
  ]
}
GET/odata/v1/CBS/81589NED
$0.05 default
Description

Code books for CBS table 81589NED — "Bedrijven; bedrijfstak". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/81589NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008 and Perioden. With 1487 codes this is the one table where fetching the whole code list is worth a moment's thought; it is still a single call and still one charge. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 1487 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 1487 branch codes, down to full 5-digit SBI — the deepest in this listing, so a KVK SbiBusinessCode often matches exactly. Covers the financial sector. Quarterly, PeriodenCodes are YYYYKW0n, latest 2026KW03.

Documentation

GET /odata/v1/CBS/81589NED — code books for 81589NED. Literal path: every Codes/Groups/Dimensions collection under it resolves here.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "OData filter over the collection, e.g. startswith(Title,'642 ') on the branch codes. Omit it to fetch the whole code list in one call, which is usually cheaper.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. Maximum 100000. Supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "On MeasureCodes only. A String measure fills StringValue, not Value.",
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS key an Observations $filter compares against, e.g. 397200. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "An SBI token then a Dutch label. The token may be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          },
          "Unit": {
            "description": "On MeasureCodes only, e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/81589NED/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "T001081",
      "Title": "A-U Alle economische activiteiten"
    }
  ]
}
GET/odata/v1/CBS/81589NED/Observations
$0.05 default
Description

Company stock per SBI branch and size class — CBS table 81589NED, "Bedrijven; bedrijfstak". The denominator for every rate in this listing, and the most SBI-granular table here: 1487 branch codes, down to full 5-digit SBI, so a KVK SbiBusinessCode often matches exactly. Gives the number of businesses in a branch broken out by size class (1, 2, 3-5, 5-10, 10-20, 20-50, 50-100, 100+ werkzame personen) and by legal-person status, quarterly, latest 2026KW03. Use it to size a peer group, or to turn a bankruptcy or closure count into a rate. Values are ROUNDED TO MULTIPLES OF 5, so the size bands need not sum exactly to the total and a small branch is imprecise — never present a derived percentage from a small cell to more than whole-number precision, and NEVER use a zero cell as a denominator — a returned 0 means "fewer than 3", not "none", so any rate computed against it is undefined rather than merely large. The size bands, the roll-ups and the legal-form split all measure the SAME cell, so summing every measure double-counts.

Documentation

GET /odata/v1/CBS/81589NED/Observations — company stock per SBI branch and size class, down to 5-digit SBI. Values rounded to multiples of 5.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter over BedrijfstakkenBranchesSBI2008, Perioden and Measure, e.g. BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2026KW03'. Supported: eq, ne, and, or, in, startswith, contains. NOT supported: $expand (400 everywhere). $apply is broken rather than absent: groupby returns 500, aggregate returns 400; only $apply=filter works.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. WARNING: supplying $top suppresses @odata.nextLink. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.nextLink": {
      "type": "string"
    },
    "value": {
      "items": {
        "properties": {
          "BedrijfstakkenBranchesSBI2008": {
            "type": "string"
          },
          "Id": {
            "type": "integer"
          },
          "Measure": {
            "description": "Size-class and roll-up measures over the same cell; resolve via /MeasureCodes and do not sum them together.",
            "type": "string"
          },
          "Perioden": {
            "description": "YYYYKW0n quarterly.",
            "type": "string"
          },
          "StringValue": {
            "type": "string"
          },
          "Value": {
            "description": "Rounded to a multiple of 5.",
            "type": "number"
          },
          "ValueAttribute": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2026KW03'",
  "$top": 4
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/81589NED/$metadata#Observations",
  "value": [
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 1026286,
      "Measure": "M000201",
      "Perioden": "2026KW03",
      "StringValue": null,
      "Value": 93060.0,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 1026287,
      "Measure": "WP19079",
      "Perioden": "2026KW03",
      "StringValue": null,
      "Value": 80120.0,
      "ValueAttribute": "None"
    }
  ]
}
GET/odata/v1/CBS/81837NED
$0.05 default
Description

Code books for CBS table 81837NED — "Financien alle ondernemingen; niet-financiele sector". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/81837NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008 and Perioden. Key measures: M000268 Eigen vermogen, M000360 Balanstotaal, M002394 Ondernemingengroep (the entity count behind each aggregate). RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 104 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 104 branch codes, mostly 2-digit SBI. Non-financial sector only: SBI section K (64-66) is absent, so a company in 64210 cannot be resolved here at all. Annual, PeriodenCodes are YYYYJJ00, latest 2024JJ00.

Documentation

GET /odata/v1/CBS/81837NED — code books for 81837NED. Literal path: every Codes/Groups/Dimensions collection under it resolves here.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "OData filter over the collection, e.g. startswith(Title,'642 ') on the branch codes. Omit it to fetch the whole code list in one call, which is usually cheaper.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. Maximum 100000. Supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "On MeasureCodes only. A String measure fills StringValue, not Value.",
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS key an Observations $filter compares against, e.g. 397200. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "An SBI token then a Dutch label. The token may be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          },
          "Unit": {
            "description": "On MeasureCodes only, e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/81837NED/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "T001081",
      "Title": "A-U Alle economische activiteiten"
    }
  ]
}
GET/odata/v1/CBS/81837NED/Observations
$0.05 default
Description

Sector BALANCE SHEET per SBI branch — CBS table 81837NED, "Financien alle ondernemingen; niet-financiele sector". The closest thing to a peer group for a filed jaarrekening: its population is limited companies (N.V., B.V., cooperatie), the same population that files annual accounts with KVK, compiled from corporate tax returns and direct survey. Carries M000268 Eigen vermogen and M000360 Balanstotaal per branch, so a filer's own equity and total assets can be placed against a sector solvency ratio, plus M002394 Ondernemingengroep, the number of entities behind each aggregate, which turns any euro total into a per-company average. Annual, Perioden format YYYYJJ00, latest 2024JJ00. 104 branch codes, so mostly 2-digit SBI: expect to truncate a 5-digit KVK code. COVERAGE GAP: the non-financial sector only — SBI section K (64-66, banking, insurance, holdings) is absent, so a company in 64210 has no benchmark here; use 82244NED or 81589NED instead.

Documentation

GET /odata/v1/CBS/81837NED/Observations — sector balance sheet (equity, total assets, entity count) per SBI branch. Non-financial sector only: no SBI section K.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter. Compose from BedrijfstakkenBranchesSBI2008 (resolve the code first), Perioden and Measure, e.g. BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2024JJ00'. Supported: eq, ne, and, or, in, startswith, contains. NOT supported: $expand (400 everywhere). $apply is broken rather than absent: groupby returns 500, aggregate returns 400; only $apply=filter works.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression, e.g. Perioden desc.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Measure,Value,Perioden.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip. This is how @odata.nextLink pages.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. WARNING: supplying $top suppresses @odata.nextLink entirely, so rows beyond it are silently lost rather than paged. Omit $top to get the nextLink chain. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.nextLink": {
      "description": "Present only when $top was omitted and more rows exist.",
      "type": "string"
    },
    "value": {
      "items": {
        "properties": {
          "BedrijfstakkenBranchesSBI2008": {
            "type": "string"
          },
          "Id": {
            "type": "integer"
          },
          "Measure": {
            "description": "Measure code; resolve via /MeasureCodes.",
            "type": "string"
          },
          "Perioden": {
            "description": "YYYYJJ00 for annual.",
            "type": "string"
          },
          "StringValue": {
            "description": "Populated instead of Value when the measure's DataType is String.",
            "type": "string"
          },
          "Value": {
            "description": "Null when ValueAttribute is Impossible.",
            "type": "number"
          },
          "ValueAttribute": {
            "description": "None = a real observation. Impossible = structurally not applicable, Value is null. Zero = a measured zero. There is no numeric suppression sentinel in this API.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2024JJ00' and (Measure eq 'M002394' or Measure eq 'M000360' or Measure eq 'M000268')",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/81837NED/$metadata#Observations",
  "value": [
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 35416,
      "Measure": "M002394",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 37538.0,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 35417,
      "Measure": "M000360",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 182545.3,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 35428,
      "Measure": "M000268",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "Value": 107136.0,
      "ValueAttribute": "None"
    }
  ]
}
GET/odata/v1/CBS/82244NED
$0.05 default
Description

Code books for CBS table 82244NED — "Faillissementen; bedrijven en instellingen, SBI 2008". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/82244NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008, TypeGefailleerde and Perioden. TypeGefailleerdeCodes matters as much as the branch codes: A047596 is the total across types, and leaving TypeGefailleerde unpinned in an Observations filter returns the same event under several breakdowns. The single measure is M001327 Uitgesproken faillissementen, unit Aantal. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 372 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 372 branch codes, down to 3-digit SBI. This is the ONLY table in the listing that covers SBI section K, so it is the fallback for finance: 396400 is 64 Bankwezen, 397200 is 642 Financiele holdings. Mixed frequencies in one table: YYYYJJ00 annual, YYYYKW0n quarterly, YYYYMM0n monthly.

Documentation

GET /odata/v1/CBS/82244NED — code books for 82244NED. Literal path: every Codes/Groups/Dimensions collection under it resolves here.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "OData filter over the collection, e.g. startswith(Title,'642 ') on the branch codes. Omit it to fetch the whole code list in one call, which is usually cheaper.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. Maximum 100000. Supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "On MeasureCodes only. A String measure fills StringValue, not Value.",
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS key an Observations $filter compares against, e.g. 397200. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "An SBI token then a Dutch label. The token may be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          },
          "Unit": {
            "description": "On MeasureCodes only, e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/82244NED/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "T001081",
      "Title": "A-U Alle economische activiteiten"
    },
    {
      "Identifier": "301000",
      "Title": "A Landbouw, bosbouw en visserij"
    },
    {
      "Identifier": "301100",
      "Title": "01 Landbouw"
    }
  ]
}
GET/odata/v1/CBS/82244NED/Observations
$0.05 default
Description

Bankruptcies per SBI branch — CBS table 82244NED, "Faillissementen; bedrijven en instellingen, SBI 2008". Court-declared bankruptcies (uitgesproken faillissementen, measure M001327) per branch, monthly, quarterly and annually. This is what turns a weak balance sheet into a risk statement. Unlike the two financial tables it DOES cover SBI section K, so it is the fallback for companies in finance: 396400 is "64 Bankwezen", 397200 is "642 Financiele holdings". 372 branch codes down to 3-digit SBI. Perioden mixes frequencies: YYYYJJ00 annual, YYYYKW0n quarterly, YYYYMM0n monthly — pin one or you will mix them in a single sum. PIN TypeGefailleerde TOO: leaving it open returns the same event under several breakdowns; A047596 is the total. The two most recent months are provisional (voorlopig). There is no denominator here, so an unnormalised count means little for a large branch — divide by the company stock from 81589NED for a rate — and check that stock is non-zero first, because 81589NED rounds to multiples of 5 and a rare branch comes back as 0.

Documentation

GET /odata/v1/CBS/82244NED/Observations — bankruptcies per SBI branch. Pin TypeGefailleerde (A047596 = total) and one Perioden frequency. Covers section K.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter. Pin BedrijfstakkenBranchesSBI2008, TypeGefailleerde and Perioden, e.g. BedrijfstakkenBranchesSBI2008 eq '397200' and TypeGefailleerde eq 'A047596' and Perioden eq '2024JJ00'. Supported: eq, ne, and, or, in, startswith, contains. NOT supported: $expand (400 everywhere). $apply is broken rather than absent: groupby returns 500, aggregate returns 400; only $apply=filter works.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression, e.g. Perioden desc.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. WARNING: supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.nextLink": {
      "type": "string"
    },
    "value": {
      "items": {
        "properties": {
          "BedrijfstakkenBranchesSBI2008": {
            "type": "string"
          },
          "Id": {
            "type": "integer"
          },
          "Measure": {
            "description": "M001327 = uitgesproken faillissementen, unit Aantal.",
            "type": "string"
          },
          "Perioden": {
            "description": "YYYYJJ00 annual, YYYYKW0n quarterly, YYYYMM0n monthly — all present in the same table.",
            "type": "string"
          },
          "StringValue": {
            "type": "string"
          },
          "TypeGefailleerde": {
            "description": "Pin this. A047596 is the total across types.",
            "type": "string"
          },
          "Value": {
            "type": "number"
          },
          "ValueAttribute": {
            "description": "None, Impossible (Value null) or Zero.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "BedrijfstakkenBranchesSBI2008 eq '397200' and TypeGefailleerde eq 'A047596' and Perioden eq '2024JJ00'"
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/82244NED/$metadata#Observations",
  "value": [
    {
      "BedrijfstakkenBranchesSBI2008": "397200",
      "Id": 76261,
      "Measure": "M001327",
      "Perioden": "2024JJ00",
      "StringValue": null,
      "TypeGefailleerde": "A047596",
      "Value": 336.0,
      "ValueAttribute": "None"
    }
  ]
}
GET/odata/v1/CBS/83149NED
$0.05 default
Description

Code books for CBS table 83149NED — "Bedrijven; opheffingen, bedrijfsgrootte, rechtsvorm, bedrijfstak". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/83149NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: BedrijfstakkenBranchesSBI2008, a size-class dimension, a legal-form dimension and Perioden. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 401 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 401 branch codes, mostly 2- and 3-digit SBI. Covers the financial sector. Quarterly, PeriodenCodes are YYYYKW0n, latest 2026KW02 — one quarter behind 81589NED.

Documentation

GET /odata/v1/CBS/83149NED — code books for 83149NED. Literal path: every Codes/Groups/Dimensions collection under it resolves here.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "OData filter over the collection, e.g. startswith(Title,'642 ') on the branch codes. Omit it to fetch the whole code list in one call, which is usually cheaper.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. Maximum 100000. Supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "On MeasureCodes only. A String measure fills StringValue, not Value.",
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS key an Observations $filter compares against, e.g. 397200. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "An SBI token then a Dutch label. The token may be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          },
          "Unit": {
            "description": "On MeasureCodes only, e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/83149NED/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "T001081",
      "Title": "A-U Alle economische activiteiten"
    }
  ]
}
GET/odata/v1/CBS/83149NED/Observations
$0.05 default
Description

Business closures per SBI branch and size class — CBS table 83149NED, "Bedrijven; opheffingen, bedrijfsgrootte, rechtsvorm, bedrijfstak". The other half of the risk picture, and the more common fate of a small B.V. with negative equity than bankruptcy: opheffingen include voluntary wind-downs, not just court-declared insolvency. Quarterly, latest 2026KW02, 401 branch codes, and the financial sector is present. Values are rounded to multiples of 5 like 81589NED, so bands need not sum to the total and a 0 can mean "fewer than 3". This table lags 81589NED by one quarter — do not divide a KW02 closure count by a KW03 company stock; align the periods explicitly.

Documentation

GET /odata/v1/CBS/83149NED/Observations — business closures per SBI branch and size class. Lags 81589NED by one quarter; rounded to multiples of 5.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter over BedrijfstakkenBranchesSBI2008, Perioden and Measure. Supported: eq, ne, and, or, in, startswith, contains. NOT supported: $expand (400 everywhere). $apply is broken rather than absent: groupby returns 500, aggregate returns 400; only $apply=filter works.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. WARNING: supplying $top suppresses @odata.nextLink. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.nextLink": {
      "type": "string"
    },
    "value": {
      "items": {
        "properties": {
          "BedrijfstakkenBranchesSBI2008": {
            "type": "string"
          },
          "Id": {
            "type": "integer"
          },
          "Measure": {
            "type": "string"
          },
          "Perioden": {
            "description": "YYYYKW0n quarterly.",
            "type": "string"
          },
          "StringValue": {
            "type": "string"
          },
          "Value": {
            "description": "Rounded to a multiple of 5; 0 can mean fewer than 3.",
            "type": "number"
          },
          "ValueAttribute": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2026KW02'",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/83149NED/$metadata#Observations",
  "value": [
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 260920,
      "Measure": "M002855",
      "Perioden": "2026KW02",
      "StringValue": null,
      "Value": 1395.0,
      "ValueAttribute": "None"
    },
    {
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 260921,
      "Measure": "WP19117",
      "Perioden": "2026KW02",
      "StringValue": null,
      "Value": 1305.0,
      "ValueAttribute": "None"
    }
  ]
}
GET/odata/v1/CBS/86414NED
$0.05 default
Description

Code books for CBS table 86414NED — "Bedrijfsgegevens; omzetontwikkeling (stijgers-dalers), SBI 2008". This one path serves every metadata collection of the table, because the gateway resolves a stored path as a literal prefix: /odata/v1/CBS/86414NED/BedrijfstakkenBranchesSBI2008Codes, /MeasureCodes, /PeriodenCodes, /Dimensions and /MeasureGroups all bill and cache against this row, while /Observations has its own. Dimensions of this table: Bedrijfsgrootte, BedrijfstakkenBranchesSBI2008 and Perioden — three dimensions, so BedrijfsgrootteCodes is needed as well. RESOLVING AN SBI CODE, THE CHEAP WAY: fetch BedrijfstakkenBranchesSBI2008Codes ONCE with $select=Identifier,Title and no $filter — 160 rows, one call, one charge — then match client-side. CBS carries no SBI field: the code is the leading token of Title ("642 Financiele holdings"), so take everything before the first space and compare. Truncate the KVK code (64210, 6421, 642, 64) and keep the LONGEST match; report which level you matched, because a division-level figure presented as a subclass figure is a wrong answer that looks right. Do NOT issue one startswith($filter) per truncation — that is up to four charged calls for one lookup; if you must filter server-side, chain them with or, and keep the TRAILING SPACE (startswith(Title,'642 ')), because '64' also matches 641, 642 and 649. Never fall back to T001081 "A-U Alle economische activiteiten" — that is the national total, not a sector. Skip composite titles ("4711, 472 ...", "24-30, 33 ...", "B-E ...") and unparseable ones ("SBI-code onbekend"). Titles carry Dutch diacritics; match on the numeric prefix, never on the label text. SBI depth: 160 branch codes, the coarsest here, so expect to truncate a 5-digit KVK code to 2 digits. No SBI section K. Quarterly, PeriodenCodes are YYYYKW0n, latest 2026KW02.

Documentation

GET /odata/v1/CBS/86414NED — code books for 86414NED. Literal path: every Codes/Groups/Dimensions collection under it resolves here.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$filter": {
      "description": "OData filter over the collection, e.g. startswith(Title,'642 ') on the branch codes. Omit it to fetch the whole code list in one call, which is usually cheaper.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields, e.g. Identifier,Title.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. Maximum 100000. Supplying $top suppresses @odata.nextLink, so rows beyond it are silently lost.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "value": {
      "items": {
        "properties": {
          "DataType": {
            "description": "On MeasureCodes only. A String measure fills StringValue, not Value.",
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "DimensionGroupId": {
            "type": "string"
          },
          "Identifier": {
            "description": "The opaque CBS key an Observations $filter compares against, e.g. 397200. It has no arithmetic relation to the SBI code.",
            "type": "string"
          },
          "Index": {
            "type": "integer"
          },
          "Title": {
            "description": "An SBI token then a Dutch label. The token may be a section letter (A), a range (B-E, 24-30, 33) or absent.",
            "type": "string"
          },
          "Unit": {
            "description": "On MeasureCodes only, e.g. Aantal, x mln euro, %.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$select": "Identifier,Title",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/86414NED/$metadata#BedrijfstakkenBranchesSBI2008Codes(Identifier,Title)",
  "value": [
    {
      "Identifier": "T001081",
      "Title": "A-U Alle economische activiteiten"
    }
  ]
}
GET/odata/v1/CBS/86414NED/Observations
$0.05 default
Description

Turnover momentum per SBI branch, as a distribution — CBS table 86414NED, "Bedrijfsgegevens; omzetontwikkeling (stijgers-dalers), SBI 2008". Unusually useful for benchmarking one company because it reports a DISTRIBUTION rather than an aggregate: what percentage of businesses in a branch and size class saw turnover rise, hold steady or fall, split into fast and normal movers. That answers "is this company's revenue drop its own problem or the whole sector's" in a way a branch total cannot. The freshest table in this listing. 160 branch codes, the coarsest here, so expect to truncate a 5-digit KVK code to 2 digits. Values are percentages over overlapping sets — the risers total equals fast risers plus normal risers, and likewise for fallers — so never add every measure together. COVERAGE GAP: no SBI section K, so no benchmark for finance.

Documentation

GET /odata/v1/CBS/86414NED/Observations — share of businesses per SBI branch whose turnover rose, held or fell. Overlapping percentage sets; no section K.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter. This table has THREE dimensions — Bedrijfsgrootte (size class, e.g. WP19077), BedrijfstakkenBranchesSBI2008 and Perioden — so pin the size class too or one branch returns a row per class, e.g. Bedrijfsgrootte eq 'WP19077' and BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2026KW02'. Supported: eq, ne, and, or, in, startswith, contains. NOT supported: $expand (400 everywhere). $apply is broken rather than absent: groupby returns 500, aggregate returns 400; only $apply=filter works.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum rows. WARNING: supplying $top suppresses @odata.nextLink. Maximum 100000.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.nextLink": {
      "type": "string"
    },
    "value": {
      "items": {
        "properties": {
          "Bedrijfsgrootte": {
            "description": "Size-class dimension, e.g. WP19077. Present in this table and not in the others; pin it or the same branch returns one row per size class.",
            "type": "string"
          },
          "BedrijfstakkenBranchesSBI2008": {
            "type": "string"
          },
          "Id": {
            "type": "integer"
          },
          "Measure": {
            "description": "Percentage measures over overlapping sets; resolve via /MeasureCodes and do not sum them.",
            "type": "string"
          },
          "Perioden": {
            "description": "YYYYKW0n quarterly.",
            "type": "string"
          },
          "StringValue": {
            "type": "string"
          },
          "Value": {
            "description": "A percentage.",
            "type": "number"
          },
          "ValueAttribute": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "Bedrijfsgrootte eq 'WP19077' and BedrijfstakkenBranchesSBI2008 eq '395000' and Perioden eq '2026KW02'",
  "$top": 2
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/86414NED/$metadata#Observations",
  "value": [
    {
      "Bedrijfsgrootte": "WP19077",
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 500416,
      "Measure": "D002756",
      "Perioden": "2026KW02",
      "StringValue": null,
      "Value": 40.0,
      "ValueAttribute": "None"
    },
    {
      "Bedrijfsgrootte": "WP19077",
      "BedrijfstakkenBranchesSBI2008": "395000",
      "Id": 500417,
      "Measure": "D002838",
      "Perioden": "2026KW02",
      "StringValue": null,
      "Value": 13.0,
      "ValueAttribute": "None"
    }
  ]
}
GET/odata/v1/CBS/Datasets
$0.05 default
Description

Search the CBS StatLine catalogue — 4,871 datasets. Zoek een CBS-tabel op titel, onderwerp of status. Returns each dataset's Identifier (the table id used by every other call here, e.g. 82244NED), Title, Description, Status, ObservationCount, Modified and ReleaseDate. Filter with $filter=contains(Title,'Faillissementen'), and ALWAYS add "and Status eq 'Regulier'" unless you want discontinued tables: 71 of the 105 SBI-keyed tables are Gediscontinueerd and still returned, leaving 34 Regulier. Use this to find a table, then /Dimensions to learn how it is keyed.

Documentation

GET /odata/v1/CBS/Datasets — CBS StatLine catalogue search. Filter Status eq 'Regulier' to exclude discontinued tables.

Pricing
$0.05 default
Parameters
{
  "properties": {
    "$count": {
      "description": "Set true to include @odata.count, the total number of matching datasets.",
      "required": false,
      "type": "boolean",
      "x-parameter-location": "query"
    },
    "$filter": {
      "description": "OData filter over the catalogue, e.g. contains(Title,'Faillissementen') and Status eq 'Regulier'. Supported: eq, ne, and, or, contains, startswith, endswith, tolower.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$orderby": {
      "description": "Sort expression, e.g. Modified desc.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$select": {
      "description": "Comma-separated fields to return, e.g. Identifier,Title,Status,ObservationCount.",
      "required": false,
      "type": "string",
      "x-parameter-location": "query"
    },
    "$skip": {
      "description": "Rows to skip, for paging.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    },
    "$top": {
      "description": "Maximum datasets to return. Maximum 100000; above that the API returns HTTP 400.",
      "required": false,
      "type": "integer",
      "x-parameter-location": "query"
    }
  },
  "type": "object"
}
Response schema
{
  "properties": {
    "@odata.count": {
      "description": "Total matches, present only when $count=true.",
      "type": "integer"
    },
    "value": {
      "items": {
        "properties": {
          "Catalog": {
            "type": "string"
          },
          "Description": {
            "type": "string"
          },
          "Distributions": {
            "type": "array"
          },
          "Identifier": {
            "description": "Table id, e.g. 82244NED. Case matters in the URL: 81156ned is lower case.",
            "type": "string"
          },
          "Language": {
            "type": "string"
          },
          "Modified": {
            "type": "string"
          },
          "ObservationCount": {
            "type": "integer"
          },
          "ReleaseDate": {
            "type": "string"
          },
          "Status": {
            "description": "Regulier = actively maintained. Gediscontinueerd or Stopgezet = frozen; the data is still served.",
            "type": "string"
          },
          "Title": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "type": "array"
    }
  },
  "type": "object"
}
Example request
{
  "$filter": "contains(Title,'Faillissementen') and Status eq 'Regulier'",
  "$select": "Identifier,Title,Status,ObservationCount",
  "$top": 3
}
Example response
{
  "@odata.context": "https://datasets.cbs.nl/odata/v1/CBS/$metadata#Datasets(Identifier,Title,Status,ObservationCount)",
  "value": [
    {
      "Identifier": "82242NED",
      "ObservationCount": 3096,
      "Status": "Regulier",
      "Title": "Faillissementen; kerncijfers"
    },
    {
      "Identifier": "82243NED",
      "ObservationCount": 53640,
      "Status": "Regulier",
      "Title": "Faillissementen; natuurlijke personen, regio"
    },
    {
      "Identifier": "82244NED",
      "ObservationCount": 332568,
      "Status": "Regulier",
      "Title": "Faillissementen; bedrijven en instellingen, SBI 2008"
    }
  ]
}