Set Up Real-Time Data Feed Max on OpenCart
Three ways to expose your OpenCart catalog as a JSON feed
What Your Feed Should Look Like
Real-Time Data Feed Max accepts any public URL returning JSON or plain text. The AI reads whatever you give it — products, services, bookable slots, property listings, menus, opening hours, anything — and uses it to answer visitor questions. There is no required shape or field name.
The one exception is Dynamic Product Cards. If you want matching items to render as visual cards in the chat, use these specific field names: name, price, description, image_url, button_link, in_stock.
Example — products (triggers Dynamic Product Cards)
{
"products": [
{
"name": "Wireless Headphones Pro",
"price": "$149.99",
"description": "Premium over-ear wireless headphones with ANC.",
"image_url": "https://example.com/images/headphones.jpg",
"button_link": "https://example.com/products/headphones",
"in_stock": true
}
]
}
Example — services (any shape works)
{
"services": [
{
"service": "Deep tissue massage",
"duration_minutes": 60,
"price_from": "$95",
"therapists_available": ["Anna", "Mark"],
"booking_link": "https://example.com/book/deep-tissue"
},
{
"service": "Haircut & style",
"duration_minutes": 45,
"price_from": "$55",
"booking_link": "https://example.com/book/haircut"
}
]
}
Example — plain text (works too)
Opening hours: Mon-Fri 9-6, Sat 10-4, closed Sunday. Delivery: Free over $30, minimum order $15, within 5 miles. Lunch specials (weekdays only): - Margherita pizza $12 - Caesar salad $9 - Soup of the day $7
Rule of thumb: Use descriptive field names the AI can interpret (service, duration, price, location, etc.). If Dynamic Product Cards make sense for your business, follow the exact field names above. If they don't, use whatever shape fits your data — the AI still searches it and answers questions correctly.
How OpenCart Differs
OpenCart doesn't ship with a built-in public JSON product endpoint. You have three options: a product feed extension (no code), a custom catalog controller (PHP, full control), or a small PHP script that queries the database directly.
Option 1 — Product Feed Extension (easiest)
The OpenCart marketplace has many feed-generator extensions that produce a public JSON or XML feed at a fixed URL.
- OpenCart Google Shopping Feed
- Advanced Product Feed (multiple marketplaces)
- Simple Data Feed for OpenCart
Install the extension via Extensions → Installer, configure a JSON output with fields mapped to name / price / description / image_url / button_link / in_stock, and use the generated feed URL.
Option 2 — Custom Catalog Controller
OpenCart already routes URLs through catalog/controller/* files. Add your own controller file that returns JSON.
<?php
// catalog/controller/feed/aifeed.php
class ControllerFeedAifeed extends Controller {
public function index() {
$this->load->model('catalog/product');
$products = $this->model_catalog_product->getProducts([
'start' => 0,
'limit' => 5000,
'filter_status' => 1,
]);
$out = [];
foreach ($products as $p) {
$out[] = [
'name' => $p['name'],
'price' => $this->currency->format($p['price'], $this->session->data['currency']),
'description' => strip_tags(html_entity_decode($p['description'])),
'image_url' => HTTP_CATALOG . 'image/' . $p['image'],
'button_link' => $this->url->link('product/product', 'product_id=' . $p['product_id']),
'in_stock' => (bool)$p['quantity'],
];
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode(['products' => $out]));
}
}
Option 3 — Standalone PHP Script
If you want to avoid creating a controller, drop a standalone PHP file in your OpenCart root that uses the same database connection:
<?php
// ai-feed.php in your OpenCart root
require_once('config.php');
header('Content-Type: application/json');
$db = new mysqli(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
$q = $db->query("
SELECT pd.name, p.price, pd.description, p.image, p.product_id, p.quantity
FROM " . DB_PREFIX . "product p
JOIN " . DB_PREFIX . "product_description pd ON p.product_id = pd.product_id
WHERE p.status = 1 AND pd.language_id = 1
");
$out = [];
while ($r = $q->fetch_assoc()) {
$out[] = [
'name' => $r['name'],
'price' => '$' . number_format($r['price'], 2),
'description' => strip_tags(html_entity_decode($r['description'])),
'image_url' => HTTP_CATALOG . 'image/' . $r['image'],
'button_link' => HTTP_CATALOG . 'index.php?route=product/product&product_id=' . $r['product_id'],
'in_stock' => (bool)$r['quantity'],
];
}
echo json_encode(['products' => $out]);
Feed URL: https://your-site.com/ai-feed.php
Security: Standalone PHP scripts are publicly accessible. Keep them read-only (SELECT only, no INSERT/UPDATE/DELETE) and don't accept query parameters that alter behavior.
Troubleshooting
Your site is in maintenance, staging, or password-protected mode. Real-Time Data Feed Max needs a fully public URL.
Open the URL in a private browser window. If you don't see JSON, the URL is wrong or the endpoint is down. If you see JSON but we still fail, the response may be missing a Content-Type: application/json header or exceeding the 10,000,000 character limit.
Dynamic Product Cards require specific field names (name, price, image_url, button_link, in_stock). If your platform uses different names, reshape the response in a small custom script before exposing it.
The feed auto-refreshes every 24 hours. For immediate updates, click Refresh Now in Real-Time Data Feed Max. For live fields (price, stock), the AI pulls fresh data on every message — so the 24h cycle only affects which items are known, not their current state.
Real-Time Data Feed Max accepts up to 10,000,000 characters (~25,000 items). If you exceed that, trim fields (skip long HTML descriptions), split your catalog, or use the standard Real-Time Data Feed alongside for secondary data.
Still stuck? Start with the simplest option for your platform and verify the URL works in a browser before pasting it into Real-Time Data Feed Max. You can always upgrade to a more advanced option later — only the URL field changes on our side.