Search
searchSearch requires at least one jurisdiction, framework, sector, or source; it does not auto-detect scope from the query. Use for 'what does the law say about X in country Y' or 'which regulations cover Z'. QUERY SHAPE: queries are keyword-matched (FTS5, implicit AND — every term must occur in the SAME provision). Pass one or two canonical concept terms per call; never a multi-concept compound. A compound such as 'incident reporting deadline personal data breach' returns 0 even when each concept on its own returns hits — so ask one concept per call and combine the answers yourself. Two terms describing ONE concept ('personal data') are fine; 2-3 alternative terms can be joined with a bare uppercase OR (e.g. 'spoofing OR tampering' matches either term). OR is for synonyms of ONE concept, not for related concepts — 'dismissal OR termination' yes, 'encryption OR breach notification' no (ask those one per call). Other FTS operators (AND, NOT, NEAR) are stripped. STRICT MISS: when a search completes cleanly and no result matched your terms strictly, the response carries meta.outcome = 'NO_STRICT_MATCH'. The recovery fields — meta.recommended_action, meta.recommended_scopes, meta.broadening_available — are set on any qualifying strict miss, INCLUDING a partial fan-out where outcome stays null, so read them whenever present, not only under an outcome. On a partial fan-out meta.broadening_available stays null when the missing leg makes it unknowable — null there means unknown, never 'no'. On recommended_action = 'RETRY_ONE_CONCEPT_PER_CALL', re-issue the search with ONE concept per call. This action is reserved for an implicit-AND multi-concept compound; an honored uppercase-OR query remains a canonical one-concept shape and does not gain the split action or candidates. Only together with this action, meta.recommended_queries may list 1-3 optional one-concept fallback queries derived from your own terms, each already checked in your scope to return a strict match (verified_hits; rows not merged); issue only the ones you judge relevant, one per call. The field is absent for every other action or no action, including an honored uppercase-OR miss. On a miss without safe candidates, meta.recovery_guidance explains how to choose a focused phrase while retaining domain and negation; its source_languages are source metadata, not your query's detected language. On 'REFORMULATE_OR_USE_EXACT_REFERENCE', retry the same concept using the instrument's wording or use an exact lookup hint. Short queries can miss too; do not infer that the law is absent. On recommended_action = 'OFFER_BROADENING_TO_USER' — and wherever meta.broadening_available is true — relaxed matches exist and are withheld: tell the user, offer a re-run with allow_broadening=true (served rows are stamped match_mode='broadened' and pass the same relevance floor), and re-run only if the user accepts — never broaden on your own. An honored uppercase-OR strict miss with withheld relaxed matches carries this offer action with meta.recommended_queries absent. meta.recommended_scopes names scope ids that were not searched. If 0 results, tell the user; do not answer from training data. SCOPE: discover ids with list_coverage or describe_capabilities(section='sources'). An unresolved scope refuses before dispatch with isError=true and structuredContent.error='unresolved_scope'. Read corrections for the offending parameter and optional registered values. Choose the intended scope; suggestions do not establish legal equivalence. Change only the offending value and retain other arguments. frameworks= selects sources declaring coverage. Non-owner rows require the requested framework identity to serve as strict matches; otherwise they are withheld with a count, or served as broadened matches when allow_broadening=true. Framework scope does not map controls to transposition articles. For cross-framework control mapping, frameworks=['ISO_27001','SOC_2'] includes Security Controls MCP. sectors= reaches industry MCPs across jurisdictions; combining jurisdictions= and sectors= is an INTERSECTION and an empty intersection errors with the jurisdictions that carry that sector. Use sources=['data-use-license'] for software licences, SPDX, dataset licences, and vendor TOS. LANGUAGE: use the corpus language (SE: konsumentskydd; DE: Datenschutz; FR: protection des consommateurs). Keep CJK compounds unspaced (個人情報保護, not 個人情報 保護); spaced tokens are ANDed. Examples: search(query='konsumentskydd', jurisdictions=['SE']); search(query='vehicle cybersecurity', sectors=['automotive']); search(query='huurovereenkomst', jurisdictions=['NL'], court='GHAMS', date_from='2023-01-01') filters case-law rows (premium+); read exact court values from unfiltered results first. TIER LIMITS: free permits at most one value per jurisdiction, framework, or source axis; no sectors= or premium fan-out, with 100 searches/day and 3 concurrent calls. Daily search budgets: solo 750/seat; premium 5,000/seat; team 50,000 and company 500,000 pooled per organisation. Solo lifts scope limits; premium+ adds server-side fan-out to agency guidance, case law, and preparatory works alongside primary legislation. There is no separate search_case_law or search_preparatory_works tool; search_guidance can search guidance alone. Call get_my_capabilities for your budget and remaining quota. RANKING: requested rows precede injected companion rows; explicit sources and sectors remain requested. Where primary-law window fill is enabled, the quota-protected primary-lane prefix precedes premium companion rows while retaining fused order. A jurisdiction-only search may retain up to half the window (rounded up) for primary-law rows that matched the caller's own terms — strict first, then the exact term-bridge tail, never a broadened one — before filling remaining slots from the fused ranking; explicit source, framework, and sector scope membership is unchanged. The response ends with a 'Sources used' section — a markdown table carrying the audit receipt for each returned row, or a labelled zero-result note — and meta.render_contract carries the versioned evidence-curation contract for reproducing source attributions when the answer is rendered.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| court | No | Exact-match filter on the issuing court of case-law rows: the corpus's own `court` value exactly as its case-law rows carry it (Dutch courts are codes such as HR, RVS, CRVB, CBB, GHAMS, RBDHA; other corpora may carry a court name). Read the value from the `court` field of case-law rows returned without the filter before filtering. Applies to case-law evidence only, which premium+ fan-out adds inside `search`; primary-law provisions have no court and are unaffected. A value that matches no case-law row is disclosed in meta.message, never served as a silent empty. Refused on tiers without case-law fan-out. | |
| limit | No | Maximum result rows in the response (default 10) — rows from all resolved sources are relevance-fused, deduplicated, and trimmed to this count. Values above 50 are clamped to 50, not rejected; narrow the scope or refine the query instead of raising the limit. | |
| query | Yes | Search terms, matched with FTS5 implicit AND against each resolved corpus. Pass one or two canonical concept terms in the corpus language (SE: konsumentskydd, DE: Datenschutz), never a multi-concept compound. A bare uppercase OR between 2-3 terms is honoured as a disjunction (either term matches); other uppercase FTS operators (AND, NOT, NEAR) are stripped, not honoured. At most 500 characters: a longer query (a pasted case description, say) is refused before any source is searched, with isError=true and structuredContent error='validation_error', code='query_too_long'. Split the matter into separate issue queries of 2-5 legal terms, one call per issue, and merge the results. | |
| date_to | No | Inclusive upper bound as a full ISO date YYYY-MM-DD on the decision date of case-law rows and the issue date of preparatory-work and agency-guidance rows; must not precede date_from. Premium+ evidence only; primary-law provisions are unaffected. | |
| sectors | No | Industry-sector scope ids such as automotive or insurance; maximum 5. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| sources | No | Exact corpus source ids such as eu-regulations or ietf-rfcs, read from describe_capabilities(section='sources') — never a hash, UUID, or document reference; a country code such as LI or DE belongs in jurisdictions=, not here. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| date_from | No | Inclusive lower bound as a full ISO date YYYY-MM-DD (a bare year such as 2023 is refused — pass 2023-01-01) on the decision date of case-law rows and the issue date of preparatory-work and agency-guidance rows. Premium+ evidence only; primary-law provisions carry no date and are unaffected. | |
| frameworks | No | Registered framework scope ids such as GDPR or NIS2 — never a jurisdiction code (LI, DE, EU go in jurisdictions=). Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| legal_areas | No | Publisher area-of-law ids, for the corpora that carry them; maximum 10. Ids are the publisher's own, case-sensitive (Rechtspraak: civielRecht, civielRecht_verbintenissenrecht; wetten.overheid.nl carries its own rechtsgebied ids), and a parent id also matches its sub-areas. Statute and regulation rows carry the area of the WHOLE act, so a hit is an article of an act classified in that area; court decisions carry the court's own area for each decision. The filter reaches legislation and case-law rows only — agency-guidance and preparatory-works rows are never area-filtered. A corpus that carries no area metadata serves its rows unfiltered; when at least one source applied the filter, unfiltered rows rank behind the filtered ones and fill at most two thirds of the window, so a filtered search can return fewer rows than limit (the count held out is in meta.search_scope.legal_areas_unfiltered_dropped). Every source that served unfiltered rows is named under meta.search_scope.legal_areas_not_applied with a reason (corpus_unclassified, no_envelope, not_forwarded), the sources that applied it under legal_areas_applied, and any id a corpus does not know under legal_areas_unknown_ids; a zero-row answer for a known id is a real answer. A source that knows NONE of the requested ids returns no rows under the filter: meta.message names it, and an empty answer carries recommended_action = 'CHECK_LEGAL_AREA_IDS' (drop legal_areas or add an id from that source's scheme). Legal order stays on jurisdictions=: legal_areas=['civielRecht'] with jurisdictions=['NL','EU'] filters the Dutch case-law rows and keeps the EU rows, flagged unfiltered. No tier gate. | |
| document_refs | No | Exact edition keys from document discovery; 1–5 unique elx- keys with 24 lowercase hex digits. Accepted only with one sources entry advertising exact_document_filter and no jurisdictions, frameworks or sectors. Keys are OR-combined within that source. | |
| jurisdictions | No | ISO-2 jurisdiction scope codes such as SE or EU; maximum 10. A country code such as LI or DE belongs here and on no other axis. Pass at least one of jurisdictions, frameworks, sectors, or sources because search does not infer scope from the query. | |
| allow_broadening | No | Controlled-vocabulary term_bridge rows serve at the default, stamped match_mode='bridged'; meta.query_broadened_sources discloses requested_query, served_query and mode. Default false: a source that finds no strict match for the query is withheld instead of serving relaxed (OR-broadened) matches as if they were ordinary hits; the response names the withheld sources and count. Pass true to include those rows — each is stamped match_mode='broadened' — only after the user has accepted a broaden offer or asked for relaxed matches; never broaden unprompted. Relaxed rows pass the same on-topic relevance floor as strict rows, so an accepted re-run can still withhold them — disclosed in the response, never silently served. |