Afero Cloud OTA Firmware API

The Afero Over-the-Air (OTA) Update API lets a partner drive firmware releases from their own CI/CD pipeline instead of the OTA Manager web application. It creates and updates partner firmware types, creates firmware records in the partner firmware pool, uploads firmware binaries to a temporary location and moves them into the permanent repository, checks whether a name and version already exists, associates pool images with device types to make them OTA-eligible, lists and filters firmware images with tag filtering and paging, pushes an image to a specific device, dissociates an image from a device type, and lists firmware tags.

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/ota-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 email required.

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

OpenAPI Specification

afero-ota-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Afero Cloud Firmware OTA API
  version: v1
  description: 'The Afero Cloud API is the RESTful control plane for the Afero IoT platform: it lists the devices and users on an Afero account, reports real-time device state, executes attribute read/write actions against connected devices, and manages the over-the-air (OTA) firmware pipeline — firmware types, firmware pool images, binary upload, device-type associations, firmware tags, and firmware pushes. All requests are made over TLS to https://api.afero.io and are authenticated with an OAuth 2.0 bearer access token obtained from the /oauth/token endpoint using the partner OAuth Client ID and Client Secret issued in the Afero Profile Editor. This OpenAPI was DERIVED by API Evangelist from Afero''s public developer documentation (resource URLs, HTTP methods, request headers, request payload model schemas, response model schemas and examples transcribed verbatim from the docs); it is NOT a provider-published specification. Afero publishes no machine-readable spec: https://api.afero.io/api-docs and https://api.afero.io/v1/openapi.json both answer HTTP 401 (authenticated access required), probed 2026-08-02.'
  contact:
    name: Afero Developer Documentation
    url: https://afero-docs.readthedocs.io/en/latest/CloudAPIs/
    email: sales@afero.io
  license:
    name: Afero Developer Terms of Service
    url: https://cdn.afero.io/tos/developer/v1/developer.html
  x-apievangelist-derived-from: https://afero-docs.readthedocs.io/en/latest/CloudAPIs/
  x-apievangelist-derived-on: '2026-08-02'
  x-apievangelist-provider-published: false
  x-apievangelist-split-from: openapi/_original/afero-cloud-api-openapi.yml
servers:
- url: https://api.afero.io
  description: Afero Cloud API production base URL
security:
- bearerAuth: []
tags:
- name: OTA
  description: 'Over-the-air firmware management: firmware types, the firmware pool, binaries, device type associations, tags and pushes.'
  externalDocs:
    url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints/
