Packaging that works as hard as your brand.hello@nationwidepackaging.co.zaClient login
Nationwide Packaging API · Version 1

Build your packaging
experience with confidence.

A practical guide to authentication, products, configuration and quotation requests. Every endpoint is category-locked to Nationwide Packaging.

Base URLhttps://brandingapi-packaging.vercel.app/api/v1
Overview

One focused API for the Packaging catalogue.

The Nationwide Packaging API lets a website, reseller platform or internal tool read structured product information and request prices. Packaging keys cannot read Printing, Signage or any other Nationwide catalogue.

REST + JSONPredictable endpoints and response envelopes.
Firebase-backedCatalogue and credentials use the live Packaging project.
ZAR pricingSuccessful quote responses use South African rand.
Revocable keysUse a separate credential for every integration.
Quick start

Fetch your first products.

  1. 1
    Sign in to the developer portal

    Use your Firebase account to open the Packaging dashboard.

  2. 2
    Create 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.

  3. 3
    Store the key on your server

    Use an environment variable such as PACKAGING_API_KEY. Never put a private key in browser JavaScript or a public repository.

  4. 4
    Send an authenticated request

    Include the key in the HTTP Authorization header.

TerminalList products
curl "https://brandingapi-packaging.vercel.app/api/v1/products" \
  -H "Authorization: Bearer YOUR_API_KEY"
Authentication

Bearer keys, securely scoped.

Protected requests use a Packaging API key in the standard Bearer header. Keys begin with packaging_live_, are stored as SHA-256 hashes and can be revoked from the dashboard at any time.

HTTP headerRequired on protected endpoints
Authorization: Bearer packaging_live_your_private_key
Keep credentials server-side.

Your own backend should call the Packaging API. A browser should call your backend, not this API with a private key embedded in frontend code.

Available scopes

products:packaging:readRead the Packaging catalogue and individual product records.
quotes:createSubmit product, quantity and configuration data for quotation.
Endpoint reference

Version 1 endpoints.

MethodPathPurposeScope
GET/productsList or search the complete Packaging catalogue.products:packaging:read
GET/products/{product_id}Retrieve one product with its options, media and availability.products:packaging:read
POST/quotesRequest a price for a product, quantity and selected configuration.products:packaging:read + quotes:create
GET/auth/statusConfirm the supported authentication mode and scopes.Public
GET/statusCheck catalogue health, source and product count.Public
Products

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.

TerminalSearch the catalogue
curl "https://brandingapi-packaging.vercel.app/api/v1/products?search=burger" \
  -H "Authorization: Bearer YOUR_API_KEY"

Example response

JSON200 OK
{
  "data": [
    {
      "id": "packaging-burger-boxes",
      "name": "Burger Boxes",
      "category": "Packaging",
      "sku": "NWP-004",
      "status": "Live",
      "description": "Burger Boxes with structured product data...",
      "image": "/packaging/Images/Burger Boxes.png",
      "priceFrom": 2.08,
      "priceAvailable": true,
      "pricingSource": "matrix",
      "options": ["Size", "Material", "Print", "Finish"],
      "colours": [],
      "updated": "2026-08-07"
    }
  ],
  "meta": {
    "count": 1,
    "category": "Packaging",
    "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.

TerminalProduct detail
curl "https://brandingapi-packaging.vercel.app/api/v1/products/packaging-burger-boxes" \
  -H "Authorization: Bearer YOUR_API_KEY"
Quotes

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.

JSON requestPOST /quotes
{
  "product_id": "packaging-burger-boxes",
  "quantity": 500,
  "selection": {
    "size": "Medium",
    "material": "Kraft",
    "print": "Full colour"
  }
}
TerminalRequest a quote
curl -X POST "https://brandingapi-packaging.vercel.app/api/v1/quotes" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"product_id": "packaging-burger-boxes","quantity": 500,"selection": {"size": "Medium","material": "Kraft","print": "Full colour"}}'

Priced response

JSON200 OK
{
  "data": {
    "product_id": "packaging-burger-boxes",
    "quantity": 500,
    "selection": {
      "size": "Medium",
      "material": "Kraft",
      "print": "Full colour"
    },
    "currency": "ZAR",
    "unitPrice": 4.25,
    "total": 2125
  }
}
Custom quotation response

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.

Errors

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.

StatusCodeMeaning
400invalid_quoteThe product ID or quantity is missing or invalid.
401invalid_api_keyThe key is missing, malformed, revoked or unknown.
403insufficient_scopeThe key does not include the required scope.
404product_not_foundNo Packaging product matches the supplied ID.
422quote_requiredThe product needs a custom quotation from the Packaging team.
JSON401 Unauthorized
{
  "error": {
    "code": "invalid_api_key",
    "message": "The supplied Packaging API key is invalid or inactive."
  }
}
Go-live checklist

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, 404 and 422 responses 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.
Need help?

Bring us into the integration.

Share the endpoint, response code and request shape—never your full private API key.

Contact integration support →