Skip to main content
    Updated
    Developer

    QHSEtech Public API

    Programmatic access to the QHSE & ESG software directory. Free, JSON over HTTPS, Bearer-token authentication.

    API changelog

    Base URL

    https://nypdfolwwyubfqqljmxj.functions.supabase.co/public-api

    All requests require an Authorization: Bearer YOUR_API_KEY header. Generate a key below.

    Without a key

    AI assistants can use the read-only MCP server (Model Context Protocol, streamable HTTP) with no key. It searches the profiles, returns one profile and lists and returns the articles. Every result carries the page's URL, and each profile, search result and full article also carries a citation line.

    https://nypdfolwwyubfqqljmxj.supabase.co/functions/v1/mcp

    The catalog is also a file, /data/software.json, and the study CSVs are on the datasets page. QHSEtech-authored data is CC BY 4.0.

    Get an API key

    View your keys

    For security, listing or revoking keys requires a 6-digit code we email to your address. Codes expire in 15 minutes.

    Try it live in the API Explorer

    OpenAPI 3.1 spec & Postman

    Import /api-docs/openapi.json into Swagger UI / OpenAPI Generator, or run the pre-configured collection in Postman.

    Endpoints

    GET /v1/software

    List all software products, A to Z by name; the order is not a ranking. Supports ?category=, ?q= (name search, max 100 characters), ?limit= (max 100), ?offset=.

    curl https://nypdfolwwyubfqqljmxj.functions.supabase.co/public-api/v1/software?limit=5 \
      -H "Authorization: Bearer YOUR_API_KEY"

    Response shape:

    {
      "data": [
        {
          "id": "example-product",
          "name": "Example Product",
          "tagline": "...",
          "category": "QHSE Platform",
          "rating": null,
          "review_count": 0,
          "website": "https://...",
          ...
        }
      ],
      "pagination": { "limit": 25, "offset": 0, "total": 212 }
    }

    GET /v1/software/:id

    Fetch a single product by its slug ID with the full record (pros, cons, features, certifications, pricing details).

    curl https://nypdfolwwyubfqqljmxj.functions.supabase.co/public-api/v1/software/tekmon \
      -H "Authorization: Bearer YOUR_API_KEY"

    GET /v1/categories

    List all distinct categories with the number of products in each.

    curl https://nypdfolwwyubfqqljmxj.functions.supabase.co/public-api/v1/categories \
      -H "Authorization: Bearer YOUR_API_KEY"

    Code samples

    Same request — list software products — across five languages. Click the language tab and copy.

    curl https://nypdfolwwyubfqqljmxj.functions.supabase.co/public-api/v1/software?limit=5 \
      -H "Authorization: Bearer YOUR_API_KEY"

    Official SDKs

    Drop-in single-file clients for TypeScript and Python. Same API surface, fully typed, minimal dependencies.

    Install

    The SDKs are not published to npm or PyPI yet, so there is no package to install. Today the supported way is to download the single-file client and keep it in your project.

    curl -O https://qhsetech.com/api-docs/sdk/qhsetech.ts

    Or use the download buttons above: qhsetech.ts · qhsetech.py. Place the file next to your code; the examples below import it from there.

    Quick start

    import { QhseTechClient, QhseTechApiError } from "./qhsetech";
    
    const client = new QhseTechClient({
      apiKey: process.env.QHSE_API_KEY!, // qhse_live_*
    });
    
    // List products
    const { data, pagination } = await client.software.list({
      category: "Incident Management",
      limit: 10,
    });
    console.log(`${pagination?.total} products total`);
    
    // Single product
    const { data: product } = await client.software.get("tekmon");
    
    // Keyword search: name matches first, then A to Z (not a ranking)
    const { data: results } = await client.search.products({
      q: "permit to work for confined spaces",
      limit: 5,
    });
    
    // Typed error handling
    try {
      await client.software.get("does-not-exist");
    } catch (e) {
      if (e instanceof QhseTechApiError) {
        console.error(e.code, e.status, e.requestId);
      }
    }

    Available methods

    MethodEndpoint
    client.software.list(...)GET /v1/software
    client.software.get(id)GET /v1/software/:id
    client.categories.list()GET /v1/categories
    client.reviews.list(softwareId)GET /v1/reviews/:id
    client.glossary.list(q?)GET /v1/glossary
    client.search.products(q=...)GET /v1/search

    Fair use and licence

    • Free unlimited access during preview — please be reasonable (avoid hammering the API).
    • Each request is logged with the API key for analytics. We may revoke keys behaving abusively.
    • Cache results when possible — the directory updates daily, not per-second.
    • QHSEtech-authored data is licensed under CC BY 4.0: credit The QHSE Standard (qhsetech.com), link the page you used and keep its check date. Vendor material, logos and other third-party content keep their own terms.

    Errors & status codes

    StatusMeaning
    401Missing or invalid API key
    403API key revoked
    404Resource not found
    405Method not allowed (only GET supported)
    500Server error — please retry