---
title: "Reverse lookup — given a URL, return related observations."
method: GET
path: "/discovery/by-url"
tags: ["Layer 0 — Discovery"]
---

# Reverse lookup — given a URL, return related observations.

`GET /discovery/by-url`

## Request

- Base URL: `https://entidex.com/api/v1`
- URL: `https://entidex.com/api/v1/discovery/by-url`
- Auth: HTTP bearer

## Query parameters

- `url` string, uri, required

## Response `200`

OK

- object
  - `data` Observation[]
    - `id` string, required
    - `entityId` string, required
    - `sourceSurface` 'serp_organic' | 'serp_ai_overview' | 'serp_knowledge_graph' | 'news' | 'reddit' | 'hackernews' | 'bluesky' | 'trustpilot' | 'google_maps' | 'wikipedia' | 'linkedin' | 'companies_house' | 'crunchbase' | 'github' | 'scholar' | 'patents' | 'youtube' | 'ai_engine_chatgpt' | 'ai_engine_claude' | 'ai_engine_gemini' | 'ai_engine_perplexity' | 'ai_engine_grok' | 'ai_engine_copilot' | 'own_site' | 'gleif' | 'edgar' | 'opencorporates' | 'ofac' | 'hm_treasury' | 'pep' | 'other', required: Provenance surface of an observation. `ai_engine_copilot` and the registry sources (gleif/edgar/opencorporates/ofac/hm_treasury/pep) are retained for observation provenance compatibility; collectors are flag-gated.
    - `sourceProvider` string, required
    - `sourceUrl` string, nullable
    - `sourceTitle` string, nullable
    - `snippet` string, nullable
    - `discoveryPath` DiscoveryPath
      - `method` string, required
      - `query` string, required
      - `queryType` string, required
      - `depth` integer, required
    - `observedAt` string, date-time, required
    - `publishedAt` string, date-time, nullable
    - `sentimentScore` number, nullable
    - `sentimentConfidence` number, nullable
    - `extractedClaims` string[], required
    - `extractedEntities` string[], required
    - `rawPayload` unknown
  - `meta` ResponseMeta
    - `requestId` string, required
    - `timestamp` string, date-time, required
    - `apiVersion` string, required
    - `pagination` object
      - `cursor` string, nullable
      - `hasMore` boolean
      - `limit` integer
    - `rateLimit` object
      - `limit` integer
      - `remaining` integer
      - `resetAt` string, date-time
    - `billing` object
      - `creditsUsed` integer
      - `creditsRemaining` integer, nullable
      - `tier` 'free' | 'layer_0_discovery' | 'layer_1_profile' | 'layer_2_insight' | 'layer_3_drift' | 'layer_4_cohort'
      - `allowedLayers` integer[]: Cumulative layer ladder unlocked by this key (0=discovery … 4=cohort). free → []; layer_2_insight → [0,1,2].
      - `mode` 'demo' | 'free' | 'payg' | 'keyed': How the caller is billed: demo (feedback-loop key), free (monthly allowance), payg (Developer PAYG), keyed (paid subscription).
  - `errors` ApiError[]
    - `code` 'ENTITY_NOT_RESOLVED' | 'ENTITY_NOT_FOUND' | 'INVALID_PARAMETER' | 'RATE_LIMITED' | 'INSUFFICIENT_CREDITS' | 'TIER_NOT_AVAILABLE' | 'UNAUTHENTICATED' | 'FORBIDDEN' | 'INTERNAL_ERROR', required
    - `message` string, required
    - `field` string
    - `candidates` object[]

---

[API](https://skmtc.dev/entidex/apis/entidex-api.md) · [All operations](https://skmtc.dev/entidex/apis/entidex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/entidex/apis/entidex-api/revisions/86b92f21a09a?raw)
