PoliscopePoliscope
APIReferenzSearch

/search

GET
/search

Universal search across meetings and documents. Returns grouped results with context.

AuthorizationBearer <token>

API key as Bearer token

In: header

Query Parameters

q*string

Search phrase. In keyword mode supports boolean operators against the full-text index on chunk text: AND (default, also implicit between adjacent terms), OR (alternation), NOT or leading - (exclusion), ( … ) for grouping, "…" for exact phrase match. Example: windkraft AND ("erneuerbare energien" OR solar) -atomkraft. Operators must be uppercase; lowercase words are treated as regular terms. At most 5 top-level OR branches. In semantic mode only OR is supported.

Length1 <= length <= 1000
mode?string

Search mode. 'semantic' (default): finds results by meaning, even without exact term matches. Results include a relevance score (0–1). 'keyword': exact term matching only. Faster, but only finds literal occurrences. Scores are not comparable across modes.

Default"semantic"
Value in"semantic" | "keyword"
types?|array<>

chunkType filter as repeated query params or comma-separated list. Defaults to all types. Allowed values: agendaItemTitle, agendaItemDescription, document, proposalTitle, proposalDescription

entityIds?|array<>

Entity IDs (Regionalschlüssel) as repeated query params or comma-separated list. Use * suffix for prefix matching: 01* matches all entities in Schleswig-Holstein, 03101 matches LK Braunschweig exactly. Unallowed entities are silently stripped; the search runs only against permitted entities. Mutually exclusive with bbox.

bbox?string

Bounding box as 'west,south,east,north' (lon/lat). Resolves to entities whose geographic bounds intersect this box. Only entities the caller is permitted to access are included. Mutually exclusive with entities.

levels?|array<>

Administrative levels as repeated query params or comma-separated list. Values: 10=Bundesland, pr=Planungsregion, 40=Landkreis, 50=Verbandsgemeinde, 60=Kommune

dateFrom?string

Filter from this date (inclusive, ISO 8601)

Formatdate
dateTo?string

Filter up to this date (inclusive, ISO 8601)

Formatdate
newSince?string

Only return results ingested since this datetime (inclusive, ISO 8601). Useful for polling new content since the last check.

Formatdate-time
limit*number

Max number of result groups returned in data[]. Values above 300 are clamped; use hasMore to detect truncation. Default 50 is sufficient for most use cases. Higher values increase latency.

Default50
Range1 <= value <= 300
scoreThreshold?number

Minimum relevance score (0.05–1) to include a result in data[] and mapPoints[]. Only applies to semantic mode; keyword mode ignores this. Higher values return fewer but more relevant results. 0.35 is a balanced default; use 0.5+ for precise matches, 0.1–0.2 for broad recall.

Default0.35
Range0.05 <= value <= 1
sort?string

Sort order for data[]. 'relevance' (default): pure score descending — best for finding the most topically relevant items. 'newest': source date descending (then score as tiebreaker) — best for monitoring fresh content. 'oldest': source date ascending (then score) — useful for historical research. 'relevanceRecency': score multiplied by exponential time decay — balances relevance with freshness, surfaces recent relevant items at the top. All modes respect scoreThreshold. In keyword mode 'relevanceRecency' falls back to 'newest'.

Default"relevance"
Value in"relevance" | "newest" | "oldest" | "relevanceRecency"

Response Body

application/json

application/json

application/json

application/json

application/json

curl -X GET "https://api.poliscope.de/v2/search?q=string&limit=50"
{
  "data": [
    {
      "groupKey": "string",
      "groupType": "meeting",
      "groupCreationDate": "2019-08-24T14:15:22Z",
      "date": "string",
      "score": 0,
      "hits": [
        {
          "id": "string",
          "score": 0,
          "text": "string",
          "chunkType": "agendaItemTitle",
          "highlights": [
            [
              0,
              0
            ]
          ],
          "agendaItemId": "string",
          "documentId": "string",
          "proposalId": "string",
          "pageFrom": 0,
          "pageTo": 0,
          "pageFromOffsetPct": 0,
          "pageFromOffset": 0,
          "pageToOffset": 0,
          "poliscopeUrl": "string",
          "fileUrl": "string"
        }
      ],
      "totalHits": 0,
      "context": {
        "date": "string",
        "entityName": "string",
        "entityLevel": "string",
        "entityId": "string",
        "parents": [
          {
            "id": "string",
            "name": "string",
            "level": "string"
          }
        ],
        "location": {
          "lat": 0,
          "lon": 0
        },
        "meeting": {
          "id": "string",
          "title": "string",
          "date": "string",
          "url": "string",
          "committee": "string",
          "bookmarks": [
            {
              "id": "string",
              "firstName": "string",
              "lastName": "string"
            }
          ]
        },
        "proposal": {
          "id": "string",
          "title": "string",
          "url": "string",
          "reference": "string"
        },
        "document": {
          "id": "string",
          "title": "string",
          "type": "string",
          "url": "string"
        }
      }
    }
  ],
  "mapPoints": [
    {
      "location": {
        "lat": 0,
        "lon": 0
      },
      "intensity": 0,
      "entityId": "string",
      "entityName": "string",
      "groupKey": "string"
    }
  ],
  "meta": {
    "total": 0,
    "totalHits": 0,
    "hasMore": true,
    "estimatedTotal": 0
  }
}
{
  "error": "BAD_REQUEST",
  "message": "string"
}
{
  "error": "BAD_REQUEST",
  "message": "string"
}
{
  "error": "BAD_REQUEST",
  "message": "string"
}
{
  "error": "BAD_REQUEST",
  "message": "string"
}