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.

OpenAPI Specification

afero-ota-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Afero Cloud OTA Firmware 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
externalDocs:
  description: Afero Developer Docs
  url: https://afero-docs.readthedocs.io/en/latest/
servers:
- url: https://api.afero.io
  description: Afero Cloud API production base URL
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:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'The OAuth 2.0 access token returned by POST /oauth/token, sent as `Authorization:
        Bearer <access_token>`. Tokens expire (approximately four hours per the Afero docs).'
  schemas:
    FirmwareAssociation:
      type: object
      properties:
        name:
          type: string
        partnerId:
          type: string
        email:
          type: string
        deviceTypeId:
          type: string
        deviceTypeName:
          type: string
        firmwareImageId:
          type: string
          description: An integer represented as a string; these values may exceed 53-bit precision.
    FirmwareTypeCreate:
      type: object
      required:
      - name
      - type
      properties:
        name:
          type: string
        description:
          type: string
        type:
          type: integer
          description: Platform firmware types 1-100; MCU firmware types 101-200.
    Error:
      type: object
      description: The Afero Cloud API error envelope, observed live on api.afero.io (2026-08-02).
      properties:
        timestamp:
          type: integ

# --- 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
Where this information came from

This is an independent, third-party profile of Afero Cloud OTA Firmware API, published by API Evangelist. We do not operate, host, resell, or support these APIs, and we are not affiliated with or endorsed by the company unless stated above. Everything here is built from publicly available information — the company's own site, developer portal, documentation, public repositories, and the specifications it publishes for public use. Nothing is obtained by breaching a system, defeating an access control, or using credentials.

The Kin Score and Agent Readiness rating are independently calculated assessments of a company's public API artifacts, scored against a published rubric. They are not certifications, endorsements, security assessments, or audits.

Corrections, re-scores, and removal are free — no partnership or purchase required, and you do not need to justify the request. A removed company is recorded as unrated, never scored zero for having asked. Acknowledgement within one business day; removal within two.

info@apievangelist.com · Read the full data-sourcing policy →
On a security or compliance team? Put security in the subject line and you will get a person, not a form — we will tell you exactly which public URLs this profile was built from.