openapi: 3.1.0
info:
  title: Daremeet public agent APIs
  version: 1.1.0
  description: |
    Read-only HTTP surfaces for agents and MCP clients.
    Streamable MCP: https://www.daremeet.com/api/mcp
    Manifest: https://www.daremeet.com/.well-known/agent-tools.json
  contact:
    email: contact@daremeet.com
  license:
    name: Public data only — see https://www.daremeet.com/ai.txt
servers:
  - url: https://www.daremeet.com
paths:
  /api/agents/search:
    get:
      summary: Search Daremeet FAQ, canonical-ai, Lieux cities, POI and challenge ideas
      operationId: daremeetAgentSearch
      tags: [agents]
      parameters:
        - name: q
          in: query
          required: true
          schema: { type: string }
          description: Search query (city name, POI, challenge idea, FAQ topic)
        - name: locale
          in: query
          schema: { type: string, default: fr }
        - name: max
          in: query
          schema: { type: integer, default: 12, minimum: 1, maximum: 24 }
      responses:
        '200':
          description: JSON hits (faq, canonical-ai, lieux_city, lieux_poi, lieux_challenge_idea) + formatted text
  /api/mcp:
    get:
      summary: MCP Streamable HTTP (SSE / JSON-RPC)
      operationId: mcpStreamableGet
      tags: [mcp]
      responses:
        '200':
          description: MCP transport response
    post:
      summary: MCP Streamable HTTP messages
      operationId: mcpStreamablePost
      tags: [mcp]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: MCP JSON-RPC response
  /api/lieux-go:
    get:
      summary: Build Lieux → app deep link URLs
      operationId: daremeetLieuxGo
      tags: [lieux]
      parameters:
        - name: key
          in: query
          required: true
          schema: { type: string }
          description: country/region/city slugs
        - name: action
          in: query
          schema: { type: string, enum: [map, create], default: map }
        - name: lat
          in: query
          schema: { type: number }
        - name: lng
          in: query
          schema: { type: number }
        - name: place
          in: query
          schema: { type: string }
        - name: city
          in: query
          schema: { type: string }
        - name: locale
          in: query
          schema: { type: string, default: fr }
      responses:
        '200':
          description: URL bundle (web_fallback, app_scheme, android_intent, lieux_city_page)
        '400':
          description: invalid_params
        '404':
          description: city_not_found
  /go/lieu:
    get:
      summary: Lieux → app fallback page (noindex HTML)
      operationId: daremeetLieuxGoFallback
      tags: [lieux]
      parameters:
        - name: key
          in: query
          required: true
          schema: { type: string }
        - name: action
          in: query
          schema: { type: string, enum: [map, create] }
        - name: lat
          in: query
          schema: { type: number }
        - name: lng
          in: query
          schema: { type: number }
        - name: place
          in: query
          schema: { type: string }
        - name: city
          in: query
          schema: { type: string }
        - name: locale
          in: query
          schema: { type: string }
      responses:
        '200':
          description: HTML fallback page
  /api/lieux-around:
    get:
      summary: POIs around a Daremeet Lieux city
      operationId: daremeetLieuxAround
      tags: [lieux]
      parameters:
        - name: country
          in: query
          required: true
          schema: { type: string }
        - name: region
          in: query
          required: true
          schema: { type: string }
        - name: city
          in: query
          required: true
          schema: { type: string }
        - name: locale
          in: query
          schema: { type: string, default: fr }
      responses:
        '200':
          description: JSON items list
  /insights/latest.json:
    get:
      summary: Latest DaremeetBot web watch summary
      operationId: daremeetInsights
      tags: [corpus]
      responses:
        '200':
          description: Insights JSON
  /compare/daremeet-vs-dating-apps.json:
    get:
      summary: Structured Daremeet vs dating apps comparison
      operationId: daremeetCompare
      tags: [corpus]
      responses:
        '200':
          description: Comparison JSON
  /sana-profile.json:
    get:
      summary: Sana Nova / Sana Lagneb public profile for Daremeet
      operationId: daremeetSanaProfile
      tags: [corpus]
      responses:
        '200':
          description: Profile JSON
  /canonical-ai.txt:
    get:
      summary: Citation-ready answers (all languages)
      operationId: daremeetCanonicalAi
      tags: [corpus]
      responses:
        '200':
          description: Plain text
  /faq/{locale}.json:
    get:
      summary: FAQ corpus per locale
      operationId: daremeetFaqLocale
      tags: [corpus]
      parameters:
        - name: locale
          in: path
          required: true
          schema: { type: string }
      responses:
        '200':
          description: FAQ JSON
