AMI digests

When devices are managed by an AMI controller, their individual events are buffered and compiled into periodic digest events. Instead of hundreds of mining.started and mining.stopped events, you get a single summary to keep you informed.

How digests work

Devices adopted by an AMI controller stop emitting events directly to your account stream. Instead, their events are buffered for their controller to process. On each AMI evaluation, the controller drains the buffer and emits a single digest event containing:

  • A report customised for the directive type (mining quanities, scan progress, transport volumes).
  • An activity summary: total event count, per-event-type counts, and the time window covered.
  • A devices list showing each device's current status, how many events it generated, and its last event type.

Digest frequency

By default, a digest is emitted every evaluation tick (roughly every 10 seconds when there is activity). For players with lots of AMI controllers, this can be slowed down via PATCH /v1/accounts/me by setting events.ami_digest_interval to a multiplier between 1 and 30. A value of 5 means a digest is emitted at most every 5 ticks. Events continue to buffer during the gap, so no data is lost; the next digest covers a longer window.

Stowed controllers

Digest events are not sent when the controller device has been stowed. The only activity stowed devices are available for is reconfiguration. When you redeploy a previously active controller, you may notice some older events appearing in the next digest. These are buffered events from before. This will happen if an active fleet is stowed between digest intervals and can mostly be ignored.

Digest event types

EventControllerReport contents
ami.mining.digestMining controllerResource levels: actual vs. desired vs. capacity, exhaustion and status per resource type.
ami.survey.digestSurvey controllerSurvey progress for the system scans and belt searching updates.
ami.transport.digestTransport controllerCargo collection and delivery status with shortfalls and total capacity.

Shared payload structure

All digest events share the same outer structure. The report object varies by controller type.

FieldTypeDescription
directivestringName of the active directive (e.g. deplete_smallest, survey_system).
reportobjectDirective-specific report data. See examples below.
activity.event_countintegerTotal buffered events since the last digest.
activity.countsobjectBreakdown by event name (e.g. mining.started: 8).
activity.window[string, string]ISO 8601 timestamps of the first and last buffered event.
devices[]arrayOne entry per managed device.
devices[].device_codestringDevice code.
devices[].statusstringCurrent device status label.
devices[].eventsintegerEvents this device generated in this digest window.
devices[].last_eventstringMost recent event name from this device.

Mining digest example

response ami.mining.digest
{
  "directive": "deplete_smallest",
  "activity": {
    "counts": {
      "mining.resource_depleted": 1,
      "mining.started": 1
    },
    "event_count": 2,
    "window": [
      "2026-07-16T12:48:49+01:00",
      "2026-07-16T12:48:59+01:00"
    ]
  },
  "devices": [
    {
      "device_code": "4EC618A9",
      "events": 2,
      "last_event": "mining.started",
      "status": "mining (conductive)"
    },
    {
      "device_code": "54EE8574",
      "status": "mining (carbon)"
    },
    {
      "device_code": "5E37E65A",
      "status": "mining (conductive)"
    }
  ],
  "report": {
    "location": "NUNKA-BELT-1",
    "resources": {
      "carbon": {
        "actual": 1,
        "capacity": 28,
        "desired": 1
      },
      "conductive": {
        "actual": 2,
        "capacity": 11,
        "desired": 2
      },
      "rares": {
        "actual": 0,
        "capacity": 0,
        "desired": 0,
        "exhausted": true
      },
      "silicates": {
        "actual": 0,
        "capacity": 11,
        "desired": 0
      },
      "structural": {
        "actual": 0,
        "capacity": 195,
        "desired": 0
      },
      "volatiles": {
        "actual": 0,
        "capacity": 0,
        "desired": 0,
        "exhausted": true
      }
    }
  }
}

In the resource report, actual and desired refer to the number of mining drones assigned to that resource type. capacity is the total amount of that resource available across all sites at the location. When a resource is fully depleted, exhausted is set to true.

Survey digest example

response ami.survey.digest
{
  "directive": "survey_system",
  "activity": {
    "counts": {
      "salvage.discovered": 1,
      "scan.completed": 3,
      "travel.departed": 3
    },
    "event_count": 7,
    "window": [
      "2026-07-16T12:58:01+01:00",
      "2026-07-16T12:58:19+01:00"
    ]
  },
  "devices": [
    {
      "device_code": "00AC58D1",
      "events": 2,
      "last_event": "travel.departed",
      "status": "travelling"
    },
    {
      "device_code": "0F20C3DC",
      "events": 2,
      "last_event": "travel.departed",
      "status": "travelling"
    },
    {
      "device_code": "73983EFE",
      "events": 3,
      "last_event": "travel.departed",
      "status": "travelling"
    }
  ],
  "report": {
    "assigned_this_tick": 3,
    "busy": 3,
    "idle": 0,
    "progress": {
      "remaining": 8,
      "scanned": 28,
      "total": 36
    }
  }
}

Transport digest examples

Ferry directive

response ami.transport.digest
{
  "directive": "ferry",
  "activity": {
    "counts": {
      "travel.departed": 1
    },
    "event_count": 1,
    "window": [
      "2026-07-16T09:09:41+01:00",
      "2026-07-16T09:09:41+01:00"
    ]
  },
  "devices": [
    {
      "device_code": "43B427DC",
      "events": 1,
      "last_event": "travel.departed",
      "status": "cruising"
    },
    {
      "device_code": "88E8E2BA",
      "status": "surging"
    },
    {
      "device_code": "FD4580C2",
      "status": "cruising"
    }
  ],
  "report": {
    "cargo_capacity": 60,
    "cargo_carried": 20,
    "collect": "ULKURUD-1",
    "deliver": "NUNKA-BELT-1",
    "fleet": {
      "delivering": 3,
      "loading": 0,
      "waiting": 0
    }
  }
}

Delivery directive

response ami.transport.digest
{
  "directive": "delivery",
  "activity": {
    "counts": {
      "transport.collected": 3,
      "travel.arrived": 3,
      "travel.departed": 3
    },
    "event_count": 9,
    "window": [
      "2026-07-16T13:06:22+01:00",
      "2026-07-16T13:06:38+01:00"
    ]
  },
  "devices": [
    {
      "device_code": "43B427DC",
      "events": 3,
      "last_event": "travel.departed",
      "status": "travelling"
    },
    {
      "device_code": "88E8E2BA",
      "events": 3,
      "last_event": "travel.departed",
      "status": "travelling"
    },
    {
      "device_code": "FD4580C2",
      "events": 3,
      "last_event": "travel.departed",
      "status": "travelling"
    }
  ],
  "report": {
    "cargo_capacity": 60,
    "cargo_carried": 50,
    "collect": "NUNKA-BELT-1",
    "deliver": "NUNKA-4",
    "fleet": {
      "delivering": 3,
      "loading": 0,
      "waiting": 0
    },
    "requirement": {
      "carbon": 150,
      "silicates": 200
    },
    "shortfalls": {
      "carbon": 23,
      "silicates": 27
    }
  }
}

Filtering

AMI digest events are never suppressed by mute patterns. They always appear in both the event logs and event stream, regardless of your filter configuration.