StreetMetrics Frames API

The Frames API from StreetMetrics — 2 operation(s) for frames.

Operations 8

GET /public/frames Get a list of frames #
POST /public/frames Create a frame #
GET /public/frames/{id} Get a frame by ID #
PATCH /public/frames/{id} Patch a frame by ID #
GET /frames Get a list of frames #
POST /frames Create a frame #
GET /frames/{id} Get a frame by ID #
PATCH /frames/{id} Patch a frame by ID #

Work with this as data

Every API 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 apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • 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 API
curl "https://apis.io/api/v1/apis/streetmetrics-frames-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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.

OpenAPI Specification

streetmetrics-frames-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Streetmetrics Frames API
  version: '3.0'
  contact: {}
  description: 'Operations tagged Frames across 2 of this provider''s published API definitions: streetmetrics-public-api-docs-json.json, streetmetrics-public-api-openapi.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://dashboard.streetmetrics.io/v3/public/
tags:
- name: Frames
paths:
  /public/frames:
    get:
      operationId: FramesController_getFrames
      parameters:
      - name: limit
        required: false
        in: query
        description: Limit the number of results (max 10000)
        schema:
          type: number
      - name: sort
        required: false
        in: query
        description: Field to sort by
        schema:
          type: string
      - name: order
        required: false
        in: query
        description: Order direction
        schema:
          type: string
          enum:
          - ASC
          - DESC
      - name: cursor
        required: false
        in: query
        description: "Cursor for pagination. \n      The cursor is used to fetch the next set of results in a paginated response.\n      Typically, it is provided in the 'nextCursor' field of the previous response.\n      Usage:\n      - Start by making an initial request without a cursor.\n      - In the response, you'll receive a 'nextCursor' if there are more results to fetch.\n      - Use this 'nextCursor' value as the cursor in your subsequent request to fetch the next page of results.\n      - Continue this process until the 'nextCursor' is null or not provided, indicating there are no more results.\n      Example: \n      \n    ?cursor=12345\n    "
        schema:
          type: string
      - name: include
        required: false
        in: query
        description: 'Specific entities to include in the Frame response. Only valid for Frame entities. Possible values: market'
        schema:
          example:
          - market
          type: array
          items:
            type: string
            enum:
            - market
      - name: search
        required: false
        in: query
        description: "Search query string. The syntax is 'fieldName.operation(a|o):value'.\n      The a|o (AND|OR) is optional and if not provided, it is considered as AND.\n    Additional searches can be chained with a comma.\n      Supported operations are:\n          - gt: Greater than\n          - lt: Less than\n          - gte: Greater than or equal to\n          - lte: Less than or equal to\n          - eq: Equal to\n          - ne: Not equal to\n          - ilike: Case-insensitive like\n          - like: Case-sensitive like\n          - startilike: Case-insensitive like at the start\n          - endilike: Case-insensitive like at the end\n          - startlike: Case-sensitive like at the start\n          - endlike: Case-sensitive like at the end\n        Logical operators:\n          - a: AND\n          - o: OR\n        Examples:\n          - assetRef.ilike:E62\n            Returns all assets with assetRef like E62\n          - createdAt.gte:2021-01-01\n            Returns all assets created after 2021-01-01\n          - status.eqo:PENDING,status.eqo:APPROVED\n            Returns all assets with status either PENDING OR APPROVED\n          - name.startilike:John\n            Returns all assets with name starting with John\n          - age.gtea:30,age.lt:40\n            Returns all assets with age greater than or equal to 30 and less than 40"
        schema:
          example: assetRef.ilike:E62,createdAt.gte:2021-01-01
          type: string
      responses:
        '200':
          description: Frames retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientFrameEntityDto'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      summary: Get a list of frames
      tags:
      - Frames
    post:
      operationId: FramesController_createFrame
      parameters: []
      requestBody:
        required: true
        description: Data to create a new frame
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateFrameDto'
      responses:
        '200':
          description: Frame created successfully
          content:
            application/json:
              schema:
                type: number
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      summary: Create a frame
      tags:
      - Frames
    servers:
    - url: https://dashboard.streetmetrics.io/v3/public/
  /public/frames/{id}:
    get:
      operationId: FramesController_getFrameById
      parameters:
      - name: limit
        required: false
        in: query
        description: Limit the number of results (max 10000)
        schema:
          type: number
      - name: sort
        required: false
        in: query
        description: Field to sort by
        schema:
          type: string
      - name: order
        required: false
        in: query
        description: Order direction
        schema:
          type: string
          enum:
          - ASC
          - DESC
      - name: cursor
        required: false
        in: query
        description: "Cursor for pagination. \n      The cursor is used to fetch the next set of results in a paginated response.\n      Typically, it is provided in the 'nextCursor' field of the previous response.\n      Usage:\n      - Start by making an initial request without a cursor.\n      - In the response, you'll receive a 'nextCursor' if there are more results to fetch.\n      - Use this 'nextCursor' value as the cursor in your subsequent request to fetch the next page of results.\n      - Continue this process until the 'nextCursor' is null or not provided, indicating there are no more results.\n      Example: \n      \n    ?cursor=12345\n    "
        schema:
          type: string
      - name: include
        required: false
        in: query
        description: 'Specific entities to include in the Frame response. Only valid for Frame entities. Possible values: market'
        schema:
          example:
          - market
          type: array
          items:
            type: string
            enum:
            - market
      - name: search
        required: false
        in: query
        description: "Search query string. The syntax is 'fieldName.operation(a|o):value'.\n      The a|o (AND|OR) is optional and if not provided, it is considered as AND.\n    Additional searches can be chained with a comma.\n      Supported operations are:\n          - gt: Greater than\n          - lt: Less than\n          - gte: Greater than or equal to\n          - lte: Less than or equal to\n          - eq: Equal to\n          - ne: Not equal to\n          - ilike: Case-insensitive like\n          - like: Case-sensitive like\n          - startilike: Case-insensitive like at the start\n          - endilike: Case-insensitive like at the end\n          - startlike: Case-sensitive like at the start\n          - endlike: Case-sensitive like at the end\n        Logical operators:\n          - a: AND\n          - o: OR\n        Examples:\n          - assetRef.ilike:E62\n            Returns all assets with assetRef like E62\n          - createdAt.gte:2021-01-01\n            Returns all assets created after 2021-01-01\n          - status.eqo:PENDING,status.eqo:APPROVED\n            Returns all assets with status either PENDING OR APPROVED\n          - name.startilike:John\n            Returns all assets with name starting with John\n          - age.gtea:30,age.lt:40\n            Returns all assets with age greater than or equal to 30 and less than 40"
        schema:
          example: assetRef.ilike:E62,createdAt.gte:2021-01-01
          type: string
      - name: id
        required: true
        in: path
        schema:
          type: number
      responses:
        '200':
          description: Frame retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientFrameEntityDto'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '404':
          description: Frame not found
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      summary: Get a frame by ID
      tags:
      - Frames
    patch:
      operationId: FramesController_patchFrame
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: number
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchFrameDto'
      responses:
        '200':
          description: Frame patched successfully
          content:
            application/json:
              schema:
                type: number
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      summary: Patch a frame by ID
      tags:
      - Frames
    servers:
    - url: https://dashboard.streetmetrics.io/v3/public/
  /frames:
    get:
      operationId: FramesController_getFrames
      summary: Get a list of frames
      parameters:
      - name: limit
        required: false
        in: query
        description: Limit the number of results (max 10000)
        schema:
          type: number
      - name: sort
        required: false
        in: query
        description: Field to sort by
        schema:
          type: string
      - name: order
        required: false
        in: query
        description: Order direction
        schema:
          enum:
          - ASC
          - DESC
          type: string
      - name: cursor
        required: false
        in: query
        description: "Cursor for pagination. \n      The cursor is used to fetch the next set of results in a paginated response.\n      Typically, it is provided in the 'nextCursor' field of the previous response.\n      Usage:\n      - Start by making an initial request without a cursor.\n      - In the response, you'll receive a 'nextCursor' if there are more results to fetch.\n      - Use this 'nextCursor' value as the cursor in your subsequent request to fetch the next page of results.\n      - Continue this process until the 'nextCursor' is null or not provided, indicating there are no more results.\n      Example: \n      \n    ?cursor=12345\n    "
        schema:
          type: string
      - name: include
        required: false
        in: query
        description: 'Specific entities to include in the Frame response. Only valid for Frame entities. Possible values: market'
        example:
        - market
        schema:
          type: string
      - name: search
        required: false
        in: query
        description: "Search query string. The syntax is 'fieldName.operation(a|o):value'.\n      The a|o (AND|OR) is optional and if not provided, it is considered as AND.\n    Additional searches can be chained with a comma.\n      Supported operations are:\n          - gt: Greater than\n          - lt: Less than\n          - gte: Greater than or equal to\n          - lte: Less than or equal to\n          - eq: Equal to\n          - ne: Not equal to\n          - ilike: Case-insensitive like\n          - like: Case-sensitive like\n          - startilike: Case-insensitive like at the start\n          - endilike: Case-insensitive like at the end\n          - startlike: Case-sensitive like at the start\n          - endlike: Case-sensitive like at the end\n        Logical operators:\n          - a: AND\n          - o: OR\n        Examples:\n          - assetRef.ilike:E62\n            Returns all assets with assetRef like E62\n          - createdAt.gte:2021-01-01\n            Returns all assets created after 2021-01-01\n          - status.eqo:PENDING,status.eqo:APPROVED\n            Returns all assets with status either PENDING OR APPROVED\n          - name.startilike:John\n            Returns all assets with name starting with John\n          - age.gtea:30,age.lt:40\n            Returns all assets with age greater than or equal to 30 and less than 40"
        example: assetRef.ilike:E62,createdAt.gte:2021-01-01
        schema:
          type: string
      responses:
        '200':
          description: Frames retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientFrameEntityDto'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      tags:
      - Frames
    post:
      operationId: FramesController_createFrame
      summary: Create a frame
      parameters: []
      requestBody:
        required: true
        description: Data to create a new frame
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateFrameDto_2'
      responses:
        '200':
          description: Frame created successfully
          content:
            application/json:
              schema:
                type: number
        '201':
          description: ''
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      tags:
      - Frames
    servers:
    - url: https://dashboard.streetmetrics.io/v3/public/
  /frames/{id}:
    get:
      operationId: FramesController_getFrameById
      summary: Get a frame by ID
      parameters:
      - name: limit
        required: false
        in: query
        description: Limit the number of results (max 10000)
        schema:
          type: number
      - name: sort
        required: false
        in: query
        description: Field to sort by
        schema:
          type: string
      - name: order
        required: false
        in: query
        description: Order direction
        schema:
          enum:
          - ASC
          - DESC
          type: string
      - name: cursor
        required: false
        in: query
        description: "Cursor for pagination. \n      The cursor is used to fetch the next set of results in a paginated response.\n      Typically, it is provided in the 'nextCursor' field of the previous response.\n      Usage:\n      - Start by making an initial request without a cursor.\n      - In the response, you'll receive a 'nextCursor' if there are more results to fetch.\n      - Use this 'nextCursor' value as the cursor in your subsequent request to fetch the next page of results.\n      - Continue this process until the 'nextCursor' is null or not provided, indicating there are no more results.\n      Example: \n      \n    ?cursor=12345\n    "
        schema:
          type: string
      - name: include
        required: false
        in: query
        description: 'Specific entities to include in the Frame response. Only valid for Frame entities. Possible values: market'
        example:
        - market
        schema:
          type: string
      - name: search
        required: false
        in: query
        description: "Search query string. The syntax is 'fieldName.operation(a|o):value'.\n      The a|o (AND|OR) is optional and if not provided, it is considered as AND.\n    Additional searches can be chained with a comma.\n      Supported operations are:\n          - gt: Greater than\n          - lt: Less than\n          - gte: Greater than or equal to\n          - lte: Less than or equal to\n          - eq: Equal to\n          - ne: Not equal to\n          - ilike: Case-insensitive like\n          - like: Case-sensitive like\n          - startilike: Case-insensitive like at the start\n          - endilike: Case-insensitive like at the end\n          - startlike: Case-sensitive like at the start\n          - endlike: Case-sensitive like at the end\n        Logical operators:\n          - a: AND\n          - o: OR\n        Examples:\n          - assetRef.ilike:E62\n            Returns all assets with assetRef like E62\n          - createdAt.gte:2021-01-01\n            Returns all assets created after 2021-01-01\n          - status.eqo:PENDING,status.eqo:APPROVED\n            Returns all assets with status either PENDING OR APPROVED\n          - name.startilike:John\n            Returns all assets with name starting with John\n          - age.gtea:30,age.lt:40\n            Returns all assets with age greater than or equal to 30 and less than 40"
        example: assetRef.ilike:E62,createdAt.gte:2021-01-01
        schema:
          type: string
      - name: id
        required: true
        in: path
        schema:
          type: number
      responses:
        '200':
          description: Frame retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ClientFrameEntityDto'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '404':
          description: Frame not found
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      tags:
      - Frames
    patch:
      operationId: FramesController_patchFrame
      summary: Patch a frame by ID
      parameters:
      - name: id
        required: true
        in: path
        schema:
          type: number
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchFrameDto_2'
      responses:
        '200':
          description: Frame patched successfully
          content:
            application/json:
              schema:
                type: number
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponseDto'
      tags:
      - Frames
    servers:
    - url: https://dashboard.streetmetrics.io/v3/public/
