# receiveDutyChangeWebhook

Receive duty rate change webhook notifications.

`POST /nomenclature/webhook/duty-changes`

**API:** Avalara Item Classification API
**Tag:** NomenclatureChangeWebhook
**API Version:** 16.0.1-oas3
**Base URL:** https://api-sandbox.classification.avalara.net
**Authentication:** Basic (username + license key) or Bearer token

Source: https://developer.avalara.com/products/item-classification/api/methods/NomenclatureChangeWebhook/receiveDutyChangeWebhook/

## Description

This endpoint receives duty rate changes. The payload uses a flat envelope, where each change is based on the HS code and rate, and does not include catalog items. It carries duty fields with the rate expressed as nested previous and current objects. Return an HTTP 2xx response to acknowledge receipt. Avalara does not retry 4xx responses, but retries 5xx responses and timeouts.

## Request Body

**Content-Type:** `application/json`
**Schema:** `DutyChangeNotification`

Defines the duty rate notification. The payload uses a flat `changes[]` envelope where each change is based on the HS code and rate and does not include catalog items. The rate is expressed as nested `previous` and `current` objects.

| Property | Type | Required | Description |
|---|---|---|---|
| `notificationId` | string | **Yes** | Provides the unique identifier for this notification. |
| `timestamp` | string | **Yes** | Provides the date and time the notification was sent, in ISO-8601 UTC format. |
| `detectedAt` | string | No | Provides the date and time when the underlying changes were detected, in ISO-8601 UTC format. This field is omitted when the detection time is unknown. |
| `customerId` | integer | **Yes** | Identifies the Avalara customer account associated with this notification. |
| `totalChanges` | integer | **Yes** | Provides the total number of duty rate changes included in this notification. |
| `changesByType` | object | No | Provides the count of changes grouped by `eventType`. |
| `changes` | DutyChange[] | **Yes** | Lists the duty rate changes included in this notification. |

## Responses

| Status | Description | Schema |
|---|---|---|
| 200 | Indicates that the notification was received and acknowledged. |  |
| 201 | Indicates that the notification was received and processed. |  |
| 202 | Indicates that the notification was accepted for asynchronous processing. |  |
| 204 | Indicates that the notification was acknowledged and returns no content. |  |
| 400 | Indicates a bad request where the payload was rejected by the client. Avalara does not retry this request. |  |

## Example Request

```bash
curl -X POST "https://api-sandbox.classification.avalara.net/nomenclature/webhook/duty-changes" \
  -H "Authorization: Basic <credentials>" \
  -H "Accept: application/json" \
  -d '{
  "notificationId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
  "timestamp": "2026-06-22T10:30:00Z",
  "detectedAt": "2026-06-22T09:15:42Z",
  "customerId": 123,
  "totalChanges": 2,
  "changesByType": {
    "DUTY_RATE_CHANGE": 1,
    "FTA_UPDATE": 1
  },
  "changes": [
    {
      "hsCode": "8517130000",
      "eventType": "DUTY_RATE_CHANGE",
      "tariffSystemCode": "EU",
      "effectiveCountries": [
        "DE",
        "FR",
        "IT"
      ],
      "rateLabel": "Third country duty",
      "previous": {
        "rateValue": 4.5,
        "unitOfCalculationCode": "PERCENT"
      },
      "current": {
        "rateValue": 3.7,
        "unitOfCalculationCode": "PERCENT"
      },
      "effectiveFrom": "2026-07-01T00:00:00Z"
    },
    {
      "hsCode": "6109100010",
      "eventType": "FTA_UPDATE",
      "tariffSystemCode": "EU",
      "effectiveCountries": [
        "DE"
      ],
      "rateLabel": "Preferential duty (CETA)",
      "tradeGroupName": "EU-Canada CETA",
      "current": {
        "rateValue": 0,
        "unitOfCalculationCode": "PERCENT"
      },
      "effectiveFrom": "2026-07-01T00:00:00Z"
    }
  ]
}'
```