AngelCam active-service API

Endpoints for managing your activated services and assigning them to cameras. A service must first be activated (purchased) for your account, then assigned to a specific camera before it takes effect on that camera. ## Service lifecycle 1. **Find a service code.** Browse [available services](#operation/services) to get the `code` of the service you want. 2. **Activate the service** by calling [`POST /billing/active-services/`](#operation/activate-service). Provide the service `code` and a billing `period` — `P1M` for monthly or `P1Y` for annual billing. 3. **Assign to a camera** by calling [`PUT /billing/active-services/{id}/usage/`](#operation/my-service-usage-update) with the `camera_id`. Set `camera_id` to `null` to unassign. 4. **Upgrade or downgrade** at any time via [`PUT /billing/active-services/{id}/`](#operation/my-service-update). A downgrade takes effect at the end of the current billing period by default. Set `force_downgrade: true` to apply it immediately with prorated credit. 5. **Cancel** via [`DELETE /billing/active-services/{id}/`](#operation/my-service-cancel).

Documentation

Specifications

Other Resources

OpenAPI Specification

angelcam-active-service-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  version: 2026.06.11
  title: Angelcam active-service API
  contact:
    email: support@angelcam.com
  x-logo:
    url: ./assets/logo-angelcam.svg
  description: 'Angelcam RESTful API — HTTPS only, JSON, all URLs require a trailing slash. See the [developer docs](/) for quickstart, authentication, and key concepts.

    '
