DEVELOPER HUB

Build with Cleo Legal Data.

Everything you need to discover the data, choose a product surface and ship an integration. Start with a product, then move to the REST reference for exact parameters and response schemas.

KNOWLEDGE HUB

Coverage and sources

See which jurisdictions, authorities and source statuses are actually represented.

Explore coverage →
CLEO DATA

REST API

Search, retrieve, classify and monitor through the authenticated v2 API.

Open API reference →
DELIVERY

SDK, MCP and webhooks

Choose the delivery channel that fits your product or AI agent.

Choose a channel →

Legal Data

Available

Which legal document matches the query, and how can its text be retrieved or synchronised?

GET /v2/searchExplore Legal Data

Customs Classification

Available

Which HS code does this product take in this destination on this date, which facts are still missing, and what backs each candidate?

POST /v2/customs/classificationsExplore Customs Classification

Product Scope

Preview

Which regulations and authorities are candidates for an existing HS6 code in a market?

Design partnerExplore Product Scope
HOW THE PRODUCTS CONNECT

From a product description to the source text.

  1. Product description
  2. Customs Classification
  3. HS6 candidate
  4. Product Scope
  5. candidate regulations and authorities
  6. Legal Data
  7. source document and text

The join from a Product Scope candidate to complete legal evidence is not yet guaranteed for every Product Scope result.

Customs Classification API

Available

A product title is rarely enough to classify. Turn it into an HS code for a destination and a date: the API asks for the missing facts instead of guessing, returns the national line and HS6 separately, quotes the notes behind each candidate with a rationale when available, and keeps a dossier on request.

POST /v2/customs/classifications→GET /v2/customs/classifications/{id}/dossier
POST /v2/customs/classification-batches→GET /v2/customs/classification-batches/{job_id}/items.csv
GET /v2/customs/codes/validateGET /v2/customs/codes/changesGET /v2/customs/coverage/countriesGET /v2/customs/lookup
Classification request
curl -X POST 'https://api.legaldata.cleolabs.co/v2/customs/classifications' \
  -H "Authorization: Bearer $CLEO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"item_id":"SKU-TSHIRT-9","description":"T-shirt","country":"US"}'
Shortened response shape
{
  "data": {
    "item_id": "<your item id>",
    "status": "<classified | needs_information | needs_review | ambiguous | …>",
    "missing_attributes": ["<fact that splits the candidates>"],
    "questions": [
      {
        "fact": "<fact name>",
        "question": "<question to ask the supplier>",
        "why": "<what the fact splits>",
        "discriminates": "<chapter | heading | subheading | national_line>"
      }
    ],
    "candidates": [
      {
        "code": "<national line or HS6 code>",
        "system": "<hts | cn8 | hs6 | …>",
        "confidence": "<ranking score>",
        "rationale": "<why this candidate matched or null>",
        "evidence": ["<verbatim note or ruling excerpt>"],
        "ambiguous": true
      }
    ],
    "provenance": { "evidence_source": "<index | unavailable>" }
  },
  "advisory_disclaimer": "<validation requirement>"
}

Angle-bracket values describe types or omitted values; these are shortened shapes, not literal responses. Scores and counts are numbers; nullable fields may be null.

A candidate is not a binding classification ruling. Use status, confidence and ambiguous to route uncertain results to a licensed customs broker or the competent authority, with the dossier attached.

Optional capabilities

  • GET /v2/customs/duties

    Destination-specific pilot

  • POST /v2/customs/landed-cost

    Conditional estimate with completeness fields

  • GET /v2/customs/obligations

    Assisted beta

  • GET /v2/customs/dual-use

    Preliminary screening only

POST /v2/compliance/check combines classification and selected Customs checks. It is not Product Scope or Marketplace Gate.

Open the Customs guide →

Product Scope

Preview · Design partner

Identify candidate regulations and authorities for a product in a target market.

GET /v2/catalog/regulations-by-hs
hs6 · required
Exactly six digits
market · required
Two-character market code
context · optional
retail | dual-use

Current input

The building block requires an existing HS6 code and market. It does not classify a product description by itself.

Current output

Candidate regulation labels and authorities, not a complete applicability decision or evidence pack.

Complete legal evidence, applicability conditions, official URLs, versions and effective dates are not yet returned for every line. source: "deterministic" describes the mapping method, not legal provenance.

Shortened preview response shape
{
  "hs6": "<six-digit HS code>",
  "market": "<two-character market code>",
  "tier": "<retail, non_retail, or unknown>",
  "archetype": "<product archetype or null>",
  "sous_type": "<product subtype or null>",
  "regulations": [
    {
      "name": "<candidate regulation label>",
      "authority": "<authority name or null>",
      "authority_domain": "<authority domain or null>",
      "source": "deterministic"
    }
  ],
  "authorities": [
    {
      "name": "<authority name>",
      "domain": "<authority domain or null>"
    }
  ],
  "counts": {
    "regulations": "<integer>",
    "authorities": "<integer>",
    "raw_regulations": "<integer>"
  }
}

Angle-bracket values describe types or omitted values; these are shortened shapes, not literal responses. Scores and counts are numbers; nullable fields may be null.

Become a design partner
Not available yet

Marketplace Gate

The future product will return a listing decision such as approve, review or block, with reasons and missing evidence.

Interpret responses safely

  • HTTP 401 means the API key is missing or invalid.
  • coverage_status: "not_seeded" means Cleo has no applicable data row; it does not mean the rate is zero.
  • ambiguous: true means the classification needs review.
  • total_is_partial: true or a null landed-cost total must not be presented as complete.
  • An empty Product Scope result must not be interpreted as “no regulation applies”.
Read the complete REST contract →