One focused API for the Signage catalogue.
The Nationwide Signage API lets a website, reseller platform or internal tool read structured product information and request prices. Signage keys cannot read Packaging, Printing or any other Nationwide catalogue.
Fetch your first products.
- 1Sign in to the developer portal
Use your Firebase account to open the Signage dashboard.
- 2Create a dedicated API key
Name it after the website or integration that will use it. Copy it immediately; the complete key is shown only once.
- 3Store the key on your server
Use an environment variable such as
SIGNAGE_API_KEY. Never put a private key in browser JavaScript or a public repository. - 4Send an authenticated request
Include the key in the HTTP Authorization header.
curl "https://brandingapi-signage.vercel.app/api/v1/products" \
-H "Authorization: Bearer YOUR_API_KEY"Bearer keys, securely scoped.
Protected requests use a Signage API key in the standard Bearer header. Keys begin with signage_live_, are stored as SHA-256 hashes and can be revoked from the dashboard at any time.
Authorization: Bearer signage_live_your_private_keyYour own backend should call the Signage API. A browser should call your backend, not this API with a private key embedded in frontend code.
Available scopes
products:signage:readRead the Signage catalogue and individual product records.quotes:createSubmit product, quantity and configuration data for quotation.Version 1 endpoints.
| Method | Path | Purpose | Scope |
|---|---|---|---|
| GET | /products | List or search the complete Signage catalogue. | products:signage:read |
| GET | /products/{product_id} | Retrieve one product with its options, media and availability. | products:signage:read |
| POST | /quotes | Request a price for a product, quantity and selected configuration. | products:signage:read + quotes:create |
| GET | /auth/status | Confirm the supported authentication mode and scopes. | Public |
| GET | /status | Check catalogue health, source and product count. | Public |
List, search and retrieve products.
GET /products returns a data array and useful catalogue metadata. Add the optional search query parameter to match product names, SKUs and descriptions.
curl "https://brandingapi-signage.vercel.app/api/v1/products?search=banner" \
-H "Authorization: Bearer YOUR_API_KEY"Example response
{
"data": [
{
"id": "signage_-NoLppSZ_iGcwRzUdFWz",
"name": "A-Frame Banners",
"category": "Signage",
"sku": "SIGNAGE_-NOLPPSZ_IGCWRZUDFWZ",
"status": "Live",
"description": "A-Frame Banners with structured product data...",
"image": "/signage/Products/A%20Frame.webp",
"priceFrom": 1270,
"priceAvailable": true,
"pricingSource": "matrix",
"options": ["Size", "Material", "Print", "Finish"],
"colours": [],
"updated": "2026-08-07"
}
],
"meta": {
"count": 1,
"category": "Signage",
"source": "firebase"
}
}Retrieve one product
Use the exact id returned by the list endpoint. The detail response wraps the product in a single data object.
curl "https://brandingapi-signage.vercel.app/api/v1/products/signage_-NoLppSZ_iGcwRzUdFWz" \
-H "Authorization: Bearer YOUR_API_KEY"Submit the customer's configuration.
POST /quotes accepts a product ID, a positive quantity and an optional selection object. Selection keys should reflect the options presented by the product record.
{
"product_id": "signage_-NoLppSZ_iGcwRzUdFWz",
"quantity": 500,
"selection": {
"size": "900 x 600 mm",
"material": "PVC banner",
"print": "Full colour"
}
}curl -X POST "https://brandingapi-signage.vercel.app/api/v1/quotes" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"product_id": "signage_-NoLppSZ_iGcwRzUdFWz","quantity": 500,"selection": {"size": "900 x 600 mm","material": "PVC banner","print": "Full colour"}}'Priced response
{
"data": {
"product_id": "signage_-NoLppSZ_iGcwRzUdFWz",
"quantity": 500,
"selection": {
"size": "900 x 600 mm",
"material": "PVC banner",
"print": "Full colour"
},
"currency": "ZAR",
"unitPrice": 4.25,
"total": 2125
}
}If a live price is not available, the API returns 422 quote_required with the product, quantity, selection and contact route. Treat this as a supported handoff, not a system failure.
Consistent, actionable responses.
Errors use an HTTP status plus an error.code and readable error.message. Log the code internally and show a friendly message to the customer.
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_quote | The product ID or quantity is missing or invalid. |
| 401 | invalid_api_key | The key is missing, malformed, revoked or unknown. |
| 403 | insufficient_scope | The key does not include the required scope. |
| 404 | product_not_found | No Signage product matches the supplied ID. |
| 422 | quote_required | The product needs a custom quotation from the Signage team. |
{
"error": {
"code": "invalid_api_key",
"message": "The supplied Signage API key is invalid or inactive."
}
}Move from testing to production safely.
- Create a separate key for each website, environment or integration.
- Keep the key in server-side environment variables or a secret manager.
- Use product IDs from the API; do not manufacture IDs from product names.
- Handle
401,403,404and422responses explicitly. - Refresh catalogue data on a sensible schedule and respect
Cache-Control: no-store. - Revoke a key immediately if it is exposed, then issue a replacement.
- Check /api/v1/status when diagnosing availability.
Bring us into the integration.
Share the endpoint, response code and request shape—never your full private API key.
