Open Prices API
Open Prices is Open Food Facts' open crowdsourced database of product prices. Its REST API covers prices, proofs, locations, products, users and stats, and serves its own OpenAPI 3.0.3 document from the live host.
Open Prices is Open Food Facts' open crowdsourced database of product prices. Its REST API covers prices, proofs, locations, products, users and stats, and serves its own OpenAPI 3.0.3 document from the live host.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/open-food-facts-open-prices"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.0.3
info:
title: Open Food Facts open-prices REST API
version: 0.0.0 (api)
description: Open Prices API allows you to add product prices
contact:
name: The Open Food Facts team
url: https://world.openfoodfacts.org
email: contact@openfoodfacts.org
license:
name: ' AGPL-3.0'
url: https://www.gnu.org/licenses/agpl-3.0.en.html
paths:
/api/schema:
get:
operationId: api_schema_retrieve
description: |-
OpenApi3 schema for this API. Format can be selected via content negotiation.
- YAML: application/vnd.oai.openapi
- JSON: application/vnd.oai.openapi+json
parameters:
- in: query
name: format
schema:
type: string
enum:
- json
- yaml
- in: query
name: lang
schema:
type: string
enum:
- af
- ar
- ar-dz
- ast
- az
- be
- bg
- bn
- br
- bs
- ca
- ckb
- cs
- cy
- da
- de
- dsb
- el
- en
- en-au
- en-gb
- eo
- es
- es-ar
- es-co
- es-mx
- es-ni
- es-ve
- et
- eu
- fa
- fi
- fr
- fy
- ga
- gd
- gl
- he
- hi
- hr
- hsb
- hu
- hy
- ia
- id
- ig
- io
- is
- it
- ja
- ka
- kab
- kk
- km
- kn
- ko
- ky
- lb
- lt
- lv
- mk
- ml
- mn
- mr
- ms
- my
- nb
- ne
- nl
- nn
- os
- pa
- pl
- pt
- pt-br
- ro
- ru
- sk
- sl
- sq
- sr
- sr-latn
- sv
- sw
- ta
- te
- tg
- th
- tk
- tr
- tt
- udm
- ug
- uk
- ur
- uz
- vi
- zh-hans
- zh-hant
tags:
- api
security:
- {}
responses:
'200':
content:
application/vnd.oai.openapi:
schema:
type: object
additionalProperties: {}
application/yaml:
schema:
type: object
additionalProperties: {}
application/vnd.oai.openapi+json:
schema:
type: object
additionalProperties: {}
application/json:
schema:
type: object
additionalProperties: {}
description: ''
/api/v1/auth:
post:
operationId: auth_create
description: |-
Authentication: provide username/password or a keycloak access_token
and get a bearer token in return.
- **username**: Open Food Facts user_id (not email)
- **password**: user password (clear text, but HTTPS encrypted)
- **access_token**: keycloak access_token (clear text)
A **token** is returned. If the **set_cookie** parameter is set to 1,
the token is also set as a cookie named "session" in the response.
To authenticate, you can either:
- use the **Authorization** header with the **Bearer** scheme,
e.g.: "Authorization: bearer token"
- use the **session** cookie, e.g.: "Cookie: session=token"
tags:
- auth
requestBody:
content:
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/Login'
multipart/form-data:
schema:
$ref: '#/components/schemas/Login'
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/SessionResponse'
description: ''
/api/v1/badges:
get:
operationId: badges_list
parameters:
- name: order_by
required: false
in: query
description: Which field to use when ordering the results.
schema:
type: string
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
tags:
- badges
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedBadgeList'
description: ''
/api/v1/badges/{id}:
get:
operationId: badges_retrieve
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Badge.
required: true
tags:
- badges
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Badge'
description: ''
/api/v1/badges/{id}/users:
get:
operationId: badges_users_list
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Badge.
required: true
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
tags:
- badges
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedBadgeUserList'
description: ''
/api/v1/challenges:
get:
operationId: challenges_list
parameters:
- in: query
name: end_date__gt
schema:
type: string
format: date
- in: query
name: end_date__gte
schema:
type: string
format: date
- in: query
name: end_date__lt
schema:
type: string
format: date
- in: query
name: end_date__lte
schema:
type: string
format: date
- in: query
name: end_date__month
schema:
type: number
- in: query
name: end_date__year
schema:
type: number
- in: query
name: id
schema:
type: integer
- in: query
name: is_published
schema:
type: boolean
- name: order_by
required: false
in: query
description: Which field to use when ordering the results.
schema:
type: string
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
- in: query
name: start_date__gt
schema:
type: string
format: date
- in: query
name: start_date__gte
schema:
type: string
format: date
- in: query
name: start_date__lt
schema:
type: string
format: date
- in: query
name: start_date__lte
schema:
type: string
format: date
- in: query
name: start_date__month
schema:
type: number
- in: query
name: start_date__year
schema:
type: number
- in: query
name: status
schema:
type: string
enum:
- COMPLETED
- DRAFT
- ONGOING
- UPCOMING
description: |-
* `DRAFT` - DRAFT
* `UPCOMING` - UPCOMING
* `ONGOING` - ONGOING
* `COMPLETED` - COMPLETED
tags:
- challenges
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedChallengeList'
description: ''
/api/v1/challenges/{id}:
get:
operationId: challenges_retrieve
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Challenge.
required: true
tags:
- challenges
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Challenge'
description: ''
/api/v1/flags:
get:
operationId: flags_list
parameters:
- in: query
name: content_type
schema:
type: array
items:
type: string
title: Python model class name
enum:
- PRICE
- PROOF
description: |-
* `PRICE` - Price
* `PROOF` - Proof
explode: true
style: form
- in: query
name: object_id
schema:
type: integer
- name: order_by
required: false
in: query
description: Which field to use when ordering the results.
schema:
type: string
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- in: query
name: reason
schema:
type: array
items:
type: string
enum:
- OTHER
- WRONG_CURRENCY
- WRONG_DATE
- WRONG_LOCATION
- WRONG_PRICE_VALUE
- WRONG_PRODUCT
- WRONG_TYPE
description: |-
* `WRONG_TYPE` - Wrong type
* `WRONG_PRICE_VALUE` - Wrong price value
* `WRONG_CURRENCY` - Wrong currency
* `WRONG_PRODUCT` - Wrong product
* `WRONG_LOCATION` - Wrong location
* `WRONG_DATE` - Wrong date
* `OTHER` - Other
explode: true
style: form
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
- in: query
name: status
schema:
type: string
enum:
- CLOSED
- OPEN
description: |-
* `OPEN` - Open
* `CLOSED` - Closed
tags:
- moderation
security:
- CustomAuthentication: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedFlagList'
description: ''
/api/v1/flags/{id}:
patch:
operationId: flags_partial_update
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Flag.
required: true
tags:
- moderation
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PatchedFlagUpdate'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/PatchedFlagUpdate'
multipart/form-data:
schema:
$ref: '#/components/schemas/PatchedFlagUpdate'
security:
- CustomAuthentication: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/FlagUpdate'
description: ''
/api/v1/locations:
get:
operationId: locations_list
parameters:
- name: order_by
required: false
in: query
description: Which field to use when ordering the results.
schema:
type: string
- in: query
name: osm_address_city__like
schema:
type: string
- in: query
name: osm_address_country__like
schema:
type: string
- in: query
name: osm_name__like
schema:
type: string
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- in: query
name: price_count
schema:
type: integer
- in: query
name: price_count__gte
schema:
type: integer
- in: query
name: price_count__lte
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
- in: query
name: type
schema:
type: string
enum:
- ONLINE
- OSM
description: |-
* `OSM` - OSM
* `ONLINE` - ONLINE
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedLocationList'
description: ''
post:
operationId: locations_create
tags:
- locations
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/LocationCreate'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/LocationCreate'
multipart/form-data:
schema:
$ref: '#/components/schemas/LocationCreate'
required: true
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/LocationCreate'
description: ''
/api/v1/locations/{id}:
get:
operationId: locations_retrieve
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Location.
required: true
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Location'
description: ''
/api/v1/locations/compare:
get:
operationId: locations_compare_retrieve
description: |-
Compare two locations by their IDs.
Returns shared product prices with the latest price per location,
the date of that price, and the total sum.
parameters:
- in: query
name: date__gte
schema:
type: string
format: date
description: Filter prices with date greater than or equal to this date (YYYY-MM-DD)
- in: query
name: date__lte
schema:
type: string
format: date
description: Filter prices with date less than or equal to this date (YYYY-MM-DD)
- in: query
name: location_id_a
schema:
type: integer
required: true
- in: query
name: location_id_b
schema:
type: integer
required: true
- in: query
name: price_is_discounted
schema:
type: boolean
description: Filter to keep only discounted or non-discounted prices
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/LocationCompare'
description: ''
/api/v1/locations/nearby:
get:
operationId: locations_nearby_list
description: |-
Return locations within a given radius of a center point.
Results are ordered by distance (closest first), then by id.
Each result includes a computed `distance_km` field.
parameters:
- in: query
name: lat
schema:
type: number
format: float
description: Latitude of the center point (decimal degrees, -90 to 90)
required: true
- in: query
name: lon
schema:
type: number
format: float
description: Longitude of the center point (decimal degrees, -180 to 180)
required: true
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- in: query
name: radius_km
schema:
type: number
format: float
description: Search radius in kilometers (must be positive)
required: true
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedLocationNearbyList'
description: ''
/api/v1/locations/osm/{osm_type}/{osm_id}:
get:
operationId: locations_osm_retrieve
parameters:
- in: path
name: osm_id
schema:
type: integer
required: true
- in: path
name: osm_type
schema:
type: string
enum:
- NODE
- RELATION
- WAY
required: true
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/Location'
description: ''
/api/v1/locations/osm/countries:
get:
operationId: locations_osm_countries_list
parameters:
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedCountryList'
description: ''
/api/v1/locations/osm/countries/{country_code}/cities:
get:
operationId: locations_osm_countries_cities_list
parameters:
- in: path
name: country_code
schema:
type: string
pattern: ^\w{2}$
required: true
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
tags:
- locations
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedCountryCityList'
description: ''
/api/v1/price-tags:
get:
operationId: price_tags_list
parameters:
- in: query
name: created__gte
schema:
type: string
format: date-time
- in: query
name: created__lte
schema:
type: string
format: date-time
- name: order_by
required: false
in: query
description: Which field to use when ordering the results.
schema:
type: string
- name: page
required: false
in: query
description: A page number within the paginated result set.
schema:
type: integer
- in: query
name: prediction_count
schema:
type: integer
- in: query
name: prediction_count__gte
schema:
type: integer
- in: query
name: prediction_count__lte
schema:
type: integer
- in: query
name: price_id
schema:
type: integer
- in: query
name: proof__location__osm_address_country_code
schema:
type: string
- in: query
name: proof__owner
schema:
type: string
- in: query
name: proof__ready_for_price_tag_validation
schema:
type: boolean
- in: query
name: proof_id
schema:
type: integer
- name: size
required: false
in: query
description: Number of results to return per page.
schema:
type: integer
- in: query
name: status
schema:
type: integer
nullable: true
enum:
- 0
- 1
- 10
- 2
- 3
- 4
- 5
description: |-
The annotation status
* `0` - deleted
* `1` - linked_to_price
* `2` - not_readable
* `3` - truncated
* `4` - not_price_tag
* `5` - no_barcode
* `10` - other
- in: query
name: status__isnull
schema:
type: boolean
- in: query
name: tags__contains
schema:
type: string
- in: query
name: tags__not_contains
schema:
type: string
tags:
- price-tags
security:
- {}
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedPriceTagFullList'
description: ''
post:
operationId: price_tags_create
tags:
- price-tags
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PriceTagCreate'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/PriceTagCreate'
multipart/form-data:
schema:
$ref: '#/components/schemas/PriceTagCreate'
required: true
security:
- CustomAuthentication: []
responses:
'201':
content:
application/json:
schema:
$ref: '#/components/schemas/PriceTagCreate'
description: ''
/api/v1/price-tags/{id}:
get:
operationId: price_tags_retrieve
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Price Tag.
required: true
tags:
- price-tags
security:
- {}
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PriceTagFull'
description: ''
patch:
operationId: price_tags_partial_update
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Price Tag.
required: true
tags:
- price-tags
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PatchedPriceTagUpdate'
application/x-www-form-urlencoded:
schema:
$ref: '#/components/schemas/PatchedPriceTagUpdate'
multipart/form-data:
schema:
$ref: '#/components/schemas/PatchedPriceTagUpdate'
security:
- CustomAuthentication: []
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/PriceTagUpdate'
description: ''
delete:
operationId: price_tags_destroy
parameters:
- in: path
name: id
schema:
type: integer
description: A unique integer value identifying this Price Tag.
required: true
tags:
- price-tags
security:
- CustomAuthentication: []
responses:
'204':
description: No response body
/api/v1/prices:
get:
operationId: prices_list
parameters:
- in: query
name: category_tag
schema:
type: string
- in: query
name: created__gte
schema:
type: string
format: date-time
- in: query
name: created__lte
schema:
type: string
format: date-time
- in: query
name: currency
schema:
type: string
nullable: true
enum:
- ADP
- AED
- AFA
- AFN
- ALK
- ALL
- AMD
- ANG
- AOA
- AOK
- AON
- AOR
- ARA
- ARL
- ARM
- ARP
- ARS
- ATS
- AUD
- AWG
- AZM
- AZN
- BAD
- BAM
- BAN
- BBD
- BDT
- BEC
- BEF
- BEL
- BGL
- BGM
- BGN
- BGO
- BHD
- BIF
- BMD
- BND
- BOB
- BOL
- BOP
- BOV
- BRB
- BRC
- BRE
- BRL
- BRN
- BRR
- BRZ
- BSD
- BTN
- BUK
- BWP
- BYB
- BYN
- BYR
- BZD
- CAD
- CDF
- CHE
- CHF
- CHW
- CLE
- CLF
- CLP
- CNH
- CNX
- CNY
- COP
- COU
- CRC
- CSD
- CSK
- CUC
- CUP
- CVE
- CYP
- CZK
- DDM
- DEM
- DJF
- DKK
- DOP
- DZD
- ECS
- ECV
- EEK
- EGP
- ERN
- ESA
- ESB
- ESP
- ETB
- EUR
- FIM
- FJD
- FKP
- FRF
- GBP
- GEK
- GEL
- GHC
- GHS
- GIP
- GMD
- GNF
- GNS
- GQE
- GRD
- GTQ
- GWE
- GWP
- GYD
- HKD
- HNL
- HRD
- HRK
- HTG
- HUF
- IDR
- IEP
- ILP
- ILR
- ILS
- INR
- IQD
- IRR
- ISJ
- ISK
- ITL
- JMD
- JOD
- JPY
- KES
- KGS
- KHR
- KMF
- KPW
- KRH
- KRO
- KRW
- KWD
- KYD
- KZT
- LAK
- LBP
- LKR
- LRD
- LSL
- LTL
- LTT
- LUC
- LUF
- LUL
- LVL
- LVR
- LYD
- MAD
- MAF
- MCF
- MDC
- MDL
- MGA
- MGF
- MKD
- MKN
- MLF
- MMK
- MNT
- MOP
- MRO
- MRU
- MTL
- MTP
- MUR
- MVP
- MVR
- MWK
- MXN
- MXP
- MXV
- MYR
- MZE
- MZM
- MZN
- NAD
- NGN
- NIC
- NIO
- NLG
- NOK
- NPR
- NZD
- OMR
- PAB
- PEI
- PEN
- PES
- PGK
- PHP
- PKR
- PLN
- PLZ
- PTE
- PYG
- QAR
- RHD
- ROL
- RON
- RSD
- RUB
- RUR
- RWF
- SAR
- SBD
- SCR
- SDD
- SDG
- SDP
- SEK
- SGD
- SHP
- SIT
- SKK
- SLE
- SLL
- SOS
- SRD
- SRG
- SSP
- STD
- STN
- SUR
- SVC
- SYP
- SZL
- THB
- TJR
- TJS
- TMM
- TMT
- TND
- TOP
- TPE
- TRL
- TRY
- TTD
- TWD
- TZS
- UAH
- UAK
- UGS
- UGX
- USD
- USN
- USS
- UYI
- UYP
- UYU
- UYW
- UZS
- VEB
- VED
- VEF
- VES
- VND
- VNN
- VUV
- WST
- XAF
- XAG
- XAU
- XBA
- XBB
- XBC
- XBD
- XCD
- XCG
- XDR
- XEU
- XFO
- XFU
- XOF
- XPD
- XPF
- XPT
- XRE
- XSU
- XTS
- XUA
- XXX
- YDD
- YER
- YUD
- YUM
- YUN
- YUR
- ZAL
- ZAR
- ZMK
- ZMW
- ZRN
- ZRZ
- ZWD
- ZWG
- ZWL
- ZWR
description: |-
* `ADP` - ADP
* `AED` - AED
* `AFA` - AFA
* `AFN` - AFN
* `ALK` - ALK
* `ALL` - ALL
* `AMD` - AMD
* `ANG` - ANG
* `AOA` - AOA
* `AOK` - AOK
* `AON` - AON
* `AOR` - AOR
* `ARA` - ARA
* `ARL` - ARL
* `ARM` - ARM
* `ARP` - ARP
* `ARS` - ARS
* `ATS` - ATS
* `AUD` - AUD
* `AWG` - AWG
* `AZM` - AZM
* `AZN` - AZN
* `BAD` - BAD
* `BAM` - BAM
* `BAN` - BAN
* `BBD` - BBD
* `BDT` - BDT
* `BEC` - BEC
* `BEF` - BEF
* `BEL` - BEL
* `BGL` - BGL
* `BGM` - BGM
* `BGN` - BGN
* `BGO` - BGO
* `BHD` - BHD
* `BIF` - BIF
* `BMD` - BMD
* `BND` - BND
* `BOB` - BOB
* `BOL` - BOL
* `BOP` - BOP
* `BOV` - BOV
* `BRB` - BRB
* `BRC` - BRC
* `BRE` - BRE
* `BRL` - BRL
* `BRN` - BRN
* `BRR` - BRR
* `BRZ` - BRZ
* `BSD` - BSD
* `BTN` - BTN
* `BUK` - BUK
* `BWP` - BWP
* `BYB` - BYB
* `BYN` - BYN
* `BYR` - BYR
* `BZD` - BZD
* `CAD` - CAD
* `CDF` - CDF
* `CHE` - CHE
* `CHF` - CHF
* `CHW` - CHW
* `CLE` - CLE
* `CLF` - CLF
* `CLP` - CLP
* `CNH` - CNH
* `CNX` - CNX
* `CNY` - CNY
* `COP` - COP
* `COU` - COU
* `CRC` - CRC
* `CSD` - CSD
* `CSK` - CSK
* `CUC` - CUC
* `CUP` - CUP
* `CVE` - CVE
* `CYP` - CYP
* `CZK` - CZK
* `DDM` - DDM
* `DEM` - DEM
* `DJF` - DJF
* `DKK` - DKK
* `DOP` - DOP
* `DZD` - DZD
* `ECS` - ECS
* `ECV` - ECV
* `EEK` - EEK
* `EGP` - EGP
* `ERN` - ERN
* `ESA` - ESA
* `ESB` - ESB
* `ESP` - ESP
* `ETB` - ETB
* `EUR` - EUR
* `FIM` - FIM
# --- truncated at 32 KB (247 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/open-food-facts/refs/heads/main/openapi/open-food-facts-open-prices-openapi.yml