> This page is for Home.

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.emnify.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.emnify.com/_mcp/server.

> Policy management events in the emnify platform, such as changes to a service policy or a coverage policy

| ID | Description                                           |
| :- | :---------------------------------------------------- |
| 82 | [Service policy modified](#service-policy-modified)   |
| 88 | [Coverage policy modified](#coverage-policy-modified) |

> **API reference**
>
> What changed is in the event's [detail object](/developers/reference/events#detail-object).

### Service policy modified

A [service policy](/portal/device-policies#service-policies) was modified in the emnify Portal or through the emnify REST API.
Use this event to review changes that can affect your bill, such as a new data limit or an enabled service, when they happen.

The platform generates one event for each successful request that changes a service policy.
A request that fails, or that doesn't change anything, doesn't generate an event.
If you turn a setting on and then off again, you get two events.

The event is about the service policy, not about a device, so it contains no `endpoint`, `sim`, or `imsi` properties.
The `user` property identifies who made the change.
For a change made with an application token, `name` is the name of the token, and `username` starts with `app-token-`.

The event source is **API** (ID `2`), and the severity is **Warn** (ID `1`).

> **Note**
>
> For settings changes, the event contains the new values, not the previous ones.
> To see what a setting was before, look at the earlier events for the same service policy.

The `detail` object of a service policy modified event contains the following properties:

| Property          | Type   | Description                                                                                                  |
| :---------------- | :----- | :----------------------------------------------------------------------------------------------------------- |
| `service_profile` | Object | The service policy that was modified: `id` (Integer) and `name` (String).                                    |
| `category`        | String | The kind of change. One of `attributes`, `service_assignments`, `limits`, or `firewall_profile_assignments`. |
| `changed_data`    | Object | What the request changed. Its content depends on the `category`.                                             |

#### Settings changes

When `category` is `attributes`, a setting of the service policy itself changed.
For example, its name, the allowed radio access technologies, the SMS interface, the breakout region, or the device-to-device (D2D) mode.

`changed_data` only contains the settings that changed, with their new values:

* Boolean settings, such as `allowed_4g` or `apply_data_quota`, are `true` or `false`.
  Turning IP or DNS firewall enforcement on or off shows up as `ip_firewall_rule_set_enforced` or `dns_firewall_rule_set_enforced`.
* `name` is a string.
* `description` is an object with a `value` property, for example `{"value": "Trucks in Germany"}`.
* References to other objects, such as `api_callback`, `api_secret`, `esme_interface_type`, `dns`, and `breakout_region`, are objects with an `id` property, for example `{"id": 3}`.
* `dns_firewall_rule_set_mode` is `allowlist` or `blocklist`, and `d2d_mode` is `disabled`, `enabled`, or `forward_to_backend`.

A `null` value inside the object means the setting was cleared, for example `{"id": null}` when the API callback was removed.
If you clear the description in the emnify Portal, the event shows an empty string, `{"value": ""}`.

For what each setting does, see the [service profile object](/developers/reference/service-profile#service-profile-object).
For the D2D modes, see [Enable device-to-device communication](/portal/how-tos/enable-device-to-device-communication).
`dns_firewall_rule_set_mode` sets whether the assigned [DNS firewall](/services/security#dns-firewall) profiles work as an allowlist or a blocklist.

#### Service, limit, and firewall profile changes

For the other categories, `changed_data` contains an `added` list and a `removed` list.
Both lists are always present, and one of them can be empty.
A removed item keeps its values, so you can see what was removed.

| Category                       | Changes                                                         | Properties of each item                                                                                                                                                                                                                                                  |
| :----------------------------- | :-------------------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `service_assignments`          | A service was turned on or off for the service policy.          | `service_id`: `38` for data, `6` for SMS inbound, or `32` for SMS outbound.                                                                                                                                                                                              |
| `limits`                       | A data limit or an SMS limit was added, replaced, or removed.   | `service_id`, `limit_id`, `volume`, `period_id`, `warning_percent`, and `satellite_only`. `volume` is in bytes for data limits and in SMS for SMS limits. `period_id` is `1` for daily and `2` for monthly. `warning_percent` is left out when no warning is configured. |
| `firewall_profile_assignments` | An IP firewall or DNS firewall profile was assigned or removed. | `firewall_type` (`ip` or `dns`) and `firewall_profile_id`.                                                                                                                                                                                                               |

When a request replaces an SMS limit, the old limit is in `removed` and the new one is in `added`, in the same event.

#### Example JSON response: description changed

```json maxLines=10
{
  "timestamp": "2026-11-01T21:40:29.000Z",
  "alert": false,
  "description": "Service policy 'Fleet EU': description changed to 'Trucks in Germany'.",
  "id": 2729804254740486,
  "event_type": {
    "id": 82,
    "description": "Service policy modified"
  },
  "event_source": {
    "id": 2,
    "description": "API"
  },
  "event_severity": {
    "id": 1,
    "description": "Warn"
  },
  "organisation": {
    "id": 14543,
    "name": "Sample Corp"
  },
  "user": {
    "id": 676919,
    "name": "Sample User",
    "username": "user@sample.com"
  },
  "detail": {
    "service_profile": {
      "id": 1440022,
      "name": "Fleet EU"
    },
    "category": "attributes",
    "changed_data": {
      "description": {
        "value": "Trucks in Germany"
      }
    }
  }
}
```

#### Example JSON response: data limit added

```json maxLines=10
{
  "timestamp": "2026-11-01T21:45:10.000Z",
  "alert": false,
  "description": "Service policy 'Fleet EU': monthly data limit of 1 GB added (warning at 80%).",
  "id": 2729805548863511,
  "event_type": {
    "id": 82,
    "description": "Service policy modified"
  },
  "event_source": {
    "id": 2,
    "description": "API"
  },
  "event_severity": {
    "id": 1,
    "description": "Warn"
  },
  "organisation": {
    "id": 14543,
    "name": "Sample Corp"
  },
  "user": {
    "id": 676919,
    "name": "Sample User",
    "username": "user@sample.com"
  },
  "detail": {
    "service_profile": {
      "id": 1440022,
      "name": "Fleet EU"
    },
    "category": "limits",
    "changed_data": {
      "added": [
        {
          "service_id": 38,
          "limit_id": 17,
          "volume": 1000000000,
          "period_id": 2,
          "warning_percent": 80,
          "satellite_only": false
        }
      ],
      "removed": []
    }
  }
}
```

### Coverage policy modified Pre-release \[#coverage-policy-modified]

A [coverage policy](/portal/device-policies#coverage-policies) was modified in the emnify Portal or through the emnify REST API.
Use this event to review changes that can affect your bill, such as a new data plan or an added coverage area, when they happen.

The platform generates an event for each successful request that changes a coverage policy.
A request that fails, or that doesn't change anything, doesn't generate an event.
If you block a network and then unblock it again, you get two events.

A request that changes the data plan also removes the policy's coverage areas, data allowances, and inclusive volume.
It generates one event for the new data plan, and one event each for the removed coverage areas and data allowances.
The removed inclusive volume is in the data plan event, as `{"id": null}`.

> **Note**
>
> Changes made with [Update tariff profile](/developers/api/tariff-profiles/tariff-profile-by-id-patch) (`PATCH /api/v1/tariff_profile/{tariff_profile_id}`), or with `PUT` or `DELETE /api/v1/tariff_profile/{tariff_profile_id}/inclusive_volume/{inclusive_volume_id}`, don't generate this event.

As with service policy modified events, the event contains no `endpoint`, `sim`, or `imsi` properties, and the `user` property identifies who made the change.
The event source is **API** (ID `2`), and the severity is **Warn** (ID `1`).
For settings changes, the event contains the new values, not the previous ones.

The `detail` object of a coverage policy modified event contains the following properties:

| Property         | Type   | Description                                                                                                            |
| :--------------- | :----- | :--------------------------------------------------------------------------------------------------------------------- |
| `tariff_profile` | Object | The coverage policy that was modified: `id` (Integer) and `name` (String).                                             |
| `category`       | String | The kind of change. One of `attributes`, `ratezone_selections`, `operator_blocklist`, or `data_allowance_assignments`. |
| `changed_data`   | Object | What the request changed. Its content depends on the `category`.                                                       |

#### Coverage policy settings changes

When `category` is `attributes`, a setting of the coverage policy itself changed.
`changed_data` only contains the settings that changed, with their new values:

* `name` is a string.
* `description` is an object with a `value` property, for example `{"value": "Trucks in Germany"}`.
* `tariff` is the data plan, an object with `id` and `name` properties, for example `{"id": 2, "name": "Regional Pro"}`.
* `inclusive_volume` is an object with an `id` property, for example `{"id": 4}`.

A `null` value inside the object means the setting was cleared, for example `{"value": null}` when the description was removed.

#### Coverage area, network, and data allowance changes

For the other categories, `changed_data` contains an `added` list and a `removed` list.
Both lists are always present, and one of them can be empty.

| Category                     | Changes                                                                               | Properties of each item                                                                                                                              |
| :--------------------------- | :------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ratezone_selections`        | A coverage area was turned on or off for the coverage policy.                         | `ratezone_id` and `ratezone_name`.                                                                                                                   |
| `operator_blocklist`         | A network, or a radio access technology (RAT) on a network, was blocked or unblocked. | `operator_id`, `operator_name`, `rat_type_id`, and `rat_type_name`. When the whole network is blocked, `rat_type_id` and `rat_type_name` are `null`. |
| `data_allowance_assignments` | A data allowance was assigned to or removed from the coverage policy.                 | `data_allowance_id` and `data_allowance_name`.                                                                                                       |

When a request replaces a data allowance or the blocked RATs of a network, the old items are in `removed` and the new ones are in `added`, in the same event.
Blocking 4G on a network also blocks LTE-M, so both RATs are in `added`.

For how to block networks and RATs, see [Block networks](/portal/how-tos/block-networks) and [Block radio access technologies (RATs)](/portal/how-tos/block-radio-access-technologies).

#### Example JSON response: data plan changed

```json maxLines=10
{
  "timestamp": "2026-11-02T09:12:45.000Z",
  "alert": false,
  "description": "Coverage policy 'Global IoT': tariff changed to 'Regional Pro'.",
  "id": 2730511984302217,
  "event_type": {
    "id": 88,
    "description": "Coverage policy modified"
  },
  "event_source": {
    "id": 2,
    "description": "API"
  },
  "event_severity": {
    "id": 1,
    "description": "Warn"
  },
  "organisation": {
    "id": 14543,
    "name": "Sample Corp"
  },
  "user": {
    "id": 676919,
    "name": "Sample User",
    "username": "user@sample.com"
  },
  "detail": {
    "tariff_profile": {
      "id": 212,
      "name": "Global IoT"
    },
    "category": "attributes",
    "changed_data": {
      "tariff": {
        "id": 2,
        "name": "Regional Pro"
      }
    }
  }
}
```

#### Example JSON response: network and RAT blocked

```json maxLines=10
{
  "timestamp": "2026-11-02T09:20:03.000Z",
  "alert": false,
  "description": "Coverage policy 'Global IoT': operator 'Telekom DE' blocked, 2G on operator 'Vodafone DE' blocked.",
  "id": 2730512438170754,
  "event_type": {
    "id": 88,
    "description": "Coverage policy modified"
  },
  "event_source": {
    "id": 2,
    "description": "API"
  },
  "event_severity": {
    "id": 1,
    "description": "Warn"
  },
  "organisation": {
    "id": 14543,
    "name": "Sample Corp"
  },
  "user": {
    "id": 676919,
    "name": "Sample User",
    "username": "user@sample.com"
  },
  "detail": {
    "tariff_profile": {
      "id": 212,
      "name": "Global IoT"
    },
    "category": "operator_blocklist",
    "changed_data": {
      "added": [
        {
          "operator_id": 5,
          "operator_name": "Telekom DE",
          "rat_type_id": null,
          "rat_type_name": null
        },
        {
          "operator_id": 7,
          "operator_name": "Vodafone DE",
          "rat_type_id": 2,
          "rat_type_name": "2G"
        }
      ],
      "removed": []
    }
  }
}
```