URL Intelligence API

Hand it a URL, it hands you back the call to make next

The URL Intelligence API cleans and classifies URLs as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a URL Intelligence endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
U
/enrich-url/v1

4 active endpoints, on 1 and 2 credit tiers.

  • POST/enrich-url/v1/classify
  • POST/enrich-url/v1/extract_entity
  • POST/enrich-url/v1/batch
  • POST/enrich-url/v1/catalog_resolve

What URL Intelligence endpoints does ReefAPI ship?

4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

4 endpoints

classify

2 cr

Any URL → final_url, cleaned_url (tracking stripped), domain, entity_type{value,confidence,so…

required
url
optional
deep

extract_entity

2 cr

Any URL → a lightweight entity card with title, image, description, price, author and publica…

required
url
optional

batch

2 cr

Classify up to 20 URLs in one call (the link-list cleanup + routing use-case).

required
urls
optional

catalog_resolve

1 cr

META (no network).

required
optional
platform, url

Every parameter, every allowed value →

URL Intelligence API

3 of 4 endpoints, ready to run

View docs ↗

The entity type with a confidence score and where it came from, the platform and identifier, the resolved and cleaned URLs, the tracking verdict, the preview, and a recommended engine and action.

2 credits1 required · 1 optional
POST/enrich-url/v1/classify
ok2689 ms · 1 records · sample
{
  "ok": true,
  "meta": {
    "api": "enrich-url",
    "endpoint": "classify",
    "mode": "live",
    "latency_ms": 2688.5,
    "record_count": 1,
    "cache_hit": false
  },
  "data": {
    "input_url": "https://www.amazon.com/dp/B0CHX3QBCH",
    "final_url": "https://www.amazon.com/dp/B0CHX3QBCH",
    "cleaned_url": "https://www.amazon.com/dp/B0CHX3QBCH",
    "canonical_url": "https://www.amazon.com/Apple-iPhone-Plus-Clear-MagSafe/dp/B0CHX3QBCH",
    "domain": "www.amazon.com",
    "registrable_domain": "amazon.com",
    "is_short_link": false,
    "redirect": {
      "redirected": false,
      "wall_redirect": null,
      "hops": 0,
      "chain_hosts": [
        "www.amazon.com"
      ]
    },
    "entity_type": {
      "value": "product",
      "confidence": 0.9,
      "source": "platform-map"
    },
    "platform": "amazon",
    "identifier": null,
    "recommended": {
      "engine": "amazon",
      "action": "product",
      "params": {
        "product_id": "B0CHX3QBCH"
      }
    },
    "tracking": {
      "is_affiliate": false,
      "affiliate_network": null,
      "affiliate_type": null,
      "merchant_hint": null,
      "stripped_params": []
    },
    "preview": {
      "title": "Amazon.com: Apple iPhone 15 Plus Clear Case with MagSafe : Cell Phones & Accessories",
      "description": "Buy Apple iPhone 15 Plus Clear Case with MagSafe: Basic Cases - Amazon.com ✓ FREE DELIVERY possible on eligible purchases",
      "image": null,
      "site_name": null,
      "og_type": null
    },
    "provenance": {
      "resolver": {
        "status": "ok",
        "engine": "url-resolver"
      }
    }
  }
}
Real response, fetched from the live endpoint with the parameters on the left — trimmed to the first few rows, with seller names left out. Press Try it for the untrimmed response.

How the URL Intelligence API works

URL Intelligence is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 184 engines.

02
Call
POST /enrich-url/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Routing a pasted link to the right endpoint without a rules file of your own

A product that accepts 'paste any link' normally grows a hand-written host table: if amazon then this, if instagram then that. The table is never finished and never right.

01classify
POST/enrich-url/v1/classify
{"url": "https://www.amazon.com/dp/B0CHX3QBCH"}

The Amazon URL came back typed as a product at high confidence, with the ASIN lifted out and a routing card naming amazon/product and the parameter to send it.

02Call whatever the recommended block names, with the params it hands you.
POSTCall whatever the recommended block names, with the params it hands you.

The identifier is already extracted, so there is no second parse on your side and no regex of yours to keep in step with a site's URL format.

Your paste box stops being a host table you maintain. Where a platform has no deep engine the card names a general extractor instead, so the flow still completes.

request
curl -X POST https://api.reefapi.com/enrich-url/v1/classify \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"url":"https://www.amazon.com/dp/B08N5WRWNW?tag=aff-20&utm_source=x"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "enrich-url",
    "endpoint": "classify",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

Five URL fields that look alike and are not

The response carries four different versions of the link plus a host field, and picking the wrong one is the usual cause of duplicate rows in a link table. The measured column is one real classify call on https://youtu.be/dQw4w9WgXcQ?si=abcdef&utm_source=x, a short link that lands on a different host. Note in particular that domain describes the link you sent, not the page you ended up on.

FieldWhat it holdsMeasured on the youtu.be link
final_urlWhere the link lands, query string untouchedhttps://www.youtube.com/watch?si=abcdef&utm_source=x&v=dQw4w9WgXcQ&feature=youtu.be
cleaned_urlfinal_url with known tracking params removedsame URL with utm_source dropped, si and feature kept
canonical_urlThe page's own canonical, the safest dedupe keyhttps://www.youtube.com/watch?v=dQw4w9WgXcQ
domainHost of the URL you sent, not of final_urlyoutu.be
registrable_domainThat host reduced to its registrable formyoutu.be
identifierThe platform id pulled out of the path, null when no platform matcheddQw4w9WgXcQ
recommendedengine, action and ready-made params for the deep fetch{engine: youtube, action: video, params: {video_id: dQw4w9WgXcQ}}

redirect.redirected read false on every measured call, including this one where chain_hosts went from youtu.be to www.youtube.com. Use redirect.hops and redirect.chain_hosts to decide whether the link moved, and compare the host inside final_url against domain rather than trusting the flag.

How the verdict is reached, and how far the routing goes

Measured across a marketplace product, a social profile and a job posting. The routing row is the honest one.

The verdict carries its own provenance

entity_type comes with a confidence number and a source naming how it was decided — a platform rule, the page's own OpenGraph type, or its structured data. A high-confidence platform-rule answer and a low-confidence guess from a page's markup are not the same claim, and they do not arrive looking the same.

The identifier is lifted, not just detected

For a marketplace product the ASIN came back extracted and placed into the recommended call's parameters. For a social profile the handle did. The point of the endpoint is that the next call is assembled for you rather than described to you.

Against us: the routing card only knows the platforms it has rules for

The Amazon URL routed to the Amazon engine. A property listing and a job posting both routed to the general extractor instead of the dedicated engines that exist for those verticals, because the rule set covers around twenty platforms and those URL shapes are not among them. The flow still works and the card is honest about what it names; it is simply not yet a complete map of our own catalogue.

Redirects are resolved before anything is decided

A short link is followed first, so the classification is about the destination rather than the shortener. The response carries the original URL, the final URL, the cleaned URL and the hop count together, so the substitution is auditable.

The preview is decoded text, not raw markup

Titles and descriptions come back as readable text with HTML entities resolved, and the image URL is usable as returned. That sounds like a detail until the field lands in your UI: an escaped ampersand in an image URL is a broken image, not an ugly one.

Against us: deep classification costs seconds, not milliseconds

Where a platform rule matches, the answer is quick. Where it does not, the page has to be fetched and read before a type can be offered, and those calls ran into several seconds. If you are classifying a large list, use the batch action and treat it as a background job rather than something to sit in a request path.

What people build with URL Intelligence

The jobs this data is most often used for.

4

endpoints

1/2

credits per call

01

Content pipelines call classify to clean and canonicalize URLs before storage.

02

Moderation uses classify to flag short links and risky domains.

03

Commerce uses catalog_resolve to map a product URL to a known item.

What URL Intelligence data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 184 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/enrich-url/v1/classify \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"url":"https://www.amazon.com/dp/B08N5WRWNW?tag=aff-20&utm_source=x"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/enrich-url/v1/classify",
    headers={"x-api-key": REEF_KEY},
    json={
  "url": "https://www.amazon.com/dp/B08N5WRWNW?tag=aff-20&utm_source=x"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up URL Intelligence.

Get a free key →
Which links get a real engine and which fall back to web-extract?

The catalog_resolve action returns the routing table itself with no network call. It listed 39 platforms, of which 9 currently carry a null engine: x, facebook, reddit, pinterest, vimeo, gitlab, imdb, walmart and target. Everything else maps to a named engine and action, for example instagram to instagram/profile and amazon to amazon/product. When no platform matches, recommended still comes back, pointing at web-extract with a note that says there is no dedicated engine for that host.

I passed a Zillow property link and got web-extract back. Why?

Real estate hosts are not in the platform table, so the classifier fell through to structured data. The measured call returned entity_type 'product' with source 'jsonld', platform null, and a web-extract card. It did resolve the URL properly on the way, rewriting a placeholder path into the full listing slug. For property links use enrich-property, whose snapshot action takes the same URL and returns status, price, beds, area and photos.

Does a company domain get routed to enrich-company?

No. A measured classify on stripe.com returned entity_type 'company' with confidence 0.6 and source 'og-type', platform null, and a recommended card for web-extract. This engine classifies and routes links, it does not enrich businesses. Take the registrable_domain from here and hand it to enrich-company yourself if you want firmographics, or to enrich-app if the domain is a SaaS product.

Why is the affiliate tag still in cleaned_url?

Because stripping it would break the link's purpose. On a measured Amazon link carrying tag=aff-20 and utm_source=x, stripped_params listed only utm_source, and both cleaned_url and canonical_url kept tag=aff-20. What you get instead is disclosure: tracking.is_affiliate came back true with affiliate_network 'amazon_associates' and merchant_hint 'amazon'. Drop the tag yourself if you need a neutral URL.

The preview title says 'Page Not Found' but the classification looks right. Which do I believe?

The classification. preview is a best-effort read of the page's own metadata and some hosts answer an automated fetch with their error page, which is what produced 'Page Not Found' on an Amazon product link and 'Bitly | Page Not Found | 404' on a dead short link. Those same responses still classified correctly from the platform map, at confidence 0.9 and with a usable recommended card. When the extractor cannot help, provenance.classifier records the status and a missing_reason.

What does a low entity_type confidence actually mean?

It tells you where the answer came from. Values of 0.9 to 0.95 with source 'platform-map' mean the host was recognized outright, which is what amazon, github, instagram and youtube links returned. A value of 0.6 with source 'og-type' means it was read off the page's own og metadata, and 0.35 with source 'unknown' means nothing identified it, which is what an unresolvable short link and a Spotify track both scored.

How does batch handle a bad URL in the list?

It isolates it. A measured batch of four inputs, one of them the string 'not a url', returned ok:true overall with count 4, ok_count 3 and meta.record_count 3. The bad entry appears in results as {ok:false, input_url, error:{code:'INVALID_PARAM'}} while the other three carry full classify payloads. The cap is 20 per call, and 21 urls returns INVALID_PARAM with 'max 20 urls per batch (got 21)'.

Are internal or private addresses safe to send?

They are rejected rather than fetched. A measured classify on http://169.254.169.254/latest/meta-data/, the usual cloud metadata address, returned ok:false with INVALID_PARAM and the message 'SSRF-blocked: private/internal IP'. Non-http schemes such as file:// are refused the same way, so user-submitted links can be passed through without pre-filtering.

What is the URL Intelligence API?

URL Intelligence API is a ReefAPI endpoint group for url intelligence It returns live JSON through POST requests under /enrich-url/v1.

Is the URL Intelligence API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. URL Intelligence calls use the same shared credit balance as every other ReefAPI engine.

Do I need an URL Intelligence login or account?

No login to URL Intelligence is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the URL Intelligence data?

The page example is captured from a live classify call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the URL Intelligence API use?

URL Intelligence actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call URL Intelligence from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call enrich-url actions with the same key, credit pool and JSON envelope used by normal REST requests.

19 Utilities & AI APIs on the same key

One key, one credit pool, one response envelope. If you are pulling URL Intelligence, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 183 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-30.