components:
  schemas:
    ClientFrameEntityDto:
      type: object
      properties:
        frameId:
          type: number
          description: Unique identifier for the frame entity
        frameRef:
          type: string
          description: Reference for the frame
        frameWidth:
          type: number
          description: Width of the frame
        frameHeight:
          type: number
          description: Height of the frame
        frameElevation:
          type: number
          description: Elevation of the frame
        frameType:
          type: string
          description: Type of the frame
        expositionAngle:
          type: number
          description: Exposition angle of the frame
        expositionWidth:
          type: number
          description: Exposition width of the frame
        market:
          type:
          - object
          - 'null'
          description: Market information for the frame
      required:
      - frameId
      - frameRef
      - frameWidth
      - frameHeight
      - frameElevation
      - frameType
      - expositionAngle
      - expositionWidth
      - market
    CreateFrameDto:
      type: object
      properties:
        frameRef:
          type: string
          description: Unique reference for the frame
        frameType:
          type: string
          enum:
          - digital
          - static
          description: Type of frame
        frameMedia:
          type: string
          enum:
          - bulletin
          - poster
          - place
          - junior poster
          - panel
          - display
          - wall
          - permanent bulletin
          - junior bulletin
          - spectacular
          - custom
          description: Media type of the frame
        frameWidth:
          type: number
          description: Width of the frame in specified metrics
        frameHeight:
          type: number
          description: Height of the frame in specified metrics
        frameElevation:
          type: number
          description: Elevation of the frame
        expositionAngle:
          description: Angle of exposition (cardinal direction or 0 to 360)
          oneOf:
          - type: string
            enum:
            - n
            - ne
            - e
            - se
            - s
            - sw
            - w
            - nw
          - type: number
            minimum: 0
            maximum: 360
        city:
          type: string
          description: City where the frame is located
        county:
          type: string
          description: County where the frame is located
        flipDuration:
          type: number
          description: Duration of flip for digital frames
        frameMetrics:
          type: string
          enum:
          - feet
          - meters
          description: Measurement unit
        frameName:
          type: string
          description: Display name for the frame
        frameOwner:
          type: string
          description: Owner of the frame
        geopathId:
          type: string
          description: Geopath ID if available
        neighborhood:
          type: string
          description: Neighborhood where frame is located
        postalCode:
          type: string
          description: Postal code of frame location
        primaryRead:
          type: string
          enum:
          - left
          - right
          - parallel
          - perpendicular
          - center
          description: Primary read type
        primaryRoad:
          type: string
          description: Primary road near the frame
        siteAddress:
          type: string
          description: Street address of the frame
        siteType:
          type: string
          enum:
          - freestanding
          - exterior wall
          - furniture
          - place
          description: Type of site
        siteLat:
          type: number
          description: Latitude of frame location
          minimum: -90
          maximum: 90
        siteLon:
          type: number
          description: Longitude of frame location
          minimum: -180
          maximum: 180
        siteName:
          type: string
          description: Name of the site
        siteRef:
          type: string
          description: Reference ID for the site
        stateProvince:
          type: string
          enum:
          - alabama
          - alaska
          - arizona
          - arkansas
          - california
          - colorado
          - connecticut
          - delaware
          - district of columbia
          - florida
          - georgia
          - hawaii
          - idaho
          - illinois
          - indiana
          - iowa
          - kansas
          - kentucky
          - louisiana
          - maine
          - maryland
          - massachusetts
          - michigan
          - minnesota
          - mississippi
          - missouri
          - montana
          - nebraska
          - nevada
          - new hampshire
          - new jersey
          - new mexico
          - new york
          - north carolina
          - north dakota
          - ohio
          - oklahoma
          - oregon
          - pennsylvania
          - rhode island
          - south carolina
          - south dakota
          - tennessee
          - texas
          - utah
          - vermont
          - virginia
          - washington
          - west virginia
          - wisconsin
          - wyoming
          description: State/Province
        totalSlots:
          type: number
          description: Total number of slots
        illuminationStart:
          type: string
          description: Time when illumination starts (HH:mm)
        illuminationEnd:
          type: string
          description: Time when illumination ends (HH:mm)
        mediaCustom:
          type: string
          description: Custom media information
        expositionWidth:
          type:
          - number
          - 'null'
          description: Width of exposition
        polygon:
          type: string
          description: WKT polygon string representing the frame area
        inventoryType:
          type: string
          enum:
          - Billboards
          - Street Level
          - Place-Based
          - Rail/Subway Station
          description: Inventory type
        inventorySubtype:
          type: string
          description: Inventory subtype (single value; stored as a one-element array)
        ownerInventorySubtype:
          type: string
          description: Owner inventory subtype
        inventoryClass:
          type: string
          enum:
          - Place-Based
          - Transit
          - Stationary
          description: Inventory class (auto-set to Place-Based for place media)
        marketId:
          type: number
          description: Manually-set market ID; overrides the geojson market lookup when the site falls outside any market polygon
      required:
      - frameRef
      - frameType
      - frameMedia
      - frameWidth
      - frameHeight
      - expositionAngle
      - city
      - frameMetrics
      - frameOwner
      - postalCode
      - siteType
      - siteLat
      - siteLon
      - stateProvince
    PatchFrameDto:
      type: object
      properties:
        frameRef:
          type: string
          description: Unique reference for the frame
        frameType:
          type: string
          enum:
          - digital
          - static
          description: Type of frame
        frameMedia:
          type: string
          enum:
          - bulletin
          - poster
          - place
          - junior poster
          - panel
          - display
          - wall
          - permanent bulletin
          - junior bulletin
          - spectacular
          - custom
          description: Media type of the frame
        frameWidth:
          type: number
          description: Width of the frame in specified metrics
        frameHeight:
          type: number
          description: Height of the frame in specified metrics
        frameElevation:
          type: number
          description: Elevation of the frame
        expositionAngle:
          description: Angle of exposition (cardinal direction or 0 to 360)
          oneOf:
          - type: string
            enum:
            - n
            - ne
            - e
            - se
            - s
            - sw
            - w
            - nw
          - type: number
            minimum: 0
            maximum: 360
        city:
          type: string
          description: City where the frame is located
        county:
          type: string
          description: County where the frame is located
        flipDuration:
          type: number
          description: Duration of flip for digital frames
        frameMetrics:
          type: string
          enum:
          - feet
          - meters
          description: Measurement unit
        frameName:
          type: string
          description: Display name for the frame
        frameOwner:
          type: string
          description: Owner of the frame
        geopathId:
          type: string
          description: Geopath ID if available
        neighborhood:
          type: string
          description: Neighborhood where frame is located
        postalCode:
          type: string
          description: Postal code of frame location
        primaryRead:
          type: string
          enum:
          - left
          - right
          - parallel
          - perpendicular
          - center
          description: Primary read type
        primaryRoad:
          type: string
          description: Primary road near the frame
        siteAddress:
          type: string
          description: Street address of the frame
        siteType:
          type: string
          enum:
          - freestanding
          - exterior wall
          - furniture
          - place
          description: Type of site
        siteLat:
          type: number
          description: Latitude of frame location
          minimum: -90
          maximum: 90
        siteLon:
          type: number
          description: Longitude of frame location
          minimum: -180
          maximum: 180
        siteName:
          type: string
          description: Name of the site
        siteRef:
          type: string
          description: Reference ID for the site
        stateProvince:
          type: string
          enum:
          - alabama
          - alaska
          - arizona
          - arkansas
          - california
          - colorado
          - connecticut
          - delaware
          - district of columbia
          - florida
          - georgia
          - hawaii
          - idaho
          - illinois
          - indiana
          - iowa
          - kansas
          - kentucky
          - louisiana
          - maine
          - maryland
          - massachusetts
          - michigan
          - minnesot

# --- truncated at 32 KB (45 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/streetmetrics/refs/heads/main/openapi/streetmetrics-frames-api-openapi.yml