Documentation
List procurements, or look up one notice by slug
GET/v1/notices
Needs an API key, except with ?slug=. How to get one.
Returns published procurements, one row per procurement, each shown by one of its notices: the result notice once one is published, otherwise the call for tenders, otherwise the prior information notice. A filter matches a procurement when it matches any of its notices, and pagination.total counts procurements. Listing needs an API key carrying notices:search; evaluation_method, quality_weight_min, contract_months_min and contract_months_max also need analysis:read, and document_search needs documents:read. With ?slug= no key is needed, and the answer is the one notice that slug names. Without a key, the same notices are published as pages at https://fentlig.se/upphandlingar and in https://fentlig.se/llms.txt.
curl "https://api.fentlig.se/v1/notices" \
-H "Authorization: Bearer $FENTLIG_API_KEY"Parameters
| Parameter | In | Type | Notes |
|---|---|---|---|
pageoptional | query | integer | min 1 · default 1 |
limitoptional | query | integer | 1–50 · default 20 |
countryoptional | query | string | |
foreign_buyersoptional | query | enum | excludeinclude |
statusoptional | query | string[] | |
regionoptional | query | string[] | |
nationwideoptional | query | enum | includeexclude |
cpvoptional | query | string[] | |
buyeroptional | query | string[] | |
buyer_idoptional | query | string[] | |
searchoptional | query | string | |
document_searchoptional | query | string | |
deadline_afteroptional | query | string | date-time |
deadline_beforeoptional | query | string | date-time |
publication_afteroptional | query | string | date-time |
publication_beforeoptional | query | string | date-time |
min_valueoptional | query | number | |
max_valueoptional | query | number | |
exclude_past_deadlineoptional | query | boolean | |
closed_without_awardoptional | query | boolean | |
sortoptional | query | enum | publication_descdeadline_ascvalue_desc |
evaluation_methodoptional | query | string[] | |
quality_weight_minoptional | query | integer | 0–100 |
contract_months_minoptional | query | integer | min 0 |
contract_months_maxoptional | query | integer | min 0 |
slugoptional | query | string |
Response 200
A page of procurements; or, with ?slug=, the one notice it names
A page of results
| Field | Type | Notes |
|---|---|---|
data | object[] | |
data[].id | string | uuid |
data[].slug | string | |
data[].title | string | |
data[].buyerName | stringnullable | |
data[].buyerId | stringnullable | uuid |
data[].buyerUnit | objectnullable | |
data[].buyerUnit.name | string | |
data[].buyerUnit.kind | enumnullable | joint_centrenull |
data[].buyerUnit.id | stringnullable | |
data[].status | enum | plannedopenclosedconcluded |
data[].publicationDate | string | date-time |
data[].deadlineDate | stringnullable | date-time |
data[].regionCodes | string[] | |
data[].mainCpv | objectnullable | |
data[].mainCpv.code | string | |
data[].mainCpv.label | stringnullable | |
data[].mainCpv.isMain | boolean | |
data[].procedureCode | stringnullable | |
data[].estimatedValue | numbernullable | |
data[].currency | stringnullable | |
data[].source | string | |
data[].sourceUrl | stringnullable | |
data[].documentMatch | objectnullable | |
data[].documentMatch.documentId | string | uuid |
data[].documentMatch.snippet | stringnullable | |
data[].documentMatch.tooLongToQuote | boolean | |
pagination | object | |
pagination.page | number | |
pagination.limit | number | |
pagination.total | number | |
pagination.totalPages | number | |
pagination.hasNextPage | boolean | |
pagination.hasPreviousPage | boolean | |
documentSearch | objectnullable | |
documentSearch.withDocuments | integer | min 0 |
documentSearch.inScope | integer | min 0 |
coverage | object | |
coverage.sources | string[] | |
coverage.attribution | object[] | |
coverage.attribution[].source | string | |
coverage.attribution[].text | string | |
coverage.dataAsOf | stringnullable | date-time |
coverage.isComplete | enum | false |
coverage.note | string |
A single object
| Field | Type | Notes |
|---|---|---|
data | object | |
data.id | string | uuid |
data.slug | string | |
data.title | string | |
data.buyerName | stringnullable | |
data.buyerId | stringnullable | uuid |
data.buyerUnit | objectnullable | |
data.buyerUnit.name | string | |
data.buyerUnit.kind | enumnullable | joint_centrenull |
data.buyerUnit.id | stringnullable | |
data.status | enum | plannedopenclosedconcluded |
data.publicationDate | string | date-time |
data.deadlineDate | stringnullable | date-time |
data.regionCodes | string[] | |
data.mainCpv | objectnullable | |
data.mainCpv.code | string | |
data.mainCpv.label | stringnullable | |
data.mainCpv.isMain | boolean | |
data.procedureCode | stringnullable | |
data.estimatedValue | numbernullable | |
data.currency | stringnullable | |
data.source | string | |
data.sourceUrl | stringnullable | |
data.description | stringnullable | |
data.cpvCodes | object[] | |
data.cpvCodes[].code | string | |
data.cpvCodes[].label | stringnullable | |
data.cpvCodes[].isMain | boolean | |
data.regions | object[] | |
data.regions[].code | string | |
data.regions[].name | stringnullable | |
data.noticeType | string | |
data.publicationNumber | stringnullable | |
data.frameworkMaxValue | numbernullable | |
data.awardOutcome | objectnullable | |
data.awardOutcome.awardDate | stringnullable | date-time |
data.awardOutcome.bidCount | integernullable | min 0 |
data.awardOutcome.awardedValue | numbernullable | |
data.awardOutcome.currency | stringnullable | |
data.awardOutcome.lotCount | integer | min 0 |
data.awardOutcome.lotsAwarded | integernullable | min 0 |
data.awardOutcome.lotsNotAwarded | integernullable | min 0 |
data.awardOutcome.lotsUndecided | integernullable | min 0 |
data.related | object[] | |
data.related[].id | string | uuid |
data.related[].slug | string | |
data.related[].title | string | |
data.related[].status | enum | plannedopenclosedconcluded |
data.related[].publicationDate | string | date-time |
data.depthWithheld | boolean | |
data.resultPublishedElsewhere | boolean | |
data.resultNoticeCount | integer | min 0 |
data.resultNotices | object[] | |
data.resultNotices[].id | string | uuid |
data.resultNotices[].slug | string | |
data.resultNotices[].title | string | |
data.resultNotices[].status | enum | plannedopenclosedconcluded |
data.resultNotices[].publicationDate | string | date-time |
data.listedNotice | objectnullable | |
data.listedNotice.id | string | uuid |
data.listedNotice.slug | string | |
data.listedNotice.status | enum | plannedopenclosedconcluded |
data.listedNotice.deadlineDate | stringnullable | date-time |
coverage | object | |
coverage.sources | string[] | |
coverage.attribution | object[] | |
coverage.attribution[].source | string | |
coverage.attribution[].text | string | |
coverage.dataAsOf | stringnullable | date-time |
coverage.isComplete | enum | false |
coverage.note | string |
Failures
- 400A parameter could not be read, the search cannot run as written, or the page is past the limit: `(page - 1) x limit` must be below 1000. `detail` says which.
- 401The API key sent is unknown, revoked or expired. Send a valid key, or none on an operation that needs none.
- 403No API key was sent, or the key's scopes or its workspace's plan do not cover this query. `detail` says which, and names the scope when one is missing.
- 404No published notice has the slug in `?slug=`
- 429Too many requests in the current window, from this key or, without a key, from this address. Wait the number of seconds in `Retry-After`, then send the request again.
Every one is an RFC 9457 problem document carrying a stable code. See the error reference.