Stable, versioned access to Montenegro business, procurement and government data with a public OpenAPI contract.
Public GET endpoints live under /v1. Breaking client changes receive a new major version; the OpenAPI document is the machine-readable contract.
The catalog documents source, cadence, keys, methodology and limitations. Responses retain source URLs and dates where publishers provide them.
Reasonable public reading is available without a key. Higher volume, webhooks, SLAs, snapshots and commercial redistribution require a separate agreement.
Agents that support MCP (Model Context Protocol) can search Montenegro company, tender and public-payment data directly. It's free and read-only, with no account or key.
https://api.bizstats.me/mcpApps with custom connectors can use this URL directly.
claude mcp add --transport http bizstats https://api.bizstats.me/mcp{
"mcpServers": {
"bizstats": {
"url": "https://api.bizstats.me/mcp"
}
}
}search_companiesget_companyrank_companiessearch_tendersget_tendersearch_public_paymentsget_recent_changesfind_personget_personget_dataset_statusUp to 60 requests a minute per client. Every result links to its source page and the data license, so agents can cite it. Long lists are shortened; bulk use and commercial redistribution need a separate agreement. Read the data license
Every documented call in version 1.1.0, with its parameters, response shape and a working example. Field descriptions are in English, as in the OpenAPI document.
/v1API entry pointNo parameters
application/json · ApiIndexResponse
| Field | Type | Description |
|---|---|---|
| name | string | |
| version | string | |
| documentation | string | |
| openapi | string | |
| catalog | string | |
| mcp | string |
/v1/datasets/catalogList the public datasetsSource, cadence, coverage, methodology, limitations and endpoints for every dataset.
No parameters
application/json · DatasetCatalogResponse
| Field | Type | Description |
|---|---|---|
| schemaVersion | string | |
| generatedAt | string | ISO 8601 date (YYYY-MM-DD) or timestamp |
| license | string | |
| methodology | string | |
| datasets | array<DatasetDefinition> |
/v1/datasets/catalog/{id}Describe one dataset| Name | In | Type | Default | Description |
|---|---|---|---|---|
| id*required | path | "companies" | "company-registry" | "company-ownership" | "persons" | "procurement-notices" | "procurement-awards" | "public-payments" | "blocked-accounts" | "tax-debtors" | "economic-indicators" | "municipality-statistics" | "development-projects" | "court-hearings" | "court-decisions" | "property-ownership" | — |
application/json · DatasetResponse
| Field | Type | Description |
|---|---|---|
| schemaVersion | string | |
| dataset | DatasetDefinition |
/v1/datasets/statusSource freshness and ingestion statusFor each source: when BizStats last fetched it, the newest date its records cover, and a freshness tier.
No parameters
application/json · DatasetStatusResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| generatedAt | string | ISO 8601 date (YYYY-MM-DD) or timestamp |
| datasets | array<object> | |
| readModels | array<object> |
/v1/companiesList, filter and rank companies for a year| Name | In | Type | Default | Description |
|---|---|---|---|---|
| year | query | string^[0-9]{4}$ | — | Filing year; defaults to the latest year with filings (unknown years fall back to it) |
| sort | query | "name" | "totalIncome" | "profit" | "employeeCount" | "averagePay" | "incomePerEmployee" | "margin" | "revenueChange" | "totalIncome" | margin ranks companies with at least 100,000 EUR revenue first; revenueChange (vs year − 1) ranks bases of at least 1M EUR revenue and 5 employees first. Rows without a value sort last. |
| dir | query | "asc" | "desc" | "desc" | |
| q | query | string | — | Substring of name, PIB, activity or municipality |
| sector | query | string | — | Exact sector name |
| municipality | query | string | — | |
| category | query | string | — | Activity title |
| activityCode | query | string | — | KD 2010 code |
| minRevenue | query | number≥ 0 | — | |
| maxRevenue | query | number≥ 0 | — | |
| minEmployees | query | number≥ 0 | — | |
| maxEmployees | query | number≥ 0 | — | |
| plausibleProfit | query | "1" | — | 1 = exclude filings with an implausible profit |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 200 | 50 | Rows per page (max 200; larger values are capped) |
application/json · CompanyListResponse
| Field | Type | Description |
|---|---|---|
| year | string | |
| page | integer | |
| pageSize | integer | |
| total | integer | |
| previousYear | object | null | The comparison year of each row's `previous` filing; null when year − 1 has no filings. |
| companies | array<CompanyListRow> |
/v1/companies/{pib}A company's filing history and linked public recordsReturns a JSON array with one row per filing year, oldest first. The last (latest-year) row also carries identity, ownership, risk, procurement, payment, court and property records.
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| pib*required | path | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
| includeEnrichment | query | "0" | "1" | "1" | 0 = filing rows only, without the linked public records |
application/json · CompanyHistoryResponse · JSON array
| Field | Type | Description |
|---|---|---|
| id | integer | |
| name | string | |
| pib | string | |
| reportId | string | null | |
| legalStatus | string | null | |
| municipality | string | null | |
| activityCode | string | null | KD 2010 activity code |
| activityName | string | null | |
| sector | string | |
| parseStatus | string | null | |
| totalIncome | number | null | Total income, EUR |
| profit | number | null | Profit or loss for the year, EUR |
| employeeCount | number | null | |
| grossPayCosts | number | null | Gross wage costs for the year, EUR (IRMS AOP 012, or AOP 210 'troškovi zarada' when 012 is missing). |
| netPayCostsdeprecated | number | null | Deprecated alias of grossPayCosts. Despite the name the value is GROSS pay costs; it stays in v1 for compatibility. |
| averagePay | number | null | Average monthly gross pay, EUR; null when not computable or the filing is flagged suspicious. |
| incomePerEmployee | number | null | |
| yearId | integer | |
| yearValue | integer | |
| year | string | |
| updatedAt | string | null | |
| officialFilingUrl | string | null | |
| logoUrl | string | null | |
| logoSourceUrl | string | null | |
| logoDomain | string | null | |
| logoConfidence | number | null | |
| identity | object | null | CRPS registry identity (latest row only) |
| companyWebsite | object | null | The company's own website and the emails, phones and social profiles it publishes (latest row only) |
| ownership | object | CRPS owners and owned companies (latest row only) |
| risk | object | null | Blocked accounts, tax-debtor lists, filing gaps and registry status (latest row only) |
| procurements | object | |
| payments | object | |
| developmentProjects | object | |
| courtActivity | object | |
| accounts | object | |
| properties | object | |
| filingPersons | object | |
| registryNotices | object | |
| verdict | object |
/v1/companies/{pib}/export.csvA company's filing history as CSV| Name | In | Type | Default | Description |
|---|---|---|---|---|
| pib*required | path | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
text/csv
/v1/export.csvThe first 100 companies matching the filters as CSVSame filters as /v1/companies, no paging. A free preview: the first 100 rows in the requested order (X-Export-Row-Count, X-Export-Row-Limit, and X-Export-Truncated: true when more companies match). Full lists with website, email and phone columns are part of BizStats Business.
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| year | query | string^[0-9]{4}$ | — | Filing year; defaults to the latest year with filings (unknown years fall back to it) |
| sort | query | "name" | "totalIncome" | "profit" | "employeeCount" | "averagePay" | "incomePerEmployee" | "margin" | "revenueChange" | "totalIncome" | margin ranks companies with at least 100,000 EUR revenue first; revenueChange (vs year − 1) ranks bases of at least 1M EUR revenue and 5 employees first. Rows without a value sort last. |
| dir | query | "asc" | "desc" | "desc" | |
| q | query | string | — | Substring of name, PIB, activity or municipality |
| sector | query | string | — | Exact sector name |
| municipality | query | string | — | |
| category | query | string | — | Activity title |
| activityCode | query | string | — | KD 2010 code |
| minRevenue | query | number≥ 0 | — | |
| maxRevenue | query | number≥ 0 | — | |
| minEmployees | query | number≥ 0 | — | |
| maxEmployees | query | number≥ 0 | — | |
| plausibleProfit | query | "1" | — | 1 = exclude filings with an implausible profit |
text/csv
/v1/searchSearch companies by name, PIB, activity or owner| Name | In | Type | Default | Description |
|---|---|---|---|---|
| q*required | query | string | — | |
| mode | query | "typeahead" | "full" | "typeahead" | |
| limit | query | integer≥ 1, ≤ 50 | — | Default 8 (typeahead) or 40 (full); max 50 |
application/json · SearchResponse
| Field | Type | Description |
|---|---|---|
| query | string | |
| results | array<object> | |
| companyTotal | integer | |
| sectors | array<object> | |
| municipalities | array<object> | |
| tenders | array<object> |
/v1/regionsCompany aggregates by municipality| Name | In | Type | Default | Description |
|---|---|---|---|---|
| year | query | string^[0-9]{4}$ | — | Filing year; defaults to the latest year with filings (unknown years fall back to it) |
application/json · RegionsResponse
| Field | Type | Description |
|---|---|---|
| year | string | |
| coverage | object | null | |
| national | object | |
| municipalities | array<object> | |
| unassigned | object | null |
/v1/sectorsCompany aggregates by sector| Name | In | Type | Default | Description |
|---|---|---|---|---|
| year | query | string^[0-9]{4}$ | — | Filing year; defaults to the latest year with filings (unknown years fall back to it) |
application/json · SectorsResponse
| Field | Type | Description |
|---|---|---|
| year | string | |
| coverage | object | null | |
| national | object | |
| sectors | array<object> |
/v1/moversLargest year-over-year changes| Name | In | Type | Default | Description |
|---|---|---|---|---|
| metric | query | "revenue" | "profit" | "employees" | "pay" | "revenue" | |
| limit | query | integer≥ 1, ≤ 50 | 12 | |
| year | query | string^[0-9]{4}$ | — | Filing year; defaults to the latest year with filings (unknown years fall back to it) |
| sector | query | string | — | |
| municipality | query | string | — |
application/json · MoversResponse
| Field | Type | Description |
|---|---|---|
| metric | "revenue" | "profit" | "employees" | "pay" | |
| year | string | |
| prevYear | string | null | |
| tracked | integer | |
| stats | object | |
| gainers | array<object> | |
| losers | array<object> | |
| turnarounds | object | Loss to profit between the two years, by the profit swing, whatever the metric; with the counts both ways. |
/v1/persons/{slug}Public registry roles grouped under one name| Name | In | Type | Default | Description |
|---|---|---|---|---|
| slug*required | path | string^[a-z0-9-]+$ | — |
application/json · PersonResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| person | object | |
| roles | array<object> | |
| aggregates | object | |
| sourceFetchedAt | string | null | |
| indexable | boolean |
/v1/changesDetected blockades, tax-debtor listings and tender winsSame-day contracts of one supplier on one tender are one row (contractCount). Rows are ordered by detection day, then event date and amount, unless sort says otherwise.
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| type | query | "blockade_started" | "blockade_cleared" | "tax_debtor_listed" | "tender_won" | "registry_notice" | — | |
| pib | query | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
| buyer | query | string | — | Substring of the tender buyer (tender wins only) |
| municipality | query | string | — | Company municipality (latest filing) |
| sector | query | string | — | |
| minAmount | query | number≥ 0 | — | |
| sort | query | "recent" | "eventDate" | "amount" | "recent" | |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 100 | 50 | Rows per page (max 100; larger values are capped) |
application/json · ChangesResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| type | string | null | |
| pib | string | null | |
| sort | "recent" | "eventDate" | "amount" | |
| filters | object | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| requestedPage | integer | |
| typeCounts | array<object> | |
| weeklyCounts | array<object> | |
| filterOptions | object | |
| events | array<object> |
/v1/changes/export.csvThe filtered change feed as CSV| Name | In | Type | Default | Description |
|---|---|---|---|---|
| type | query | "blockade_started" | "blockade_cleared" | "tax_debtor_listed" | "tender_won" | "registry_notice" | — | |
| pib | query | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
| buyer | query | string | — | Substring of the tender buyer (tender wins only) |
| municipality | query | string | — | Company municipality (latest filing) |
| sector | query | string | — | |
| minAmount | query | number≥ 0 | — | |
| sort | query | "recent" | "eventDate" | "amount" | "recent" |
text/csv
/v1/blocked-accountsCompanies with a blocked account (CBCG snapshot)| Name | In | Type | Default | Description |
|---|---|---|---|---|
| snapshotDate | query | string^[0-9]{4}-[0-9]{2}-[0-9]{2}$ | — | CBCG snapshot (YYYY-MM-DD); default the latest |
| pib | query | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
| q | query | string | — | Name substring |
| minAmount | query | number≥ 0 | — | |
| sort | query | "amount" | "days" | "name" | "amount" | |
| dir | query | "asc" | "desc" | — | Default desc (asc for name) |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 200 | 50 | Rows per page (max 200; larger values are capped) |
application/json · BlockedAccountsResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| snapshotDate | string | null | |
| snapshots | array<string> | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| excluded | object | |
| results | array<object> |
/v1/tax-debtorsEntries of the published tax-debtor lists| Name | In | Type | Default | Description |
|---|---|---|---|---|
| list | query | "top_200" | "bankruptcy_100" | "salary_taxes_50" | "tax_white_list" | — | Published list; legacy 2024 names (tax_debt_black_list_200, …) are accepted |
| snapshotDate | query | string^[0-9]{4}-[0-9]{2}-[0-9]{2}$ | — | Edition date; default each list's latest edition |
| pib | query | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
| q | query | string | — | |
| minAmount | query | number≥ 0 | — | |
| sort | query | "amount" | "name" | "amount" | |
| dir | query | "asc" | "desc" | — | |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 200 | 50 | Rows per page (max 200; larger values are capped) |
application/json · TaxDebtorsResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| list | string | null | |
| snapshotDate | string | null | |
| editions | array<object> | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| results | array<object> |
/v1/procurements/searchSearch CEJN procurement notices| Name | In | Type | Default | Description |
|---|---|---|---|---|
| q | query | string | — | Keywords; a comma or semicolon separates alternatives (any of them) |
| buyer | query | string | — | Buyer name substring |
| municipality | query | string | — | Buyer municipality |
| status | query | "active" | "expired" | "completed" | "canceled" | "suspended" | — | |
| procedureType | query | string | — | |
| noticeType | query | string | — | |
| cpv | query | string^\d{2}(\d{6})?$ | — | CPV division (2 digits) or a code in it |
| dateFrom | query | string^[0-9]{4}-[0-9]{2}-[0-9]{2}$ | — | Publication date from |
| dateTo | query | string^[0-9]{4}-[0-9]{2}-[0-9]{2}$ | — | Publication date to |
| minValue | query | number≥ 0 | — | Minimum estimated value, EUR |
| maxValue | query | number≥ 0 | — | |
| sort | query | "publicationDate" | "deadline" | "estimatedValue" | "publicationDate" | |
| dir | query | "asc" | "desc" | "desc" | |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 100 | 25 | Rows per page (max 100; larger values are capped) |
application/json · ProcurementSearchResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| query | string | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| valuedTotal | integer | |
| facets | object | |
| results | array<ProcurementRow> |
/v1/procurements/{id}A procurement with lots, events and awards| Name | In | Type | Default | Description |
|---|---|---|---|---|
| id*required | path | string | — | procurement_id (me_cejn:tender:121357) or numeric CEJN id |
application/json · ProcurementDetailResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| procurement | object | |
| parties | array<object> | |
| lots | array<object> | |
| statusEvents | array<object> | |
| awards | array<object> | |
| matchedPayments | object |
/v1/procurements/buyers/{buyer}A buyer's procurement profile| Name | In | Type | Default | Description |
|---|---|---|---|---|
| buyer*required | path | string | — | Buyer name (URL-encoded) |
application/json · BuyerProfileResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| buyerName | string | |
| summary | object | null | |
| topSuppliers | array<object> | |
| byYear | array<object> | |
| tenders | array<ProcurementRow> |
/v1/procurements/suppliers/{pib}A supplier's awarded contracts| Name | In | Type | Default | Description |
|---|---|---|---|---|
| pib*required | path | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
application/json · SupplierProfileResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| pib | string | |
| supplierName | string | null | |
| company | object | null | |
| summary | object | null | |
| awardsByYear | array<object> | |
| topBuyers | array<object> | |
| recentAwards | array<object> |
/v1/public-payments/searchSearch State Treasury payments| Name | In | Type | Default | Description |
|---|---|---|---|---|
| q | query | string | — | Payee, account, ledger account, expense item, funding source, document number or source title |
| sort | query | "date" | "amount" | "date" | |
| dir | query | "asc" | "desc" | "desc" | |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 100 | 25 | Rows per page (max 100; larger values are capped) |
| cursor | query | string | — | nextCursor of the previous page (keyset paging; newest-first order only) |
| includeTotal | query | "0" | "1" | "1" |
application/json · PublicPaymentSearchResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| query | string | |
| page | integer | |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| totalAmount | number | null | Sum of every matching payment, EUR (with the total) |
| nextCursor | string | null | |
| results | array<object> |
/v1/public-payments/export.csvEvery State Treasury payment in a search as CSVSame q and sort as /v1/public-payments/search, no paging. Up to 50,000 rows (X-Export-Row-Count, X-Export-Row-Limit headers); larger exports return 422.
| Name | In | Type | Default | Description |
|---|---|---|---|---|
| q | query | string | — | |
| sort | query | "date" | "amount" | "date" | |
| dir | query | "asc" | "desc" | "desc" |
text/csv
/v1/development-projects/searchSearch published development projects| Name | In | Type | Default | Description |
|---|---|---|---|---|
| q | query | string | — | |
| municipality | query | string | — | |
| status | query | string | — | |
| investor | query | string | — | |
| investorPib | query | string^[0-9]{8}$ | — | 8-digit tax identification number (PIB) |
| year | query | string | — | 2000–2100, or 'undated' |
| includeIndividuals | query | "0" | "1" | "0" | |
| page | query | integer≥ 1 | 1 | 1-based page; past the last page serves the last |
| pageSize | query | integer≥ 1, ≤ 100 | 25 | Rows per page (max 100; larger values are capped) |
application/json · DevelopmentProjectSearchResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| undatedExcluded | integer | |
| results | array<object> |
/v1/government/summaryHeadline counts of the government open-data sourcesNo parameters
application/json · GovernmentSummaryResponse
/v1/regional-context/summaryMunicipality statistics available per categoryNo parameters
application/json · RegionalContextSummaryResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| total | integer | |
| categories | array<object> |
/v1/government/indicatorsThe curated economic indicatorsNo parameters
application/json · IndicatorListResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| indicators | array<object> |
/v1/government/indicators/{slug}An annual economic-indicator series| Name | In | Type | Default | Description |
|---|---|---|---|---|
| slug*required | path | "gdp-current-prices" | "gdp-per-capita" | "gdp-real-growth" | "unemployment-rate" | "employees" | "average-gross-wage" | — |
application/json · IndicatorSeriesResponse
| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| slug | string | |
| topic | string | |
| metricName | string | |
| unit | "eur" | "eur_thousand" | "percent" | "index" | "persons" | |
| aggregation | "annual_average" | "annual_latest" | "annual_sum" | "annual_sum_yoy" | |
| sourceFrequency | "annual" | "quarterly" | "monthly" | "mixed" | "unknown" | |
| series | array<object> | |
| partialLatest | object | null | |
| source | object |
The fields of every schema the responses above refer to.
ApiIndexResponse| Field | Type | Description |
|---|---|---|
| name | string | |
| version | string | |
| documentation | string | |
| openapi | string | |
| catalog | string | |
| mcp | string |
BlockedAccountsResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| snapshotDate | string | null | |
| snapshots | array<string> | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| excluded | object | |
| results | array<object> |
BuyerProfileResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| buyerName | string | |
| summary | object | null | |
| topSuppliers | array<object> | |
| byYear | array<object> | |
| tenders | array<ProcurementRow> |
ChangesResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| type | string | null | |
| pib | string | null | |
| sort | "recent" | "eventDate" | "amount" | |
| filters | object | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| requestedPage | integer | |
| typeCounts | array<object> | |
| weeklyCounts | array<object> | |
| filterOptions | object | |
| events | array<object> |
CompanyHistoryResponse| Field | Type | Description |
|---|---|---|
| id | integer | |
| name | string | |
| pib | string | |
| reportId | string | null | |
| legalStatus | string | null | |
| municipality | string | null | |
| activityCode | string | null | KD 2010 activity code |
| activityName | string | null | |
| sector | string | |
| parseStatus | string | null | |
| totalIncome | number | null | Total income, EUR |
| profit | number | null | Profit or loss for the year, EUR |
| employeeCount | number | null | |
| grossPayCosts | number | null | Gross wage costs for the year, EUR (IRMS AOP 012, or AOP 210 'troškovi zarada' when 012 is missing). |
| netPayCostsdeprecated | number | null | Deprecated alias of grossPayCosts. Despite the name the value is GROSS pay costs; it stays in v1 for compatibility. |
| averagePay | number | null | Average monthly gross pay, EUR; null when not computable or the filing is flagged suspicious. |
| incomePerEmployee | number | null | |
| yearId | integer | |
| yearValue | integer | |
| year | string | |
| updatedAt | string | null | |
| officialFilingUrl | string | null | |
| logoUrl | string | null | |
| logoSourceUrl | string | null | |
| logoDomain | string | null | |
| logoConfidence | number | null | |
| identity | object | null | CRPS registry identity (latest row only) |
| companyWebsite | object | null | The company's own website and the emails, phones and social profiles it publishes (latest row only) |
| ownership | object | CRPS owners and owned companies (latest row only) |
| risk | object | null | Blocked accounts, tax-debtor lists, filing gaps and registry status (latest row only) |
| procurements | object | |
| payments | object | |
| developmentProjects | object | |
| courtActivity | object | |
| accounts | object | |
| properties | object | |
| filingPersons | object | |
| registryNotices | object | |
| verdict | object |
CompanyListResponse| Field | Type | Description |
|---|---|---|
| year | string | |
| page | integer | |
| pageSize | integer | |
| total | integer | |
| previousYear | object | null | The comparison year of each row's `previous` filing; null when year − 1 has no filings. |
| companies | array<CompanyListRow> |
CompanyListRow| Field | Type | Description |
|---|---|---|
| id | integer | |
| name | string | |
| pib | string | |
| reportId | string | null | |
| legalStatus | string | null | |
| municipality | string | null | |
| activityCode | string | null | KD 2010 activity code |
| activityName | string | null | |
| sector | string | |
| parseStatus | string | null | |
| totalIncome | number | null | Total income, EUR |
| profit | number | null | Profit or loss for the year, EUR |
| employeeCount | number | null | |
| grossPayCosts | number | null | Gross wage costs for the year, EUR (IRMS AOP 012, or AOP 210 'troškovi zarada' when 012 is missing). |
| netPayCostsdeprecated | number | null | Deprecated alias of grossPayCosts. Despite the name the value is GROSS pay costs; it stays in v1 for compatibility. |
| averagePay | number | null | Average monthly gross pay, EUR; null when not computable or the filing is flagged suspicious. |
| incomePerEmployee | number | null | |
| yearId | integer | |
| yearValue | integer | |
| year | string | |
| updatedAt | string | null | |
| officialFilingUrl | string | null | |
| logoUrl | string | null | |
| logoSourceUrl | string | null | |
| logoDomain | string | null | |
| logoConfidence | number | null | |
| previous | PreviousYearFiling | null | The filing for year − 1, or null when there is none (first filing, gap or placeholder) or no comparison year. |
CompanyRow| Field | Type | Description |
|---|---|---|
| id | integer | |
| name | string | |
| pib | string | |
| reportId | string | null | |
| legalStatus | string | null | |
| municipality | string | null | |
| activityCode | string | null | KD 2010 activity code |
| activityName | string | null | |
| sector | string | |
| parseStatus | string | null | |
| totalIncome | number | null | Total income, EUR |
| profit | number | null | Profit or loss for the year, EUR |
| employeeCount | number | null | |
| grossPayCosts | number | null | Gross wage costs for the year, EUR (IRMS AOP 012, or AOP 210 'troškovi zarada' when 012 is missing). |
| netPayCostsdeprecated | number | null | Deprecated alias of grossPayCosts. Despite the name the value is GROSS pay costs; it stays in v1 for compatibility. |
| averagePay | number | null | Average monthly gross pay, EUR; null when not computable or the filing is flagged suspicious. |
| incomePerEmployee | number | null | |
| yearId | integer | |
| yearValue | integer | |
| year | string | |
| updatedAt | string | null | |
| officialFilingUrl | string | null | |
| logoUrl | string | null | |
| logoSourceUrl | string | null | |
| logoDomain | string | null | |
| logoConfidence | number | null |
CompanyYear| Field | Type | Description |
|---|---|---|
| id | integer | |
| name | string | |
| pib | string | |
| reportId | string | null | |
| legalStatus | string | null | |
| municipality | string | null | |
| activityCode | string | null | KD 2010 activity code |
| activityName | string | null | |
| sector | string | |
| parseStatus | string | null | |
| totalIncome | number | null | Total income, EUR |
| profit | number | null | Profit or loss for the year, EUR |
| employeeCount | number | null | |
| grossPayCosts | number | null | Gross wage costs for the year, EUR (IRMS AOP 012, or AOP 210 'troškovi zarada' when 012 is missing). |
| netPayCostsdeprecated | number | null | Deprecated alias of grossPayCosts. Despite the name the value is GROSS pay costs; it stays in v1 for compatibility. |
| averagePay | number | null | Average monthly gross pay, EUR; null when not computable or the filing is flagged suspicious. |
| incomePerEmployee | number | null | |
| yearId | integer | |
| yearValue | integer | |
| year | string | |
| updatedAt | string | null | |
| officialFilingUrl | string | null | |
| logoUrl | string | null | |
| logoSourceUrl | string | null | |
| logoDomain | string | null | |
| logoConfidence | number | null | |
| identity | object | null | CRPS registry identity (latest row only) |
| companyWebsite | object | null | The company's own website and the emails, phones and social profiles it publishes (latest row only) |
| ownership | object | CRPS owners and owned companies (latest row only) |
| risk | object | null | Blocked accounts, tax-debtor lists, filing gaps and registry status (latest row only) |
| procurements | object | |
| payments | object | |
| developmentProjects | object | |
| courtActivity | object | |
| accounts | object | |
| properties | object | |
| filingPersons | object | |
| registryNotices | object | |
| verdict | object |
DatasetCatalogResponse| Field | Type | Description |
|---|---|---|
| schemaVersion | string | |
| generatedAt | string | ISO 8601 date (YYYY-MM-DD) or timestamp |
| license | string | |
| methodology | string | |
| datasets | array<DatasetDefinition> |
DatasetDefinition| Field | Type | Description |
|---|---|---|
| id | string | |
| title | string | |
| description | string | |
| sourceName | string | |
| sourceUrl | string | |
| cadence | string | |
| geographicCoverage | "Montenegro" | |
| temporalCoverage | string | |
| entityKeys | array<string> | |
| apiPath | string | Main endpoint (may be a URI template such as {pib}) |
| webPath | string | |
| formats | array<"json" | "csv" | "rss"> | |
| endpoints | array<object> | |
| methodology | string | |
| limitations | string | |
| commercialAccess | boolean |
DatasetResponse| Field | Type | Description |
|---|---|---|
| schemaVersion | string | |
| dataset | DatasetDefinition |
DatasetStatusResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| generatedAt | string | ISO 8601 date (YYYY-MM-DD) or timestamp |
| datasets | array<object> | |
| readModels | array<object> |
DevelopmentProjectSearchResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| undatedExcluded | integer | |
| results | array<object> |
ErrorResponse| Field | Type | Description |
|---|---|---|
| error | string | |
| message | string |
GovernmentSummaryResponseAn open object; its fields depend on the source.
IndicatorListResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| indicators | array<object> |
IndicatorSeriesResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| slug | string | |
| topic | string | |
| metricName | string | |
| unit | "eur" | "eur_thousand" | "percent" | "index" | "persons" | |
| aggregation | "annual_average" | "annual_latest" | "annual_sum" | "annual_sum_yoy" | |
| sourceFrequency | "annual" | "quarterly" | "monthly" | "mixed" | "unknown" | |
| series | array<object> | |
| partialLatest | object | null | |
| source | object |
MoversResponse| Field | Type | Description |
|---|---|---|
| metric | "revenue" | "profit" | "employees" | "pay" | |
| year | string | |
| prevYear | string | null | |
| tracked | integer | |
| stats | object | |
| gainers | array<object> | |
| losers | array<object> | |
| turnarounds | object | Loss to profit between the two years, by the profit swing, whatever the metric; with the counts both ways. |
PersonResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| person | object | |
| roles | array<object> | |
| aggregates | object | |
| sourceFetchedAt | string | null | |
| indexable | boolean |
PreviousYearFiling| Field | Type | Description |
|---|---|---|
| year | string | |
| totalIncome | number | null | |
| profit | number | null | |
| employeeCount | number | null | |
| netPayCosts | number | null | |
| averagePay | number | null | |
| incomePerEmployee | number | null | |
| parseStatus | string | null |
ProcurementDetailResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| procurement | object | |
| parties | array<object> | |
| lots | array<object> | |
| statusEvents | array<object> | |
| awards | array<object> | |
| matchedPayments | object |
ProcurementRow| Field | Type | Description |
|---|---|---|
| procurementId | string | |
| cejnId | integer | null | |
| title | string | |
| buyerName | string | null | |
| procedureType | string | null | |
| noticeType | string | null | |
| status | string | null | |
| lifecycleState | string | null | |
| publicationDate | string | null | |
| deadlineDate | string | null | |
| estimatedValue | number | null | |
| awardValue | number | null | |
| awardDate | string | null | |
| cpvCodes | array<string> | CEJN CPV codes (8 digits) |
| supplierNames | array<string> | |
| contractCount | integer | |
| currency | string | null | |
| sourceUrl | string | null |
ProcurementSearchResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| query | string | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| valuedTotal | integer | |
| facets | object | |
| results | array<ProcurementRow> |
PublicPaymentSearchResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| query | string | |
| page | integer | |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| totalAmount | number | null | Sum of every matching payment, EUR (with the total) |
| nextCursor | string | null | |
| results | array<object> |
RegionalContextSummaryResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| total | integer | |
| categories | array<object> |
RegionsResponse| Field | Type | Description |
|---|---|---|
| year | string | |
| coverage | object | null | |
| national | object | |
| municipalities | array<object> | |
| unassigned | object | null |
SearchResponse| Field | Type | Description |
|---|---|---|
| query | string | |
| results | array<object> | |
| companyTotal | integer | |
| sectors | array<object> | |
| municipalities | array<object> | |
| tenders | array<object> |
SectorsResponse| Field | Type | Description |
|---|---|---|
| year | string | |
| coverage | object | null | |
| national | object | |
| sectors | array<object> |
SupplierProfileResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| pib | string | |
| supplierName | string | null | |
| company | object | null | |
| summary | object | null | |
| awardsByYear | array<object> | |
| topBuyers | array<object> | |
| recentAwards | array<object> |
TaxDebtorsResponse| Field | Type | Description |
|---|---|---|
| sourceAvailable | boolean | |
| list | string | null | |
| snapshotDate | string | null | |
| editions | array<object> | |
| page | integer | Page served (clamped to the last page) |
| pageSize | integer | |
| total | integer | |
| totalPages | integer | |
| results | array<object> |