SHOCAL API
Access local business data for shops, restaurants, and services across the UK. Build amazing local discovery experiences with our comprehensive RESTful API.
Local Businesses
Access profiles, menus, and products from local shops and restaurants.
Reviews & Ratings
Retrieve authentic customer reviews and rating data.
Discounts & Offers
Get active promotions and special offers from vendors.
Trending & Featured
Discover popular and featured local businesses.
Quick Start
Make your first API request in seconds. All requests require authentication via an API key passed as a query parameter.
curl "https://www.shocal.org/developers/apis/v1/vendors?apikey=YOUR_API_KEY&limit=10"
Base URL
All API requests should be made to:
https://www.shocal.org/developers/apis/v1/
Response Format
All responses are returned in JSON format with a consistent structure:
{
"status": 200,
"stores": [
{
"vendorID": "8",
"vendorName": "FLOWERS BY SIOBHAN",
"tagLine": "Family run florist",
"city": "Manchester"
}
]
}
Authentication
Learn how to authenticate your API requests using your API key.
API Key Authentication
All API requests must include your API key as a query parameter. Your API key identifies your application and is used to track usage and enforce rate limits.
Never expose your API key in client-side code or public repositories. Always make API calls from your server.
Code Examples
curl -X GET \
"https://www.shocal.org/developers/apis/v1/vendors?apikey=YOUR_API_KEY&limit=10" \
-H "Accept: application/json"
const response = await fetch(
'https://www.shocal.org/developers/apis/v1/vendors?apikey=YOUR_API_KEY&limit=10',
{
method: 'GET',
headers: { 'Accept': 'application/json' }
}
);
const data = await response.json();
console.log(data);
<?php
$apiKey = 'YOUR_API_KEY';
$url = "https://www.shocal.org/developers/apis/v1/vendors?apikey={$apiKey}&limit=10";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);
import requests
api_key = 'YOUR_API_KEY'
url = f'https://www.shocal.org/developers/apis/v1/vendors?apikey={api_key}&limit=10'
response = requests.get(url)
data = response.json()
print(data)
Authentication Errors
| Code | Message | Description |
|---|---|---|
| 401 | Access denied | Invalid API key or key doesn't have access to this endpoint |
| 403 | Missing token | No API key was provided in the request |
Rate Limits
Understand our rate limiting policies to ensure reliable API access.
Current Limits
To ensure fair usage and maintain service quality, we enforce the following rate limits:
Rate Limit Headers
Each API response includes headers to help you track your rate limit status:
| Header | Description |
|---|---|
X-RateLimit-Limit |
Maximum requests allowed per window |
X-RateLimit-Remaining |
Requests remaining in current window |
X-RateLimit-Reset |
Unix timestamp when the rate limit resets |
Handling Rate Limits
When you exceed the rate limit, you'll receive a 429 Too Many Requests response:
{
"status": 429,
"message": "Too Many Requests"
}
Implement exponential backoff when you receive a 429 response. Wait progressively longer between retries to avoid further rate limiting.
Increasing Your Limits
Need higher rate limits? Contact us at enquiries@shocal.org to discuss enterprise plans with custom limits.
Error Handling
Understand API error responses and how to handle them gracefully.
Error Response Format
{
"status": 401,
"message": "Access denied"
}
HTTP Status Codes
| Code | Status | Description |
|---|---|---|
| 200 | OK | Request was successful. |
| 400 | Bad Request | The request was malformed or missing required parameters. |
| 401 | Unauthorized | Invalid API key or insufficient permissions. |
| 403 | Forbidden | Missing authentication token. |
| 429 | Too Many Requests | Rate limit exceeded. |
| 500 | Internal Error | Something went wrong on our end. |
Get API Access
Request access to the SHOCAL API to start building with local business data.
To obtain API access, please send a request to our team with:
- Your name and contact details
- Company name (if applicable)
- Brief description of your intended use case
- Expected request volume
List Vendors
Retrieve a paginated list of all active vendors on the platform.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key for authentication |
| pageoptional | integer | Page number (default: 1) |
| limitoptional | integer | Results per page, max 100 (default: 20) |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | integer | Unique vendor identifier |
| vendorName | string | Business name |
| outcode | string | Postcode outward code (e.g. M41) |
| storeThumbnail | string | URL to vendor cover image |
| vendorProfile | string | API URL to get full vendor profile |
| modified | datetime | Last updated timestamp |
Vendor Profile
Retrieve detailed information about a specific vendor.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| vendorIDrequired | integer | The vendor's unique identifier |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | string | Unique vendor identifier |
| vendorName | string | Business name |
| tagLine | string | Short business description |
| addressLine1 | string | Street address |
| addressLine2 | string | Additional address line |
| city | string | City name |
| postcode | string | Full UK postcode |
| outcode | string | Postcode outward code |
| longitude | string | Geographic longitude |
| latitude | string | Geographic latitude |
| telephone | string | Contact phone number |
| categories | string | Comma-separated category list |
| storeThumbnail | string | URL to vendor cover image |
| deliveryAreas | string | Comma-separated postcodes served |
| openingHours | object | Daily opening hours (monday-sunday) |
| ratings | object | Contains ratingScore, ratingReviewTotal, ratingReviewsURL |
| socialMedia | object | Social media profile URLs |
| URLs | object | Contains products API URL and profile page URL |
| modified | datetime | Last updated timestamp |
Product
Retrieve details for a specific product.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| vendorIDrequired | integer | The vendor's unique identifier |
| productIDrequired | integer | The product's unique identifier |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | integer | Vendor identifier |
| productID | integer | Unique product identifier |
| name | string | Product name |
| description | string | Full product description |
| price | number | Price in GBP |
| preparationTime | string | Estimated preparation time |
| category | string | Primary product category |
| categorySub | string | Sub-category |
| thumbnail | string | URL to product thumbnail |
| heroImg | string | URL to full-size product image |
| created | datetime | Creation timestamp |
| modified | datetime | Last updated timestamp |
Reviews
Retrieve customer reviews for a specific vendor.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| vendorIDrequired | integer | The vendor's unique identifier |
| commentsoptional | string | Set to "true" to only return reviews with comments |
| pageoptional | integer | Page number (default: 1) |
| limitoptional | integer | Results per page (default: 20) |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | integer | Vendor identifier |
| reviewID | integer | Unique review identifier |
| stars | integer | Star rating (1-5) |
| comments | string | Review text (or "No comments") |
| created | datetime | Review submission timestamp |
Discounts
Retrieve active discounts and promotions.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| pageoptional | integer | Page number (default: 1) |
| limitoptional | integer | Results per page (default: 20) |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | string | Vendor identifier |
| vendor | string | Vendor name |
| discountPercentage | integer | Discount amount as percentage |
| minSpendRequired | string | "TRUE" or "FALSE" - whether minimum spend applies |
| minSpendValue | number | Minimum spend amount in GBP (if required) |
| deliveryAreas | string | Comma-separated postcodes where discount applies |
Blogs
Retrieve blog posts and articles.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| blogIDoptional | integer | Specific blog ID (omit to list all) |
| pageoptional | integer | Page number (default: 1) |
| limitoptional | integer | Results per page (default: 20) |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | string | Vendor identifier (author) |
| blogID | string | Unique blog post identifier |
| vendor | string | Vendor name (author) |
| title | string | Blog post title |
| body | string | Full blog post content |
| deliveryAreas | string | Relevant postcodes for the blog |
| created | datetime | Publication timestamp |
Trending
Retrieve trending and popular products based on recent views.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| outcoderequired | string | Postcode outward code (e.g. M41) |
| pageoptional | integer | Page number (default: 1) |
| limitoptional | integer | Results per page (default: 20) |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | string | Vendor identifier |
| productID | string | Product identifier |
| vendor | string | Vendor name |
| name | string | Product name |
| price | number | Price in GBP |
| keywords | string | Product keywords |
| thumbnail | string | URL to product thumbnail |
| viewProduct | string | API URL to get full product details |
Featured
Retrieve featured and promoted vendors.
Parameters
| Parameter | Type | Description |
|---|---|---|
| apikeyrequired | string | Your API key |
| pageoptional | integer | Page number (default: 1) |
| limitoptional | integer | Results per page (default: 20) |
Response Fields
| Field | Type | Description |
|---|---|---|
| vendorID | string | Unique vendor identifier |
| vendorName | string | Business name |
| outcode | string | Postcode outward code (e.g. M41) |
| storeThumbnail | string | URL to vendor cover image |
| vendorProfile | string | API URL to get full vendor profile |
| modified | datetime | Last updated timestamp |