> ## Documentation Index
> Fetch the complete documentation index at: https://docs.events.intrace.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Bulk Upsert Assets

> Full replace of the monitored asset set

Replaces the full asset collection for the tenant or monitored portfolio in scope.

This mirrors the internal save-all pattern used by Intrace asset management.

## Request Body

```json theme={null}
{
  "assets": [
    {
      "asset_id": "lagos-hq",
      "type": "facility",
      "name": "Lagos HQ",
      "status": "active",
      "attributes": {
        "lat": 6.4541,
        "lng": 3.3947,
        "country": "NG",
        "monitoring_radius_km": 12
      }
    },
    {
      "asset_id": "abuja-residence-1",
      "type": "residence",
      "name": "Abuja Residence",
      "status": "active",
      "attributes": {
        "lat": 9.0765,
        "lng": 7.3986,
        "country": "NG",
        "monitoring_radius_km": 5
      }
    }
  ]
}
```

## Behavior

* assets present in the payload are created or updated
* assets omitted from the payload are removed from the current set


## OpenAPI

````yaml put /v1/assets
openapi: 3.1.0
info:
  title: Intrace Events Monitoring API
  version: 0.1.0
  description: >
    External asset monitoring and event intelligence API derived from the
    internal

    Intrace events investigations platform.


    This public API is tenant-scoped by API key and intentionally does not
    expose

    internal identifiers such as case_id or investigation_id.
servers:
  - url: https://api.intrace.ai
security:
  - ApiKeyAuth: []
tags:
  - name: Assets
  - name: Threats
  - name: Incidents
  - name: Alerts
  - name: Reports
  - name: Event Intelligence
paths:
  /v1/assets:
    put:
      tags:
        - Assets
      summary: Bulk upsert assets
      operationId: bulkUpsertAssets
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AssetBulkUpsertRequest'
      responses:
        '200':
          description: Asset set replaced.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AssetListResponse'
components:
  schemas:
    AssetBulkUpsertRequest:
      type: object
      properties:
        assets:
          type: array
          items:
            $ref: '#/components/schemas/AssetCreateRequest'
      required:
        - assets
    AssetListResponse:
      type: object
      properties:
        assets:
          type: array
          items:
            $ref: '#/components/schemas/Asset'
      required:
        - assets
    AssetCreateRequest:
      type: object
      properties:
        asset_id:
          type: string
        type:
          type: string
          enum:
            - facility
            - residence
        name:
          type: string
        role:
          type: string
        status:
          type: string
          default: active
        attributes:
          $ref: '#/components/schemas/AssetAttributes'
        threat_config:
          $ref: '#/components/schemas/ThreatConfig'
        physical_threat_config:
          $ref: '#/components/schemas/PhysicalThreatConfig'
      required:
        - asset_id
        - type
        - name
    Asset:
      type: object
      properties:
        id:
          type: string
          format: uuid
        asset_id:
          type: string
        type:
          type: string
        name:
          type: string
        role:
          type: string
          nullable: true
        status:
          type: string
        attributes:
          $ref: '#/components/schemas/AssetAttributes'
        threat_config:
          $ref: '#/components/schemas/ThreatConfig'
        physical_threat_config:
          $ref: '#/components/schemas/PhysicalThreatConfig'
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
        - id
        - asset_id
        - type
        - name
        - status
        - created_at
        - updated_at
    AssetAttributes:
      type: object
      additionalProperties: true
      properties:
        lat:
          type: number
        lng:
          type: number
        address:
          type: string
        country:
          type: string
        monitoring_radius_km:
          type: number
    ThreatConfig:
      type: object
      additionalProperties: false
      properties:
        enabled:
          type: boolean
          default: true
        alert_classes:
          type: array
          items:
            type: string
            enum:
              - class_1_situational_awareness
              - class_2_potential_threat
              - class_3_direct_threat
        custom_instructions:
          type: string
        monitored_event_types:
          type: array
          items:
            type: string
        lookback_days:
          type: integer
          minimum: 1
          maximum: 90
    PhysicalThreatConfig:
      type: object
      additionalProperties: false
      properties:
        enabled:
          type: boolean
          default: true
        alert_classes:
          type: array
          items:
            type: string
            enum:
              - class_1_situational_awareness
              - class_2_potential_threat
              - class_3_direct_threat
        custom_instructions:
          type: string
        monitored_event_types:
          type: array
          items:
            type: string
        max_age_hours_by_category:
          type: object
          additionalProperties:
            type: integer
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key

````