Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

mercaapi

Unofficial Mercadona products API with additional nutritional information.

Description

mercaapi is an unofficial API that provides access to Mercadona product data, enhanced with additional nutritional information. This project aims to offer developers and researchers easy access to comprehensive product data from Mercadona, including detailed nutritional facts not readily available through official channels.

Features

  • Comprehensive product data from Mercadona
  • Enhanced nutritional information for each product
  • RESTful API endpoints for easy integration
  • Docker support for simple deployment
  • Regular updates to keep product information current

Installation

Prerequisites

  • Docker
  • Docker Compose

Deployment with Docker

  1. Clone the repository:

    git clone https://github.com/m0wer/mercaapi.git
    cd mercaapi
    
  2. Configure the environment (see .env.example):

    cp .env.example .env
    # Set AI_BASE_URL, AI_API_KEY and AI_MODEL (any OpenAI-compatible endpoint)
    
  3. Build and run the Docker containers:

    docker-compose up -d
    
  4. The API will be available at http://localhost:8000 (or the port you've configured).

Updating the database

The cli.py script parses the Mercadona API and completes nutritional information using an OpenAI-compatible model (vision extraction from product photos, with estimation from the product details as fallback):

python cli.py parse --update-existing # products, categories, and prices
python cli.py discover-warehouses # sample one postcode per province
python cli.py discover-warehouses --postal-codes-file postcodes.txt # exhaustive
python cli.py parse-availability # per-warehouse availability and prices
python cli.py process-nutritional-information # fill missing nutrition data
python cli.py clean-nutrition # reprocess implausible nutrition rows
python cli.py update # all of the above, for cron

update defaults to 5 requests/second for product detail parsing and 12 requests/second for the lighter warehouse category listings. Override the latter with --availability-max-requests if the upstream API rate limits it.

Warehouse availability tracking

Mercadona serves a different catalog depending on the warehouse that covers the customer's postal code. discover-warehouses probes one postal code per province (or every postcode supplied with --postal-codes-file) and stores the warehouse codes. parse-availability then walks each warehouse's category listings and tracks, per product and warehouse:

  • current availability and price (GET /api/products/{id}/availability)
  • availability changes over time (GET /api/products/{id}/availability/history)
  • price divergences from the main catalog (in the product price history)

Known warehouses are listed at GET /api/warehouses/. Set active to false in the warehouse table to skip a warehouse during updates.

To run the full update periodically with Docker, add a cron entry on the host:

0 4 * * 0 cd /path/to/mercaapi && docker compose run --rm updater >> /var/log/mercaapi-update.log 2>&1

Usage

Once the API is running, you can access the following endpoints:

  • GET /products: List all products
  • GET /products/{id}: Get details for a specific product
  • GET /categories: List all categories
  • GET /categories/{id}: Get products in a specific category

Example request:

curl http://localhost:8000/products/12345

For full API documentation, visit http://localhost:8000/docs after deploying the project.

Development

To set up the development environment:

  1. Create a virtual environment:

    python -m venv venv
    source venv/bin/activate # On Windows, use `venv\Scripts\activate`
    
  2. Install dependencies:

    pip install -r requirements.txt
    
  3. Run the development server:

    uvicorn app.main:app --reload
    

Testing

To run the tests, from the repository root:

python3 -m pytest tests/

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Disclaimer

This project is not officially affiliated with, authorized, maintained, sponsored, or endorsed by Mercadona or any of its affiliates or subsidiaries. This is an independent and unofficial API. Use at your own risk.

Contact

If you have any questions or feedback, please open an issue on the GitHub repository. For other inquiries, send an email to mercaapi (at) sgn (dot) space.

About

Unofficial Mercadona API with nutritional information and price history.

Topics

Resources

Stars

11 stars

Watchers

1 watching

Forks

Packages

Contributors

Languages