StreetMetrics · OpenAPI Overlay 1.0.0

API Evangelist enhancements — StreetMetrics Public API

6 actions 6 updates documentation
Derived by API Evangelist Built from the contracts StreetMetrics publishes. StreetMetrics did not publish this file.
View Overlay File View on GitHub Overlay Specification

What the actions change

securitydescriptiontagscontacttermsOfServicex-documentation

Targets 5

$
$.paths['/auth/authenticate'].post
$.info
$.servers
$.components.schemas.ErrorResponseDto

OpenAPI Overlay

Raw ↑
overlay: 1.0.0
info:
  title: API Evangelist enhancements — StreetMetrics Public API
  version: 1.0.0
x-generated: '2026-08-12'
x-method: generated
x-source: openapi/streetmetrics-public-api-openapi.json
x-extends: openapi/streetmetrics-public-api-openapi.json
x-note: >-
  Non-destructive Overlay 1.0.0 capturing API Evangelist's enhancements to the StreetMetrics Public API
  definition. It is never applied to the original: the harvested spec in openapi/ and
  openapi/_original/ stays exactly as StreetMetrics published it. Every action below fixes something the
  published contract states about itself and gets wrong or leaves out — most importantly a security
  scheme that is defined but never applied, and a tag list that declares one tag while the operations
  use eleven.
actions:

# 1. Apply the bearer scheme the spec defines but never uses.
- target: $
  description: >-
    components.securitySchemes.bearer is declared but no root-level `security` and no operation-level
    `security` exists anywhere in the document, so every generated client treats all 54 operations as
    anonymous. Live probing shows the opposite — GET https://dashboard.streetmetrics.io/v3/public/markets
    returns 401 UNAUTHORIZED without a token. Apply the scheme globally.
  update:
    security:
    - bearer: []

# 2. Exempt the token-minting operation from the global requirement.
- target: $.paths['/auth/authenticate'].post
  description: >-
    POST /auth/authenticate mints the bearer token from an api-key header plus platform email/password,
    so it must not require the bearer scheme it produces.
  update:
    security: []

# 3. Declare the tags the operations actually use.
- target: $
  description: >-
    tags declares a single entry, "public", which no operation references; the 54 operations are tagged
    across eleven groups. Replace the declaration with the tags in use so the reference renders and
    tag-based tooling (including our own split-by-tag refinement) does not silently drop operations.
  update:
    tags:
    - name: Authentication
      description: Mint the JWT bearer token used by every other operation.
    - name: Campaigns
      description: Campaign records — the top of the out-of-home buy hierarchy.
    - name: Ad Groups
      description: Transit and stationary ad groups (flights) within a campaign, and the assets, frames
        and creatives attached to them.
    - name: Assets
      description: Moving units (vehicles) that carry transit advertising, plus asset owners and
        compatibility lookups.
    - name: Frames
      description: Fixed advertising faces with physical geometry and exposure characteristics.
    - name: Creatives
      description: Creative records attachable to stationary or transit ad groups.
    - name: Media
      description: Media products and product types describing the inventory a face belongs to.
    - name: Markets
      description: Market reference data.
    - name: Attribution Studies
      description: Attribution studies and their conversion rollups by date, ad group and unit.
    - name: Pixels
      description: Conversion pixels and their bindings to campaigns and attribution studies.
    - name: Reporting
      description: Impressions, demographics, affinities and uniques-and-frequency rollups.

# 4. Contact + license metadata that info leaves empty.
- target: $.info
  description: >-
    info.contact is an empty object and info.description is an empty string. Fill in the published
    documentation and support routes so the contract can be read without the portal.
  update:
    description: >-
      Public REST API for the StreetMetrics out-of-home advertising measurement, planning and
      attribution platform. Covers campaigns, transit and stationary ad groups, assets, frames,
      creatives, markets, media, attribution studies, conversion pixels, and impression, demographic,
      affinity and uniques-and-frequency reporting. Authenticate with POST /auth/authenticate to
      exchange StreetMetrics platform credentials (with an api-key header) for a JWT bearer token, then
      send it as `Authorization: Bearer <token>` on every other operation.
    contact:
      name: StreetMetrics Support
      url: https://streetmetrics.com/contact
    termsOfService: https://streetmetrics.com/privacy-terms/terms
    x-documentation: https://docs.streetmetrics.com/reference/ad-groups

# 5. Record the base-path divergence between the two published copies of this spec.
- target: $.servers
  description: >-
    Two copies of this definition are published and they do not agree on where the paths hang. The live
    NestJS document at https://dashboard.streetmetrics.io/docs-json declares the same
    servers[] entry but prefixes every path with /public/, which concatenates to
    /v3/public/public/... and 404s. The ReadMe-published copy (paths without the prefix) resolves
    correctly and is the one harvested here. Annotate the server so a consumer knows which copy to
    trust.
  update:
  - url: https://dashboard.streetmetrics.io/v3/public/
    description: >-
      Production. Paths in this document are relative to this server. Note that the live /docs-json
      copy of this spec repeats the /public/ segment in its paths; use this document's paths.

# 6. Document the rate-limit reality on the 429 responses.
- target: $.components.schemas.ErrorResponseDto
  description: >-
    Enrich the error schema description with the observed errorCode vocabulary — the published example
    is the placeholder "ERR001", while live responses return UNAUTHORIZED and BAD_REQUEST.
  update:
    description: >-
      Standard error envelope. Observed errorCode values include BAD_REQUEST (400) and UNAUTHORIZED
      (401). Errors are served as application/json, not application/problem+json. No request/correlation
      id is returned; `timestamp` and `path` are the only handles for support escalation.

Work with this as data

Every overlay here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for openapi overlays

4 MCP tools reach this
  • find_overlaysBrowse and filter every overlay in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This overlay
curl "https://apis.io/api/v1/overlays/streetmetrics-public-api-overlay"
All openapi overlays
curl "https://apis.io/api/v1/overlays?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.