Loop
How it worksThe loopWhy LoopPricingDocs
use case restaurant data

Live restaurant data
built for AI agents.

Language models hallucinate opening hours. They serve stale data without labeling it. They can’t report back what happened. Loop fixes all three: structured JSON output, explicit freshness signals, and a report() action that closes the loop.

the problem

Agents serving stale data look unreliable.

When a user asks an agent to find a restaurant, the agent typically searches the web or calls a map API. The data it gets back was crawled weeks ago, has no confidence score, and can’t be verified. The agent presents it as fact. The user shows up to a closed restaurant. They don’t trust the agent again.

Loop was built to solve exactly this: every record has an observed_at timestamp and a confidence score. Availability is labeled inferred: true until verified. Agents can tell users honestly when data may be stale — and earn trust instead of losing it.

424
restaurants in Kreuzberg
312
cross-source confirmed
4
agent tools (MCP + REST)
example search + response
Tool call
// MCP tool call
{
  "name": "search",
  "arguments": {
    "query": "vegan pizza with outdoor seating",
    "location": "Kreuzberg, Berlin",
    "filters": { "vegan": true, "outdoor_seating": true }
  }
}
Response
{
  "results": [
    {
      "id": "osm_node_12345678",
      "name": "Casa Nostra",
      "vertical": "restaurants",
      "restaurant": {
        "cuisine": ["italian", "pizza"],
        "price_band": "$$",
        "outdoor_seating": true,
        "vegan": true
      },
      "attrs": {
        "opening_hours": "Mo-Su 12:00-22:00",
        "street": "Skalitzer Str.",
        "housenumber": "42",
        "cross_source_confirmed": true
      },
      "confidence": 0.87,
      "observed_at": "2026-06-10T14:32:00Z",
      "availability": { "inferred": true }
    }
  ],
  "total": 3
}

Every result includes confidence, observed_at, and an explicit availability.inferredflag. Agents know what they know and what they’re inferring.

what you get

Structured per-vertical schema

Restaurant data in a typed sub-object: cuisine[], price_band, outdoor_seating, vegan, vegetarian. No parsing strings.

🕐

Freshness on every record

observed_at timestamp and confidence score (0–1) let agents tell users honestly when data may be stale — a feature, not a bug.

Live verify before acting

Before booking, routing, or telling a user something definitive, call verify(result_id, claim) to re-check a specific record in real time.

📊

Close the feedback loop

report(result_token, outcome) feeds back what actually happened — open, closed, wrong. Each call mutates confidence and freshness for every future agent.

🔌

MCP native

Add https://stayinloop.dev/mcp to any MCP client (Claude, Cursor, ChatGPT dev mode). Four tools available instantly, no code.

🔍

Cross-source confirmed

312 of 424 Kreuzberg restaurants are confirmed across both OpenStreetMap and Foursquare OS Places — flagged in every response.

four tools, one endpoint
search()
When: User asks to find a place

Full-text + filter search. Returns ranked candidates with confidence and freshness.

get_details()
When: User picks a result

Full record with all vertical-specific fields. Returns a result_token valid 30 min.

verify()
When: Before any consequential action

Re-checks a specific claim live: is it open? Does it have outdoor seating? Call this before booking, routing, or stating something as fact.

report()
When: After the agent observes an outcome

Feeds back what actually happened. Mutates the record's confidence and freshness. Closes the loop. Reporting is expected, not optional.

Add Loop to your agent in 60 seconds.

Add https://stayinloop.dev/mcp as a remote MCP server. Four tools, instant access, free tier.