CybelAngel Partner API

The MSSP/reseller surface. Mirrors the ADM Inventory, Keywords and Workspaces operations but scoped to a client organization via an {organization_id} path parameter, so a partner can manage assets, threats and keywords across the client organizations it administers.

OpenAPI Specification

cybelangel-partner-openapi.yml Raw ↑
openapi: 3.1.0
info:
  version: 1.0.0
  title: References
  description: |-
    API for CybelAngel's Partners.
    Authentication uses standard [OAuth2 Bearer Tokens](https://tools.ietf.org/html/rfc6750).

    Here is a simple example of how to fetch such a token with curl:

    ```shell
    curl -X POST https://auth.cybelangel.com/oauth/token -H 'content-type: application/json -d '{"client_id": "client_id", "client_secret": "client_secret", "audience": "https://platform.cybelangel.com/", "grant_type": "client_credentials"}
    ```

    The received access token can then be used as a Bearer token to request our API.
  contact:
    email: support@cybelangel.com
  license:
    url: 'https://cybelangel.com/'
    name: Proprietary
servers:
  - url: 'https://api.cybelangel.com'
paths:
  '/v1/{organization_id}/inventory/assets':
    get:
      tags:
        - ADM Inventory
      summary: Get Organization Inventory Assets
      description: 'Get all inventory assets for one of your client organizations. Results are sorted by created_at (descending)<br/>and alphabetical order of value.<br/><br/>You can filter assets by either `values` or `ids` parameters, but not both at the same time.<br/><br/>**Recommendation**: Inventory data is refreshed every 8 hours.<br/>We recommend aligning the frequency of your queries with this update interval for optimal results and performance.<br/><br/>⚠️ **Asset Discovery and Monitoring module is required on the client organization.**'
      operationId: get-organization-inventory-assets
      parameters:
        - name: cursor
          in: query
          description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
          required: false
          schema:
            type: string
            title: Cursor
            description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
            minLength: 1
        - name: values
          in: query
          description: To get details for specific asset(s). Cannot be used together with 'ids' parameter.
          required: false
          schema:
            type: array
            title: Values
            description: To get details for specific asset(s). Cannot be used together with 'ids' parameter.
            items:
              type: string
              minLength: 1
        - name: ids
          in: query
          description: List of asset IDs (UUIDs). Cannot be used together with 'values' parameter.
          required: false
          schema:
            type: array
            title: Ids
            description: List of asset IDs (UUIDs). Cannot be used together with 'values' parameter.
            items:
              type: string
              format: uuid
        - name: status
          in: query
          description: '[Deprecated] Filter on the status on an asset (This query param will be removed on September 4 2026, use `asset_status` instead)'
          required: false
          deprecated: true
          schema:
            type: array
            title: Status
            description: '[Deprecated] Filter on the status on an asset (This query param will be removed on September 4 2026, use `asset_status` instead)'
            items:
              $ref: '#/components/schemas/PreviousAssetStatus'
            x-deprecated: true
        - name: asset_status
          in: query
          description: Filter on the status on an asset
          required: false
          schema:
            type: array
            title: Asset Status
            description: Filter on the status on an asset
            items:
              $ref: '#/components/schemas/AssetStatus'
        - name: first_seen_at_start_date
          in: query
          description: Filter assets based on when we detected the asset for the first time in our system (greater than this date)
          required: false
          schema:
            type: string
            title: First Seen At Start Date
            description: Filter assets based on when we detected the asset for the first time in our system (greater than this date)
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: first_seen_at_end_date
          in: query
          description: Filter assets based on when we detected the asset for the first time in our system (less than this date)
          required: false
          schema:
            type: string
            title: First Seen At End Date
            description: Filter assets based on when we detected the asset for the first time in our system (less than this date)
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: last_seen_at_start_date
          in: query
          description: Filter assets based on when we detected the asset for the last time in our system (greater than this date)
          required: false
          schema:
            type: string
            title: Last Seen At Start Date
            description: Filter assets based on when we detected the asset for the last time in our system (greater than this date)
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: last_seen_at_end_date
          in: query
          description: Filter assets based on when we detected the asset for the last time in our system (less than this date)
          required: false
          schema:
            type: string
            title: Last Seen At End Date
            description: Filter assets based on when we detected the asset for the last time in our system (less than this date)
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: type
          in: query
          description: Filter on the type of an asset
          required: false
          schema:
            $ref: '#/components/schemas/AssetType'
            title: Type
            description: Filter on the type of an asset
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAssetsResponseDTO'
                __errors__:
                  '#/%24defs/TranslationElementDTO': Keys TranslationElementDTO_2 through TranslationElementDTO_20 already taken.
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
  '/v1/{organization_id}/inventory/assets/hostnames':
    get:
      tags:
        - ADM Inventory
      summary: Get Organization Inventory Assets Hostnames
      description: 'Get hostnames associated with IP assets for one of your client organizations.<br/><br/>You can filter assets by either ''asset_values'' or ''asset_ids'' parameters, but not both at the same time.<br/><br/>**Recommendation**: Inventory data is refreshed every 8 hours.<br/>We recommend aligning the frequency of your queries with this update interval for optimal results and performance.<br/><br/>⚠️ **Asset Discovery and Monitoring module is required on the client organization.**'
      operationId: get-organization-inventory-assets-hostnames
      parameters:
        - name: cursor
          in: query
          description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
          required: false
          schema:
            type: string
            title: Cursor
            description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
            minLength: 1
        - name: asset_values
          in: query
          description: To get hostnames for specific asset(s). Cannot be used together with 'asset_ids' parameter.
          required: false
          schema:
            type: array
            title: Asset Values
            description: To get hostnames for specific asset(s). Cannot be used together with 'asset_ids' parameter.
            examples:
              - - 74.125.20.138
                - 17.253.144.10
            items:
              type: string
              minLength: 1
          examples:
            default:
              value:
                - 74.125.20.138
                - 17.253.144.10
        - name: asset_ids
          in: query
          description: List of asset IDs (UUIDs) to filter the results. Cannot be used together with 'asset_values' parameter.
          required: false
          schema:
            type: array
            title: Asset Ids
            description: List of asset IDs (UUIDs) to filter the results. Cannot be used together with 'asset_values' parameter.
            items:
              type: string
              format: uuid
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAssetsHostnamesResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
  '/v1/{organization_id}/inventory/assets/threats':
    get:
      tags:
        - ADM Inventory
      summary: Get Organization Inventory Threats with Asset info
      description: 'Get threats associated with assets for one of your client organizations. Threats are sorted by their first_seen field (descending), and returned by page of 50 items. If there are more elements, you can use the provided cursor to retrieve the next page as explained in [the how-to page](https://developers.cybelangel.com/docs/adm-inventory-api/7e88d945427a4-fetch-assets-details-from-adm-inventory#pagination).<br/><br/>**Recommendation**: Inventory data is refreshed every 8 hours.<br/>We recommend aligning the frequency of your queries with this update interval for optimal results and performance.<br/><br/>⚠️ **Asset Discovery and Monitoring module is required on the client organization.**'
      operationId: get-organization-inventory-threats-with-asset-info
      parameters:
        - name: cursor
          in: query
          description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
          required: false
          schema:
            type: string
            title: Cursor
            description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
            minLength: 1
        - name: asset_values
          in: query
          description: To get threats for specific asset(s). Cannot be used together with 'asset_ids' parameter.
          required: false
          schema:
            type: array
            title: Asset Values
            description: To get threats for specific asset(s). Cannot be used together with 'asset_ids' parameter.
            examples:
              - - 127.0.0.1
                - 192.168.0.1
            items:
              type: string
              minLength: 1
          examples:
            default:
              value:
                - 127.0.0.1
                - 192.168.0.1
        - name: asset_ids
          in: query
          description: List of asset IDs (UUIDs). Cannot be used together with 'asset_values' parameter.
          required: false
          schema:
            type: array
            title: Asset Ids
            description: List of asset IDs (UUIDs). Cannot be used together with 'asset_values' parameter.
            items:
              type: string
              format: uuid
        - name: severity
          in: query
          description: To get threats with specific severity
          required: false
          schema:
            type: array
            title: Severity
            description: To get threats with specific severity
            examples:
              - - 1
                - 2
            items:
              $ref: '#/components/schemas/ThreatSeverity'
          examples:
            default:
              value:
                - 1
                - 2
        - name: status
          in: query
          description: To get threats with specific status
          required: false
          schema:
            type: array
            title: Status
            description: To get threats with specific status
            examples:
              - - open
            items:
              $ref: '#/components/schemas/ThreatStatus'
          examples:
            default:
              value:
                - open
        - name: first_seen_start_date
          in: query
          description: 'Full datetime format with timezone (e.g., 2025-07-17T11:00:51Z)'
          required: false
          schema:
            type: string
            title: First Seen Start Date
            description: 'Full datetime format with timezone (e.g., 2025-07-17T11:00:51Z)'
            format: date-time
            examples:
              - '2025-07-17T11:00:51Z'
          examples:
            default:
              value: '2025-07-17T11:00:51Z'
        - name: first_seen_end_date
          in: query
          description: 'Full datetime format with timezone (e.g., 2025-07-18T11:00:51Z)'
          required: false
          schema:
            type: string
            title: First Seen End Date
            description: 'Full datetime format with timezone (e.g., 2025-07-18T11:00:51Z)'
            format: date-time
            examples:
              - '2025-07-18T11:00:51Z'
          examples:
            default:
              value: '2025-07-18T11:00:51Z'
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetThreatsWithAssetInfoResponseDTO'
                __errors__:
                  '#/%24defs/TranslationElementDTO': Keys TranslationElementDTO_2 through TranslationElementDTO_20 already taken.
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
  '/v1/{organization_id}/inventory/assets/status':
    put:
      tags:
        - ADM Inventory
      summary: Update Organization Inventory Assets Status
      description: 'Update the status of multiple assets for one of your client organizations.<br/><br/>You must provide either ''asset_values'' or ''asset_ids'', but not both.<br/><br/>⚠️ **Asset Discovery and Monitoring module is required on the client organization.**'
      operationId: put-organization-inventory-assets-status
      parameters:
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateAssetsStatusRequestBodyDTO'
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
        '409':
          description: Conflict
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ConflictError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
  '/v1/{organization_id}/inventory/assets/threats/status':
    put:
      tags:
        - ADM Inventory
      summary: Update Organization Inventory Assets Threats Status
      description: 'Update the status of multiple asset threats for one of your client organizations.<br/><br/>Each threat must identify its asset by either ''asset_value'' or ''asset_id'', but not both.<br/><br/>⚠️ **Asset Discovery and Monitoring module is required on the client organization.**'
      operationId: put-organization-inventory-assets-threats-status
      parameters:
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateAssetThreatStatusRequestBodyDTO'
      responses:
        '204':
          description: No Content
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_NotFoundError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
  '/v1/{organization_id}/keywords':
    get:
      tags:
        - Keywords
      summary: Get Organization Keywords
      description: Get all keywords for one of your client organizations. Results are sorted alphabetically by the keyword name.
      operationId: get-organization-keywords
      parameters:
        - name: ids
          in: query
          description: Filter keywords by ID. Accepts multiple values (`?ids=<uuid>&ids=<uuid>`).
          required: false
          schema:
            type: array
            title: Ids
            description: Filter keywords by ID. Accepts multiple values (`?ids=<uuid>&ids=<uuid>`).
            default: []
            items:
              type: string
              format: uuid
        - name: name
          in: query
          description: Filter keywords by name.
          required: false
          schema:
            type: string
            title: Name
            description: Filter keywords by name.
        - name: status
          in: query
          description: Filter keywords by status. Accepts multiple values (`?status=pending&status=active`).
          required: false
          schema:
            type: array
            title: Status
            description: Filter keywords by status. Accepts multiple values (`?status=pending&status=active`).
            default: []
            items:
              $ref: '#/components/schemas/KeywordStatus'
        - name: creation_start_date
          in: query
          description: Filter keywords created on or after this date.
          required: false
          schema:
            type: string
            title: Creation Start Date
            description: Filter keywords created on or after this date.
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: creation_end_date
          in: query
          description: Filter keywords created on or before this date.
          required: false
          schema:
            type: string
            title: Creation End Date
            description: Filter keywords created on or before this date.
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: last_modification_start_date
          in: query
          description: Filter keywords last modified on or after this date.
          required: false
          schema:
            type: string
            title: Last Modification Start Date
            description: Filter keywords last modified on or after this date.
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: last_modification_end_date
          in: query
          description: Filter keywords last modified on or before this date.
          required: false
          schema:
            type: string
            title: Last Modification End Date
            description: Filter keywords last modified on or before this date.
            format: date-time
            examples:
              - '2023-10-05T14:48:00.000Z'
          examples:
            default:
              value: '2023-10-05T14:48:00.000Z'
        - name: cursor
          in: query
          description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
          required: false
          schema:
            type: string
            title: Cursor
            description: 'Cursor returned by a previous call to this endpoint. If it is not set, you will get the first page.'
        - name: workspaces
          in: query
          description: Filter keywords by workspace. Accepts multiple values (`?workspaces=<uuid>&workspaces=<uuid>`).
          required: false
          schema:
            type: array
            title: Workspaces
            description: Filter keywords by workspace. Accepts multiple values (`?workspaces=<uuid>&workspaces=<uuid>`).
            default: []
            items:
              type: string
              format: uuid
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartnerKeywordListDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
    post:
      tags:
        - Keywords
      summary: Create Organization Keywords
      description: Create a batch of keywords for one of your client organizations. Maximum 10 keywords per request.<br/><br/>Keywords are created in "pending" status.
      operationId: create-organization-keywords
      parameters:
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PartnerCreateKeywordsBodyDTO'
      responses:
        '201':
          description: All the keywords were created successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartnerCreateKeywords201ResponseDTO'
        '207':
          description: One of more keywords failed to be created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PartnerCreateKeywords207ResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_ForbiddenAccessError_'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnknownError_'
      security:
        - jwt: []
      servers:
        - url: 'https://api.cybelangel.com'
    delete:
      tags:
        - Keywords
      summary: Delete Organization Keywords
      description: Delete a batch of keywords for one of your client organizations. Maximum 50 keywords per request.
      operationId: delete-organization-keywords
      parameters:
        - name: organization_id
          in: path
          description: ID of the organization to manage resources for
          required: true
          schema:
            type: string
            title: Organization Id
            description: ID of the organization to manage resources for
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DeleteKeywordBodyDTO'
      responses:
        '200':
          description: All the keywords were deleted successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteKeywords200ResponseDTO'
        '207':
          description: One or more keywords failed to be deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeleteKeywords207ResponseDTO'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_BadRequestError_'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/APIErrorResponse_UnauthorizedError_'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/s

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