Cumulocity Device Bootstrap API

Zero-touch device onboarding flow. A factory-bootstrapped device authenticates with a shared bootstrap user, polls /devicecontrol/deviceCredentials with its external ID, and receives back tenant-scoped credentials once an admin accepts the registration request in the Device Management UI.

OpenAPI Specification

cumulocity-device-bootstrap-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Cumulocity Device Bootstrap API
  version: 10.20.0
  description: |
    Zero-touch device onboarding flow. A factory-bootstrapped device authenticates with a shared bootstrap
    user, polls /devicecontrol/deviceCredentials with its external ID, and receives back tenant-scoped
    credentials once an admin accepts the registration request in the Device Management UI.
servers:
- url: https://{tenant}.cumulocity.com
  variables:
    tenant:
      default: example
security:
- bootstrapAuth: []
- basicAuth: []
tags:
- name: Device Credentials
- name: New Device Requests
paths:
  /devicecontrol/deviceCredentials:
    post:
      tags: [Device Credentials]
      summary: Request Device Credentials
      operationId: requestDeviceCredentials
      description: Called by an unprovisioned device (authenticated as bootstrap user) to poll for credentials.
      requestBody:
        required: true
        content:
          application/vnd.com.nsn.cumulocity.deviceCredentials+json:
            schema:
              $ref: '#/components/schemas/DeviceCredentialsRequest'
      responses:
        '201':
          description: Credentials issued (device registration was accepted).
          content:
            application/vnd.com.nsn.cumulocity.deviceCredentials+json:
              schema:
                $ref: '#/components/schemas/DeviceCredentials'
        '404':
          description: No accepted registration yet — device should retry.
  /devicecontrol/newDeviceRequests:
    get:
      tags: [New Device Requests]
      summary: List New Device Requests
      operationId: listNewDeviceRequests
      responses:
        '200':
          description: A collection of pending registration requests.
    post:
      tags: [New Device Requests]
      summary: Create a New Device Request
      operationId: createNewDeviceRequest
      requestBody:
        required: true
        content:
          application/vnd.com.nsn.cumulocity.newDeviceRequest+json:
            schema:
              $ref: '#/components/schemas/NewDeviceRequest'
      responses:
        '201':
          description: Registration request created.
  /devicecontrol/newDeviceRequests/{id}:
    parameters:
    - name: id
      in: path
      required: true
      schema: {type: string}
    get:
      tags: [New Device Requests]
      summary: Retrieve a New Device Request
      operationId: getNewDeviceRequest
      responses:
        '200':
          description: A single registration request.
    put:
      tags: [New Device Requests]
      summary: Accept or Reject a New Device Request
      operationId: updateNewDeviceRequest
      requestBody:
        required: true
        content:
          application/vnd.com.nsn.cumulocity.newDeviceRequest+json:
            schema:
              $ref: '#/components/schemas/NewDeviceRequest'
      responses:
        '200':
          description: Registration request updated.
    delete:
      tags: [New Device Requests]
      summary: Delete a New Device Request
      operationId: deleteNewDeviceRequest
      responses:
        '204':
          description: Registration request deleted.
components:
  securitySchemes:
    basicAuth:
      type: http
      scheme: basic
    bootstrapAuth:
      type: http
      scheme: basic
      description: HTTP Basic with the tenant-wide bootstrap user (devicebootstrap).
  schemas:
    DeviceCredentialsRequest:
      type: object
      required: [id]
      properties:
        id: {type: string, description: External ID of the device.}
    DeviceCredentials:
      type: object
      properties:
        id: {type: string}
        tenantId: {type: string}
        username: {type: string}
        password: {type: string}
        self: {type: string, format: uri}
    NewDeviceRequest:
      type: object
      properties:
        id: {type: string}
        status:
          type: string
          enum: [WAITING_FOR_CONNECTION, PENDING_ACCEPTANCE, ACCEPTED]
        self: {type: string, format: uri}
        creationTime: {type: string, format: date-time}