Skip to main content

Wanted Sources & Discovery

See which datasets your unanswered needs name as missing, and what the discovery job tried for them: site lookups, price sheets, and why a lookup failed.

Some needs name the dataset the library lacks in subject.wanted. GET /v1/data-library/needs/wanted counts those per dataset and category with the number of contracts they concern, most needed first. It is the list of what to load or scrape next: the datasets whose absence blocks the most work. scope restricts it to one scope. Only unanswered needs count, so a dataset leaves the list once the library holds it and the apps report the need no more.

Each entry carries a discovery object that reports what the discovery job last made of the source, or null when the job has not tried it. For an ordinary dataset it holds the job's state: status, problem, detail, attempts, next_attempt_at and updated_at. For the grid-operator register (de.grid-operators) it summarises the site lookups instead, as { sites, found, failed }, where failed counts the failed lookups per problem. The two shapes differ because the register is built from one lookup per site, while a price sheet is one source.

GET/v1/data-library/needs/wanted

Query parameters

scopestringOnly needs of this scope.

Response fields

datasetstringKey of the missing dataset.
categorystringThe kind of data the needs ask for.
needsintegerUnanswered needs that name the dataset.
contractsintegerDistinct contracts those needs concern.
discoveryobject | nullWhat the discovery job last made of the source. status, problem, detail, attempts, next_attempt_at, updated_at; for de.grid-operators, { sites, found, failed }. Null when the job has not tried it.

Response: Wanted sources

{
  "data": [
    {
      "dataset": "grid.power.price-sheet:example-netz:2026",
      "category": "grid_fee",
      "needs": 12,
      "contracts": 5,
      "discovery": {
        "status": "failed",
        "problem": "no_sheet",
        "detail": "No page on the operator site links a sheet for 2026",
        "attempts": 2,
        "next_attempt_at": "2026-10-27T03:47:00.000Z",
        "updated_at": "2026-10-20T03:47:12.000Z"
      }
    }
  ]
}

What the Discovery Job Tried

GET /v1/data-library/discovery lists the discovery job's attempts for the workspace's wanted sources, ordered by last update, latest first. Two kinds of target appear: the workspace's own site lookups for the grid-operator register (target is de.grid-operators|<energy>|<site> and shared is false) and the shared price-sheet lookups (target is the wanted dataset key and shared is true). status is pending, found or failed. attempts and next_attempt_at show the backoff: a failed lookup is tried again later, not at once.

When a lookup fails, problem says why and detail adds the specifics. Typical values are no_postcode, no_location, no_operator, gas_operator_unknown, no_site, no_sheet, needs_ocr, provisional_only and error; the set is descriptive and may grow, so treat an unknown value as a failure with the text in detail. result holds what was found: the sheet URL, the page that links it, the dataset created, the operator. The job never invents a source: it picks a URL only after fetching it and checking that its text matches what was wanted.

GET/v1/data-library/discovery

Query parameters

statusstringpending, found, or failed.
limitintegerMaximum states, clamped to 1 through 5000. Default: 500

Response fields

targetstringThe wanted dataset key, or de.grid-operators|<energy>|<site> for a site lookup.
sharedbooleanTrue for a shared price-sheet lookup; false for the workspace's own site lookup.
statusstringpending, found, or failed.
problemstring | nullWhy a lookup failed, for example no_postcode, no_sheet, needs_ocr, provisional_only.
detailstring | nullSpecifics of the problem.
attemptsintegerHow many times the job tried.
next_attempt_atdate-time | nullWhen the job tries again.
resultobjectWhat was found: the sheet URL, the page linking it, the dataset created, the operator.
updated_atdate-timeLast change to this state.

cURL: List failed lookups

curl "https://api.talonic.com/v1/data-library/discovery?status=failed&limit=50" \
  -H "Authorization: Bearer $TALONIC_API_KEY"
A failed lookup is a statement about the open web, not about your data. needs_ocr means the only sheet found is a scan, which the platform refuses instead of reading as an empty success, and provisional_only means the operator has published a provisional sheet but no final one. Load the values yourself with the datasets and records endpoints when you hold the document.

Frequently asked questions

What is a wanted source?+
A dataset that the unanswered needs of the workspace name as missing. The wanted list counts the needs and the contracts per dataset, so the dataset blocking the most work comes first.
Why are there two shapes of discovery?+
The grid-operator register is built from one lookup per site, so its discovery value summarises the lookups as { sites, found, failed }. Any other wanted dataset is a single source, and its discovery value is the job's state for it. Read the shape from the key of the dataset.
Will the discovery job retry a failed lookup?+
Yes, later. attempts counts the tries and next_attempt_at says when the next one is due. The job backs off between attempts instead of retrying at once.
Does a found sheet land in my workspace or the shared library?+
Grid-operator register entries go to the workspace, because they name its sites and contracts. A price sheet found for a wanted dataset becomes a shared dataset, because the sheet is a public document and Talonic owns the shared rows.