Shop.

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.

One-time activation fee MWK 25,000
Total to pay MWK 25,000
Activate now — MWK 25,000

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.
The key is public by design. The key only works from the domain you register it with, so copying it to another domain won't work: requests from any other origin are rejected with 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".

Already indexed? If your site already appears in shop.mw search results, there is no need to resubmit it. You can skip this tab and go straight to Step 1.
1
Log in to shop.mw
Go to shop.mw/publish.php and sign in with your Google account.
2
Open Profile → Website Indexing
From your profile page, click the Profile tab, then scroll to Website Indexing.
3
Submit your website
Click "Submit your website for indexing", enter your domain, and follow the verification steps. You'll need to place a small text file at /shop-mw-verify.txt on your domain to prove ownership.
4
Wait for the crawl
Once verified, your site enters the queue. Indexing typically takes a few hours to a day. You can check by searching on shop.mw for a distinctive phrase from your pages.
Open my profile →

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

Dropdown
Floating box below the search bar.
Inline
Results render inline on the page.
Both
Dropdown + persistent inline block.
Magazine
Editorial layout with images and side briefs.

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.

Reference

All attributes are optional except data-site and data-key.

AttributeValuesDescription
data-siterequiredYour domain, exactly as indexed.
data-keyrequiredYour API key, starting with sk_.
data-modedropdown | inline | both | magazineHow results appear. Default: dropdown.
data-themelight | darkVisual theme. Default: light.
data-limit1–50Max results. Default: 20.
data-placeholdershort textCustom 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.