servers:
- url: https://api.angelcam.com/v1
tags:
- name: active-service
  x-displayName: My services
  description: 'Endpoints for managing your activated services and assigning them to cameras.

    A service must first be activated (purchased) for your account, then assigned to a specific camera before it takes effect on that camera.


    ## Service lifecycle

    1. **Find a service code.** Browse [available services](#operation/services) to get the `code` of the service you want.

    2. **Activate the service** by calling [`POST /billing/active-services/`](#operation/activate-service). Provide the service `code` and a billing `period` — `P1M` for monthly or `P1Y` for annual billing.

    3. **Assign to a camera** by calling [`PUT /billing/active-services/{id}/usage/`](#operation/my-service-usage-update) with the `camera_id`. Set `camera_id` to `null` to unassign.

    4. **Upgrade or downgrade** at any time via [`PUT /billing/active-services/{id}/`](#operation/my-service-update). A downgrade takes effect at the end of the current billing period by default. Set `force_downgrade: true` to apply it immediately with prorated credit.

    5. **Cancel** via [`DELETE /billing/active-services/{id}/`](#operation/my-service-cancel).

    '
paths:
  /billing/active-services/:
    get:
      operationId: my-services
      summary: Retrieve list of my services
      tags:
      - active-service
      parameters:
      - name: type
        in: query
        required: false
        description: Filtering by service type
        schema:
          type: string
      security:
      - OAuth2:
        - active_services_access
      - PersonalAccessToken: []
      responses:
        '200':
          description: Returns list of my active services.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActiveServiceListResponse'
        '400':
          $ref: '#/components/responses/Error400InvalidParams'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
    post:
      operationId: activate-service
      summary: Activate new service
      tags:
      - active-service
      description: 'Purchase and activate a new service for your account. After activation, [assign the service to a camera](#operation/my-service-usage-update) using the returned active service `id`.

        '
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - code
              - period
              properties:
                code:
                  type: string
                  description: Code of service, this code together with type is unique identifier of service
                  example: 3-days
                period:
                  type: string
                  format: duration
                  description: Billing period — `P1M` for monthly, `P1Y` for annual.
                  enum:
                  - P1M
                  - P1Y
              example:
                code: 3-days
                period: P1M
      security:
      - OAuth2:
        - active_services_manage
      - PersonalAccessToken: []
      responses:
        '201':
          description: Newly activated service
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActiveServiceObject'
        '400':
          $ref: '#/components/responses/Error400InvalidBody'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
  /billing/active-services/{active_service_id}/:
    get:
      operationId: my-service-detail
      summary: Retrieve my service detail
      tags:
      - active-service
      parameters:
      - $ref: '#/components/parameters/activeServiceId'
      security:
      - OAuth2:
        - active_services_access
      - PersonalAccessToken: []
      responses:
        '200':
          description: Returns detail of my active service.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActiveServiceObject'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
        '404':
          $ref: '#/components/responses/Error404NotFound'
    put:
      operationId: my-service-update
      summary: Change service
      tags:
      - active-service
      parameters:
      - $ref: '#/components/parameters/activeServiceId'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - code
              - period
              properties:
                code:
                  type: string
                  description: Code of service, this code together with type is unique identifier of service
                  example: 3-days
                period:
                  type: string
                  format: duration
                  enum:
                  - P1M
                  - P1Y
                force_downgrade:
                  type: boolean
                  default: false
                  description: 'If set to false, the downgrade occurs after the current period concludes. If set to true, the downgrade happens immediately, applying the prorated price of the current service towards the new service. Should the prorated price exceed the cost of the new service, the new service will be extended for a period that matches the full price value.

                    '
              example:
                code: 3days
                period: P1M
      security:
      - OAuth2:
        - active_services_manage
      - PersonalAccessToken: []
      responses:
        '201':
          description: Newly activated service
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActiveServiceObject'
        '400':
          $ref: '#/components/responses/Error400InvalidBody'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
        '404':
          $ref: '#/components/responses/Error404NotFound'
    delete:
      operationId: my-service-cancel
      summary: Cancel active service
      tags:
      - active-service
      parameters:
      - $ref: '#/components/parameters/activeServiceId'
      security:
      - OAuth2:
        - active_services_manage
      - PersonalAccessToken: []
      responses:
        '204':
          $ref: '#/components/responses/EmptyResponse'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
        '404':
          $ref: '#/components/responses/Error404NotFound'
  /billing/active-services/{active_service_id}/usage/:
    get:
      operationId: my-service-usage-detail
      summary: Retrieve my service usage detail
      tags:
      - active-service
      parameters:
      - $ref: '#/components/parameters/activeServiceId'
      security:
      - OAuth2:
        - active_services_access
      - PersonalAccessToken: []
      responses:
        '200':
          description: Returns detail of my active service usage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActiveServiceUsageObject'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
        '404':
          $ref: '#/components/responses/Error404NotFound'
    put:
      operationId: my-service-usage-update
      summary: Change service usage
      tags:
      - active-service
      description: 'Assign this active service to a camera, or unassign it by setting `camera_id` to `null`. A service must be assigned to a camera before it takes effect on that camera.

        '
      parameters:
      - $ref: '#/components/parameters/activeServiceId'
      requestBody:
        content:
          application/json:
            schema:
              type: object
              required:
              - camera_id
              properties:
                camera_id:
                  type: integer
                  description: ID of the camera to be used for the service, if null, the service will be unassigned
                  example: 3
                  nullable: true
              example:
                camera_id: 3
      security:
      - OAuth2:
        - active_services_manage
      - PersonalAccessToken: []
      responses:
        '200':
          description: Returns detail of my active service usage.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActiveServiceUsageObject'
        '400':
          $ref: '#/components/responses/Error400InvalidBody'
        '401':
          $ref: '#/components/responses/Error401Unauthorized'
        '403':
          $ref: '#/components/responses/Error403PermissionDenied'
        '404':
          $ref: '#/components/responses/Error404NotFound'
components:
  schemas:
    ErrorGeneric:
      type: object
      title: Error object
      properties:
        title:
          type: string
        detail:
          type: string
        status:
          type: integer
      required:
      - title
      - detail
      - status
    ActiveServiceListResponse:
      type: object
      title: Active service list
      properties:
        count:
          type: integer
          description: Count of all services
        next:
          format: uri
          description: Next page from pagination
          nullable: true
          type: string
        previous:
          format: uri
          description: Previous page from pagination
          nullable: true
          type: string
        results:
          type: array
          description: List of services available for user
          items:
            $ref: '#/components/schemas/ActiveServiceObject'
      required:
      - count
      - next
      - previous
      - results
    Error400InvalidParams:
      type: object
      title: Error 400 Invalid Parameters
      properties:
        title:
          type: string
        detail:
          type: object
        status:
          type: integer
      required:
      - title
      - detail
      - status
      example:
        title: invalid
        detail:
        - refresh_rate:
          - valid number is required.
          - Ensure this value is greater than 0.
        - max_width:
          - valid number is required.
          - Ensure this value is greater than or equal to 1.
        status: 400
    Error403PermissionDenied:
      allOf:
      - $ref: '#/components/schemas/ErrorGeneric'
      title: Error 403 Permission Denied
      example:
        title: permission_denied
        detail: You do not have permission to perform this action.
        status: 403
    Error404NotFound:
      allOf:
      - $ref: '#/components/schemas/ErrorGeneric'
      title: Error 404 Not Found
      example:
        title: not_found
        detail: Not Found
        status: 404
    ActiveServiceObject:
      type: object
      title: Service object
      properties:
        id:
          type: integer
        current_service:
          $ref: '#/components/schemas/ServiceObject'
          description: Current service
          nullable: true
        renew_service:
          $ref: '#/components/schemas/ServiceObject'
          description: Pending service (the service that will be activated at the next renewal)
          nullable: true
        renew_period:
          type: string
          format: duration
          example: P1M
          nullable: true
        valid_until:
          type: string
          format: datetime
        in_use:
          type: boolean
          description: Says if service is in use for example by a camera
        usage_detail:
          $ref: '#/components/schemas/UsageDetailObject'
      required:
      - id
      - current_service
      - renew_service
      - renew_period
      - valid_until
      - in_use
      - usage_detail
    ServiceObject:
      type: object
      title: Service object
      properties:
        type:
          type: string
          description: Type of service
          enum:
          - cloud-recording
          - broadcasting
          - timelapse
          - user-service
          - event-recording
          - live-view
          example: cloud-recording
        code:
          type: string
          description: Code of service, this code together with type is unique identifier of service
          example: 3-days
      required:
      - type
      - code
    Error401Unauthorized:
      allOf:
      - $ref: '#/components/schemas/ErrorGeneric'
      title: Error 401 Unauthorized
      example:
        title: not_authenticated
        detail: Authentication credentials were not provided
        status: 401
    UsageDetailObject:
      type: object
      title: Usage detail
      description: In case of camera service show info for what camera the service is used.
      properties:
        camera_id:
          type: integer
        camera_name:
          type: string
    ActiveServiceUsageObject:
      type: object
      title: Service object
      properties:
        id:
          type: integer
        in_use:
          type: boolean
          description: Says if service is in use for example by a camera
        usage_detail:
          $ref: '#/components/schemas/UsageDetailObject'
          nullable: true
      required:
      - id
      - in_use
      - usage_detail
  responses:
    EmptyResponse:
      description: Empty response.
    Error400InvalidBody:
      description: Body payload is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error400InvalidParams'
    Error403PermissionDenied:
      description: Missing permission.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error403PermissionDenied'
    Error404NotFound:
      description: The specified resource was not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error404NotFound'
    Error401Unauthorized:
      description: Missing or invalid authorization.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error401Unauthorized'
    Error400InvalidParams:
      description: Query params are invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error400InvalidParams'
  parameters:
    activeServiceId:
      name: active_service_id
      in: path
      required: true
      description: Active service ID
      example: 3
      schema:
        type: integer
        minimum: 1
  securitySchemes:
    OAuth2:
      type: oauth2
      description: 'See the Authentication section above for full documentation.

        '
      flows:
        authorizationCode:
          authorizationUrl: https://my.angelcam.com/oauth/authorize/
          tokenUrl: https://my.angelcam.com/oauth/token/
          scopes:
            user_access: Permission to access user information
            user_delete: Permission to delete the current user account
            camera_access: Permission to list cameras and to get details of a specific camera
            camera_create: Permission to create cameras
            camera_manage: Permission to update cameras
            camera_delete: Permission to delete cameras
            camera_guest_access: Permission to access camera guest
            camera_guest_manage: Permission to manage camera guest
            public_cameras_access: Permission to access public cameras
            arrow_client_access: Permission to access Arrow clients
            arrow_client_manage: Permission to manage Arrow clients
            event_access: Permission to access events
            recording_access: Permission to access camera recordings
            recording_start_stop: Permission to start and stop recording on camera
            recording_clips_access: Permission to access recording clips
            recording_clips_create: Permission to create recording clips
            recording_clips_share: Permission to share recording clips
            sensor_access: Permission to list sensors and to get details of a specific sensor
            sensor_manage: Permission to create, update and delete sensors
            broadcasting_access: Permission to see general broadcasting information and access broadcasting streams
            broadcasting_start_stop: Permission to start and stop public broadcasting on camera
            client_access: Permission to list resellers clients and get details of a specific client
            client_create: Permission to create client account
            client_manage: Permission to update clients detail
            streams_detect: Permission to detect camera streams
            sites_access: Permission to access sites
            sites_manage: Permission to create, update and delete sites
            services_access: Permission to access available services
            trials_access: Permission to access available trials
            trials_activate: Permission to activate a trial
            active_services_access: Permission to access active services
            active_services_manage: Permission to manage active services
            orders_access: Permission to access orders
            messages_access: Permission to access RTS messages
            messages_manage: Permission to manage RTS messages
            incidents_access: Permission to access Incidents
            space_access: Permission to list and activate spaces
            space_permissions_access: Permission to view space permissions
        password:
          tokenUrl: https://api.angelcam.com/oauth/token/
          scopes:
            user_access: Permission to access user information
            user_delete: Permission to delete the current user account
            camera_access: Permission to list cameras and to get details of a specific camera
            camera_create: Permission to create cameras
            camera_manage: Permission to update cameras
            camera_delete: Permission to delete cameras
            camera_guest_access: Permission to access camera guest
            camera_guest_manage: Permission to manage camera guest
            arrow_client_access: Permission to access Arrow clients
            arrow_client_manage: Permission to manage Arrow clients
            event_access: Permission to access events
            recording_access: Permission to access camera recordings
            recording_start_stop: Permission to start and stop recording on camera
            recording_clips_access: Permission to access recording clips
            recording_clips_create: Permission to create recording clips
            recording_clips_share: Permission to share recording clips
            sensor_access: Permission to list sensors and to get details of a specific sensor
            sensor_manage: Permission to create, update and delete sensors
            broadcasting_access: Permission to see general broadcasting information and access broadcasting streams
            broadcasting_start_stop: Permission to start and stop public broadcasting on camera
            client_access: Permission to list resellers clients and get details of a specific client
            client_create: Permission to create client account
            client_manage: Permission to update clients detail
            streams_detect: Permission to detect camera streams
            sites_access: Permission to access sites
            sites_manage: Permission to create, update and delete sites
            services_access: Permission to access available services
            trials_access: Permission to access available trials
            trials_activate: Permission to activate a trial
            active_services_access: Permission to access active services
            active_services_manage: Permission to manage active services
            orders_access: Permission to access orders
            messages_access: Permission to access RTS messages
            messages_manage: Permission to manage RTS messages
            rts_settings_access: Permission to access RTS settings
            rts_settings_manage: Permission to manage RTS settings
            rts_arming_manage: Permission to arm and disarm RTS
            incidents_access: Permission to access Incidents
            space_access: Permission to list and activate spaces
            space_permissions_access: Permission to view space permissions
    PersonalAccessToken:
      type: apiKey
      in: header
      name: Authorization
      description: 'Enter your token as: `PersonalAccessToken {your-token}`

        '
x-tagGroups:
- name: General
  tags:
  - user
  - space
  - location
- name: Camera management
  tags:
  - camera
  - shared-camera
  - camera-guest
  - camera-stream-detection
  - arrow-clients
  - angelcameras
- name: Recording
  tags:
  - recording
  - stream-controls
  - shared-camera-recording
  - clip
  - shared-camera-clip
- name: Broadcasting
  tags:
  - broadcasting
  - public-camera
- name: Events & Sensors
  tags:
  - event
  - sensor
- name: Speaker management
  tags:
  - speakers
  - audio-message
- name: RTS
  tags:
  - incidents
  - rts_settings
  - rts_messages
  - rts_notification_methods
  - rts_notification_rules
- name: Billing
  tags:
  - service
  - active-service
  - order
- name: Clients
  tags:
  - client