Embed shop. search on your site
A lightweight, embeddable search bar that returns results exclusively from
your own domain — powered by shop.
Three steps: activate the API, get indexed, drop the snippet on your page.
One-time purchase MWK 25,000
The API key unlocks the shop.mw search widget for one domain,
permanently. No subscriptions, no renewals. You'll get a key
starting with sk_ that you add to your widget snippet.
Secured by PayChangu. Mobile money or card.
What the key does
- Authorizes API calls from one domain — yours.
- Works with the widget and with direct API calls.
- 60 requests per minute per IP. Plenty for a search bar.
- Can be rotated by contacting support@shop.mw if you ever need to.
403.
Your domain must be indexed first
The widget only returns pages that are in the shop.mw search index. If your site isn't indexed, every search returns "No results".
/shop-mw-verify.txt on your domain to prove
ownership.
International sites
Free indexing is not available for non-Malawian websites.
- To request special placement, email crawler@shop.mw with your domain and use case.
- Unapproved international sites are removed automatically by our audit.
Configure your widget
Enter your domain above to generate your snippet.
You need to configure your widget first. Enter your domain in the Get Snippet tab to generate a preview.
All attributes are optional except data-site and data-key.
| Attribute | Values | Description |
|---|---|---|
| data-site | required | Your domain, exactly as indexed. |
| data-key | required | Your API key, starting with sk_. |
| data-mode | dropdown | inline | both | magazine | How results appear. Default: dropdown. |
| data-theme | light | dark | Visual theme. Default: light. |
| data-limit | 1–50 | Max results. Default: 20. |
| data-placeholder | short text | Custom placeholder. |
Dropdown (default)
<div id="shopmw-search-widget"
data-site="example.mw"
data-key="sk_YOUR_KEY_HERE"></div>
<script src="https://api.shop.mw/widget.js" async></script>
Inline
<div id="shopmw-search-widget"
data-site="example.mw"
data-key="sk_YOUR_KEY_HERE"
data-mode="inline"></div>
<script src="https://api.shop.mw/widget.js" async></script>
Both, dark theme, limit 10
<div id="shopmw-search-widget"
data-site="example.mw"
data-key="sk_YOUR_KEY_HERE"
data-mode="both"
data-theme="dark"
data-limit="10"></div>
<script src="https://api.shop.mw/widget.js" async></script>
Magazine
<div id="shopmw-search-widget"
data-site="example.mw"
data-key="sk_YOUR_KEY_HERE"
data-mode="magazine"></div>
<script src="https://api.shop.mw/widget.js" async></script>
Widget shows but no results.
Either the domain isn't indexed (see Step 2) or the API key is missing/invalid.
Check the browser console: 401 = missing key,
403 = invalid key or origin mismatch,
200 with total_results: 0 = indexed but no matching pages.
"Missing API key" in console.
Add data-key="sk_..." to your widget container.
"Invalid or inactive API key".
Your key doesn't match the domain, or the subscription isn't active.
Check data-site matches the domain on your activation receipt.
CORS error in console.
Your page's origin doesn't match data-site. Test from the real domain,
not a staging subdomain.
Rate limit reached. The API allows 60 req/min per IP. The widget debounces at 300ms, so normal typing won't hit it.