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

# Duty Rate

> Look up the scheduled duty rate for a US tariff heading, or search the tariff schedule by keyword.

Look up lines of the US Harmonized Tariff Schedule with their scheduled rate: the general, special and column 2 (other) rates for a heading such as `7408.11`, or candidate lines for a keyword such as `copper wire`. Lines come in schedule order and keep their `indent`: for a heading lookup every line beneath it is returned, so a line sits under the nearest earlier line with a lower indent; a keyword search returns only the matching lines, without their ancestors, so there `indent` is depth only and says nothing about which heading a line belongs to. A heading has no rate of its own, its rates are on the indented lines below. This is the scheduled rate only: it does not add duties imposed by trade-remedy or emergency actions; footnotes are returned as the schedule gives them, each with the rate column(s) it qualifies, and additional-duties notes as given. It is a lookup, not a classification: it does not choose a code for a product, so a keyword search returns candidates for the caller to choose from. A keyword of several words matches lines containing any of them (`copper wire` returns copper ores as well as wire); wrap the words in double quotes to match the exact phrase (`"copper wire"`). Covers goods imported into the US. `total` is how many lines the schedule search matched, as the source counts them; `lines` is cut to `limit`. No match is a completed result with `total` 0.

## Authentication

Requires x402 payment in the `payment-signature` header.

## Request Body

<ParamField body="query" type="string" required>
  A tariff heading such as 7408.11, or a keyword such as copper wire. Several words match any of them; wrap them in double quotes for the exact phrase. 2 to 80 characters.
</ParamField>

<ParamField body="limit" type="integer">
  Most lines to return, in schedule order. Default 20. From 1 to 50. Defaults to `20`.
</ParamField>

<Snippet file="audit-context-params.mdx" />

## Response (200 OK)

Top-level envelope: `success` (boolean) and `data` (object). All fields below are nested under `data`.

<ResponseField name="data.request_id" type="string">
  Durable job ID for audit and lookup
</ResponseField>

<ResponseField name="data.status" type="string">
  Job status: `completed`
</ResponseField>

<ResponseField name="data.tool" type="string">
  Always `product_duty_rate`
</ResponseField>

<ResponseField name="data.result" type="object">
  The answer, described under Result below
</ResponseField>

<ResponseField name="data.evidence" type="object">
  Where the answer came from and when
</ResponseField>

<ResponseField name="data.evidence.source" type="string">
  The public body the data comes from. Always `US International Trade Commission`.
</ResponseField>

<ResponseField name="data.evidence.source_kind" type="string">
  `public` when the data comes from a public body, `commercial` otherwise
</ResponseField>

<ResponseField name="data.evidence.retrieved_at" type="string">
  When the lookup was made, as an ISO 8601 UTC time
</ResponseField>

<ResponseField name="data.evidence.as_of" type="string">
  When the source says the fact was last updated, or `null` when the source gives no date
</ResponseField>

## Result

Nested under `data.result`.

<ResponseField name="data.result.total" type="number">
  How many lines of the schedule the source matched, before the limit.
</ResponseField>

<ResponseField name="data.result.lines" type="object[]">
  Matching lines in schedule order, cut to the limit.
</ResponseField>

<ResponseField name="data.result.lines[].code" type="string">
  Tariff line number, such as 7408.11.30.00; a heading has fewer segments.
</ResponseField>

<ResponseField name="data.result.lines[].description" type="string">
  Description.
</ResponseField>

<ResponseField name="data.result.lines[].indent" type="number">
  Depth in the schedule tree. In a heading lookup a line sits beneath the nearest earlier line with a lower indent; in a keyword search the ancestors are absent, so indent is depth only.
</ResponseField>

<ResponseField name="data.result.lines[].general_rate" type="string">
  General (column 1) scheduled rate, as written; null on a heading.
</ResponseField>

<ResponseField name="data.result.lines[].special_rate" type="string">
  Special scheduled rate with its program codes, as written. `null` when the source gives no value.
</ResponseField>

<ResponseField name="data.result.lines[].other_rate" type="string">
  Column 2 scheduled rate, as written. `null` when the source gives no value.
</ResponseField>

<ResponseField name="data.result.lines[].units" type="string[]">
  Units of quantity reported for the line.
</ResponseField>

<ResponseField name="data.result.lines[].footnotes" type="object[]">
  Footnotes on the line, each with the rate column(s) it qualifies.
</ResponseField>

<ResponseField name="data.result.lines[].footnotes[].text" type="string">
  The footnote, as the schedule gives it.
</ResponseField>

<ResponseField name="data.result.lines[].footnotes[].columns" type="string[]">
  Which column(s) of the line it qualifies, as the schedule names them: general, special, other or units; empty when it names none.
</ResponseField>

<ResponseField name="data.result.lines[].additional_duties" type="string">
  Additional-duties note, as the schedule gives it. `null` when the source gives no value.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://win.oneshotagent.com/v1/tools/lookup/product-duty-rate \
    -H "Content-Type: application/json" \
    -H "payment-signature: <base64 x402 payment>" \
    -d '{
      "query": "7408.11",
      "limit": 2
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://win.oneshotagent.com/v1/tools/lookup/product-duty-rate", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "payment-signature": paymentProof,
    },
    body: JSON.stringify({
      "query": "7408.11",
      "limit": 2
    }),
  });
  ```

  ```typescript SDK theme={null}
  const result = await agent.tool('lookup/product-duty-rate', {
    query: '7408.11',
    limit: 2
  });
  console.log(result.data.result);
  console.log(result.data.evidence);
  ```
</RequestExample>

<ResponseExample>
  ```json Response (200) theme={null}
  {
    "success": true,
    "data": {
      "request_id": "uuid",
      "receipt_id": "rcpt_...",
      "status": "completed",
      "tool": "product_duty_rate",
      "result": {
        "total": 3,
        "lines": [
          {
            "code": "7408.11",
            "description": "Of which the maximum cross-sectional dimension exceeds 6 mm:",
            "indent": 2,
            "general_rate": null,
            "special_rate": null,
            "other_rate": null,
            "units": [],
            "footnotes": [],
            "additional_duties": null
          },
          {
            "code": "7408.11.30.00",
            "description": "With a maximum cross-sectional dimension over 9.5 mm",
            "indent": 3,
            "general_rate": "1%",
            "special_rate": "Free (A,AU,BH,CL,CO,D,E,IL,JO,KR,MA,OM,P,PA,PE,S,SG)",
            "other_rate": "7%",
            "units": [
              "kg"
            ],
            "footnotes": [],
            "additional_duties": null
          }
        ]
      },
      "evidence": {
        "source": "US International Trade Commission",
        "source_kind": "public",
        "retrieved_at": "2026-01-15T12:00:00.000Z",
        "as_of": null
      }
    }
  }
  ```
</ResponseExample>

<Info>Price: \$0.005 per lookup. See [Pricing](/pricing) for every tool.</Info>

## Notes

* Results return inline. The finished job stays available at `/v1/requests/{request_id}`


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.