paths:
  /v1/ota/partners/{partnerId}/types:
    post:
      operationId: createFirmwareType
      tags:
      - OTA
      summary: Create a partner firmware type
      description: Creates a new partner firmware type. Firmware types categorize firmware; platform firmware types occupy 1-100 and MCU firmware types 101-200.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FirmwareTypeCreate'
      responses:
        '201':
          description: The created firmware type.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FirmwareType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
    get:
      operationId: listFirmwareTypes
      tags:
      - OTA
      summary: Retrieve partner firmware types
      description: Retrieves the firmware types defined for the partner.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      responses:
        '200':
          description: The partner's firmware types.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FirmwareType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/types/{type}:
    get:
      operationId: getFirmwareType
      tags:
      - OTA
      summary: Retrieve a firmware type by type
      description: Retrieves the partner firmware type identified by the given type number.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      responses:
        '200':
          description: The firmware type.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FirmwareType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
    put:
      operationId: updateFirmwareType
      tags:
      - OTA
      summary: Update a partner firmware type
      description: Updates the name and description of a partner firmware type.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FirmwareTypeUpdate'
      responses:
        '204':
          description: The firmware type was updated.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/pool:
    post:
      operationId: createPoolFirmwareImage
      tags:
      - OTA
      summary: Create a firmware record in the firmware pool
      description: Creates a new firmware record in the partner firmware image pool. The optional `associations` map keys are partner IDs and its values are arrays of device type IDs; associations can be created or deleted at any time after the pool image exists.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PoolFirmwareImageCreate'
      responses:
        '201':
          description: The created pool firmware record.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FirmwareType'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
    get:
      operationId: listPoolFirmwareImages
      tags:
      - OTA
      summary: Retrieve firmware images from the pool
      description: Retrieves a paged result set of firmware images in the partner firmware pool.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: tags
        in: query
        description: Comma-separated list of tags on which to filter.
        schema:
          type: string
        required: false
      - name: page
        in: query
        description: Zero-based index of the page to retrieve.
        schema:
          type: integer
        required: false
      - name: size
        in: query
        description: The number of elements per page. Default page size is 50.
        schema:
          type: integer
        required: false
      - name: sort
        in: query
        description: The field and sort direction; e.g. `updatedTimestamp`, `description`.
        schema:
          type: string
        required: false
      responses:
        '200':
          description: A page of pool firmware images.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PoolFirmwareImagePage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/binaries:
    post:
      operationId: uploadFirmwareBinary
      tags:
      - OTA
      summary: Upload a firmware binary to a temporary location
      description: Uploads a firmware file to a temporary location, either as a raw file stream (`application/octet-stream`) or as a browser-style upload (`multipart/form-data`). The returned `value` is the file identifier of the uploaded file — the SHA-256 hash of the file.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/octet-stream:
            schema:
              type: string
              format: binary
          multipart/form-data:
            schema:
              type: object
              properties:
                file:
                  type: string
                  format: binary
      responses:
        '200':
          description: The temporary file identifier (SHA-256 of the file).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Value'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/binaries/moveToRepository:
    post:
      operationId: moveBinaryToRepository
      tags:
      - OTA
      summary: Move a binary into the firmware repository
      description: Moves an uploaded file from the temporary location into the permanent firmware image repository. Send the response body of uploadFirmwareBinary as the payload. The response `value` is the repository URL of the firmware binary, which must be used to update the firmware pool record — otherwise the OTA service cannot send updates.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Value'
      responses:
        '200':
          description: The repository URL of the firmware binary.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Value'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/pool/types/{type}:
    get:
      operationId: listPoolFirmwareImagesByType
      tags:
      - OTA
      summary: Retrieve pool firmware images of a type
      description: Retrieves a paged result set of pool firmware images of a specific firmware type.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: tags
        in: query
        description: Comma-separated list of tags on which to filter.
        schema:
          type: string
        required: false
      - name: page
        in: query
        description: Zero-based index of the page to retrieve.
        schema:
          type: integer
        required: false
      - name: size
        in: query
        description: The number of elements per page. Default page size is 50.
        schema:
          type: integer
        required: false
      - name: sort
        in: query
        description: The field and sort direction; e.g. `updatedTimestamp`, `description`.
        schema:
          type: string
        required: false
      responses:
        '200':
          description: A page of pool firmware images.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PoolFirmwareImagePage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/pool/types/{type}/names/{name}/versions/{version}/exists:
    get:
      operationId: poolFirmwareImageExists
      tags:
      - OTA
      summary: Check whether a pool firmware image exists
      description: Checks whether a firmware image with the given type, name and version string already exists in the pool. `excludeFirmwareImageId` lets a client exclude the record it is about to update.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: name
        in: path
        description: The name of the firmware image.
        schema:
          type: string
        required: true
      - name: version
        in: path
        description: The version string of the firmware image.
        schema:
          type: string
        required: true
      - name: excludeFirmwareImageId
        in: query
        description: The ID of a record to exclude from the check.
        schema:
          type: string
        required: false
      responses:
        '200':
          description: Whether a matching pool image exists.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BooleanValue'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/pool/types/{type}/versionNumbers/{versionNumber}/associations:
    get:
      operationId: listPoolFirmwareImageAssociations
      tags:
      - OTA
      summary: Retrieve device type associations of a pool firmware image
      description: Retrieves all device type associations of the given pool firmware image.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: versionNumber
        in: path
        description: The globally unique, platform-generated version number of the firmware image.
        schema:
          type: string
        required: true
      responses:
        '200':
          description: The device type associations.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FirmwareAssociation'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/pool/types/{type}/versionNumbers/{versionNumber}:
    put:
      operationId: updatePoolFirmwareImage
      tags:
      - OTA
      summary: Update a firmware image in the pool
      description: Updates the name, description, version string, binary URL and tags of a pool firmware image.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: versionNumber
        in: path
        description: The globally unique, platform-generated version number of the firmware image.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PoolFirmwareImageUpdate'
      responses:
        '204':
          description: The pool firmware image was updated.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/deviceTypes/{deviceTypeId}/firmwareImages:
    post:
      operationId: createDeviceTypeFirmwareImage
      tags:
      - OTA
      summary: Associate a firmware image with a device type
      description: Creates an association between a generic firmware image record in the firmware pool and a specific device type, so the image becomes eligible for OTA. `versionNumber` is required. Afero recommends sending the object returned by one of the firmware pool GET endpoints unmodified — modifying it causes errors and prevents OTAs from succeeding.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: deviceTypeId
        in: path
        description: The device type ID.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeviceTypeFirmwareImageCreate'
      responses:
        '201':
          description: The created device type firmware image.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceTypeFirmwareImage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
    get:
      operationId: listDeviceTypeFirmwareImages
      tags:
      - OTA
      summary: Retrieve firmware images associated with a device type
      description: Retrieves a paged result set of firmware image records associated with a device type. Records of type 4 (DEVICE_DESCRIPTION) carry the two additional fields `deviceDescriptionId` and `deviceProfileId`.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: deviceTypeId
        in: path
        description: The device type ID.
        schema:
          type: string
        required: true
      - name: tags
        in: query
        description: Comma-separated list of tags on which to filter.
        schema:
          type: string
        required: false
      - name: page
        in: query
        description: Zero-based index of the page to retrieve.
        schema:
          type: integer
        required: false
      - name: size
        in: query
        description: The number of elements per page. Default page size is 50.
        schema:
          type: integer
        required: false
      - name: sort
        in: query
        description: The field and sort direction; e.g. `updatedTimestamp`, `description`.
        schema:
          type: string
        required: false
      responses:
        '200':
          description: A page of device type firmware images.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceTypeFirmwareImagePage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/deviceTypes/{deviceTypeId}/firmwareImages/types/{type}:
    get:
      operationId: listDeviceTypeFirmwareImagesByType
      tags:
      - OTA
      summary: Retrieve device type firmware images by firmware type
      description: Retrieves a paged result set of firmware image records for a device type filtered to one firmware type.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: deviceTypeId
        in: path
        description: The device type ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: tags
        in: query
        description: Comma-separated list of tags on which to filter.
        schema:
          type: string
        required: false
      - name: page
        in: query
        description: Zero-based index of the page to retrieve.
        schema:
          type: integer
        required: false
      - name: size
        in: query
        description: The number of elements per page. Default page size is 50.
        schema:
          type: integer
        required: false
      - name: sort
        in: query
        description: The field and sort direction; e.g. `updatedTimestamp`, `description`.
        schema:
          type: string
        required: false
      responses:
        '200':
          description: A page of device type firmware images.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceTypeFirmwareImagePage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/deviceTypes/{deviceTypeId}/firmwareImages/types/{type}/versionNumbers/{versionNumber}:
    get:
      operationId: getDeviceTypeFirmwareImage
      tags:
      - OTA
      summary: Retrieve a device type firmware image by type and version number
      description: Retrieves the single firmware image record associated with a device type for the given firmware type and version number.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: deviceTypeId
        in: path
        description: The device type ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: versionNumber
        in: path
        description: The globally unique, platform-generated version number of the firmware image.
        schema:
          type: string
        required: true
      - name: page
        in: query
        description: Zero-based index of the page to retrieve.
        schema:
          type: integer
        required: false
      - name: size
        in: query
        description: The number of elements per page. Default page size is 50.
        schema:
          type: integer
        required: false
      - name: sort
        in: query
        description: The field and sort direction; e.g. `updatedTimestamp`, `description`.
        schema:
          type: string
        required: false
      responses:
        '200':
          description: The device type firmware image.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeviceTypeFirmwareImage'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
    delete:
      operationId: deleteDeviceTypeFirmwareImage
      tags:
      - OTA
      summary: Dissociate a firmware image from a device type
      description: 'Dissociates a firmware image from a device type. NOTE: the Afero docs page heading names this operation DELETE while the HTTP METHOD line on the same section reads PUT — the heading is used here and the discrepancy is recorded in the API Evangelist review.'
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: deviceTypeId
        in: path
        description: The device type ID.
        schema:
          type: string
        required: true
      - name: type
        in: path
        description: The firmware type. Platform firmware types are 1-100; MCU firmware types are 101-200.
        schema:
          type: integer
        required: true
      - name: versionNumber
        in: path
        description: The globally unique, platform-generated version number of the firmware image.
        schema:
          type: string
        required: true
      responses:
        '204':
          description: The firmware image was dissociated.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/deviceTypes/{deviceTypeId}/firmwareImages/{firmwareImageId}/push:
    put:
      operationId: pushFirmwareImageToDevice
      tags:
      - OTA
      summary: Push a firmware image to a device
      description: Pushes a firmware image to a target device. The payload `value` is the device ID of the target device.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      - name: deviceTypeId
        in: path
        description: The device type ID.
        schema:
          type: string
        required: true
      - name: firmwareImageId
        in: path
        description: The ID of the firmware image to push to a device.
        schema:
          type: string
        required: true
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Value'
      responses:
        '202':
          description: The firmware push was accepted.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
  /v1/ota/partners/{partnerId}/tags:
    get:
      operationId: listFirmwareTags
      tags:
      - OTA
      summary: Retrieve all firmware tags
      description: Retrieves all firmware tags defined for the partner.
      externalDocs:
        url: https://afero-docs.readthedocs.io/en/latest/API-OTAEndpoints-Funcs/
      parameters:
      - name: partnerId
        in: path
        description: The partner ID.
        schema:
          type: string
        required: true
      responses:
        '200':
          description: The partner's firmware tags.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
      security:
      - bearerAuth: []
components:
  schemas:
    FirmwareType:
      type: object
      properties:
        id:
          type: string
          description: An integer represented as a string; these values may exceed 53-bit precision.
        name:
          type: string
        description:
          type: string
        type:
          type: integer
        partnerId:
          type: string
        createdTimestamp:
          type: integer
        updatedTimestamp:
          type: integer
        versionAttributeId:
          type: integer
          description: The device attribute ID that reports this firmware type's version — the firmware type plus 2000.
    Value:
      type: object
      required:
      - value
      properties:
        value:
          type: string
    PoolFirmwareImageCreate:
      type: object
      required:
      - name
      - type
      - version
      - url
      properties:
        name:
          type: string
        description:
          type: string
        type:
          type: integer
        version:
          type: string
          description: The user-friendly version string.
        url:
          type: string
          description: The firmware repository URL of the binary.
        tags:
          type: array
          items:
            type: string
        associations:
          type: object
          description: Map of partner ID to an array of device type IDs.
          additionalProperties:
            type: array
            ite

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