{
    "openapi": "3.0.0",
    "info": {
        "description": "Search, fetch, render, map and crawl the open web, behind one HTTP contract.",
        "title": "Tornad",
        "contact": {},
        "version": "0.1.0"
    },
    "paths": {
        "/answer": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "description": "Routes the query (when the router setting is on) to weather, wiki, fact, podcast or local providers and falls back to the web results /search returns. No prose answer is written here.",
                "tags": [
                    "web"
                ],
                "summary": "The vertical that answers a query, its results and numbered sources",
                "operationId": "answer",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.answerRequest"
                            }
                        }
                    },
                    "description": "query",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.answerResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Too Many Requests",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/answer/{id}/sources": {
            "get": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "description": "Kept for the answerSourcesTtlSeconds runtime setting; 404 after that.",
                "tags": [
                    "web"
                ],
                "summary": "The sources an earlier /answer returned, by its answer_id",
                "operationId": "answerSources",
                "parameters": [
                    {
                        "description": "answer_id from /answer",
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.storedSources"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/answer/{id}/usage": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "description": "Counted once per answer_id while its sources are kept; a second report is accepted and ignored. Not counted against the public quota.",
                "tags": [
                    "web"
                ],
                "summary": "Report the LLM tokens spent writing the answer to an answer_id",
                "operationId": "answerUsage",
                "parameters": [
                    {
                        "description": "answer_id from /answer",
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.usageRequest"
                            }
                        }
                    },
                    "description": "token usage reported by the answer agent",
                    "required": true
                },
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/health": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Provider and SearXNG engine health on this replica",
                "operationId": "getConsoleHealth",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.HealthDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/minitel/imports": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "List the latest SIRENE imports",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ImportsDTO"
                                }
                            }
                        }
                    },
                    "500": {
                        "description": "Internal Server Error",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/minitel/imports/osm": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Replace the places with the latest OpenStreetMap extract of France",
                "responses": {
                    "202": {
                        "description": "Accepted",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ImportStartedDTO"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/minitel/imports/sirene": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Import the latest SIRENE vintage for the departments in scope",
                "responses": {
                    "202": {
                        "description": "Accepted",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ImportStartedDTO"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/minitel/imports/wikipedia": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Import the latest French Wikipedia release into the encyclopedia",
                "responses": {
                    "202": {
                        "description": "Accepted",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ImportStartedDTO"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/ingest.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/rules": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Read the intent router's rules",
                "operationId": "getConsoleRules",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.RulesDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            },
            "put": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Replace the intent router's rules",
                "operationId": "putConsoleRules",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/console.RulesDTO"
                            }
                        }
                    },
                    "description": "Keywords, cities and categories",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.RulesDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Unprocessable Entity",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/settings": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "Read the runtime settings",
                "operationId": "getConsoleSettings",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.SettingsDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            },
            "put": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "description": "Applied on this replica at once and on the others within their reload interval.",
                "tags": [
                    "console"
                ],
                "summary": "Replace the runtime settings and the provider list per vertical",
                "operationId": "putConsoleSettings",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/console.UpdateSettingsRequest"
                            }
                        }
                    },
                    "description": "Switches and providers",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.SettingsDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Unprocessable Entity",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/console.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/spelling/imports": {
            "get": {
                "tags": [
                    "console"
                ],
                "summary": "The latest spelling corpus imports",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/spelling.importRun"
                                    }
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/spelling/imports/wikipedia": {
            "post": {
                "tags": [
                    "console"
                ],
                "summary": "Add the words and word pairs of a Wikipedia dump to the spelling vocabulary",
                "parameters": [
                    {
                        "description": "wiki to import, frwiki by default",
                        "name": "wiki",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "how many dump shards of about 600 MB to read, 2 by default",
                        "name": "shards",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    }
                ],
                "responses": {
                    "202": {
                        "description": "Accepted",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/spelling.importStarted"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/console/web/exclusions": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "console"
                ],
                "summary": "The addresses kept out of the web index",
                "operationId": "getConsoleWebExclusions",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/web.ExclusionDTO"
                                    }
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            },
            "put": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "description": "Pages already indexed that the list now excludes leave the index at once.",
                "tags": [
                    "console"
                ],
                "summary": "Replace the addresses kept out of the web index",
                "operationId": "putConsoleWebExclusions",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "type": "array",
                                "items": {
                                    "$ref": "#/components/schemas/web.ExclusionDTO"
                                }
                            }
                        }
                    },
                    "description": "Rules",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "array",
                                    "items": {
                                        "$ref": "#/components/schemas/web.ExclusionDTO"
                                    }
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Unprocessable Entity",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": {
                                        "type": "string"
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/invitation-requests": {
            "post": {
                "description": "Public: anyone may ask. The request is filed with urbangate, where the console accepts or declines it; an accepted person receives the invitation by email.",
                "tags": [
                    "invitation"
                ],
                "summary": "Ask for an invitation",
                "operationId": "requestInvitation",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/invitation.RequestDTO"
                            }
                        }
                    },
                    "description": "The visitor's request",
                    "required": true
                },
                "responses": {
                    "204": {
                        "description": "Request filed"
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/invitation.ErrorDTO"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Unprocessable Entity",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/invitation.ErrorDTO"
                                }
                            }
                        }
                    },
                    "429": {
                        "description": "Too Many Requests",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/invitation.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/invitation.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/keys": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "keys"
                ],
                "summary": "List the caller's keys for this product",
                "operationId": "listKeys",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.KeyListDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "description": "The key is signed by urbangate and returned once; it is stored nowhere.",
                "tags": [
                    "keys"
                ],
                "summary": "Issue a key the caller's application will present to this product",
                "operationId": "createKey",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/keys.CreateKeyRequest"
                            }
                        }
                    },
                    "description": "Label, and optionally the scopes",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.CreatedKeyDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    },
                    "422": {
                        "description": "Unprocessable Entity",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/api/keys/{id}": {
            "delete": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "description": "Recorded before the key is dropped: a 503 left the key working, and retrying is safe.",
                "tags": [
                    "keys"
                ],
                "summary": "Revoke one of the caller's keys",
                "operationId": "revokeKey",
                "parameters": [
                    {
                        "description": "The key's id",
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/keys.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/crawl": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "description": "By default the crawl runs one depth level inside the request and\nanswers with the pages it read and a cursor for the next level;\nPOST /crawl/next spends that cursor. No cursor means the crawl is\nexhausted. With async:true it queues the crawl instead and answers\n202 with a job id to read back from GET /crawl/{id}.\nOn the synchronous path max_pages bounds ONE call, not the whole\ncrawl: spend the cursor to read further.",
                "tags": [
                    "web"
                ],
                "summary": "Read one depth level of a site, or queue the whole crawl",
                "operationId": "startCrawl",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.crawlRequest"
                            }
                        }
                    },
                    "description": "site and scope",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "one depth level, read synchronously",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.crawlLevelResponse"
                                }
                            }
                        }
                    },
                    "202": {
                        "description": "async:true, the queued job",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/crawl.Job"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/crawl/next": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "description": "Spends the cursor POST /crawl or a previous call returned and reads\nthe depth level it stands on. The cursor in the answer replaces it;\nno cursor means the crawl is exhausted. A cursor already spent, or\nexpired, answers 404.",
                "tags": [
                    "web"
                ],
                "summary": "The next depth level of a synchronous crawl",
                "operationId": "nextCrawlLevel",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.crawlNextRequest"
                            }
                        }
                    },
                    "description": "the cursor to spend",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.crawlLevelResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/crawl/{id}": {
            "get": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "description": "Answers the job's status alone unless the call asks for content:\npages come back only with pages=true, or with a limit or an offset.\nPolling therefore costs a small object rather than every page read\nso far. This is a change of default: a caller that relied on the\npages arriving unasked must now pass pages=true.",
                "tags": [
                    "web"
                ],
                "summary": "A crawl's progress, and its pages only when asked for",
                "operationId": "crawlStatus",
                "parameters": [
                    {
                        "description": "crawl id",
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "return the pages read, not the status alone",
                        "name": "pages",
                        "in": "query",
                        "schema": {
                            "type": "boolean"
                        }
                    },
                    {
                        "description": "first page to return; implies pages=true",
                        "name": "offset",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "description": "how many pages to return; implies pages=true",
                        "name": "limit",
                        "in": "query",
                        "schema": {
                            "type": "integer"
                        }
                    },
                    {
                        "description": "text or markdown; the other is omitted",
                        "name": "format",
                        "in": "query",
                        "schema": {
                            "type": "string"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.crawlStatusResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/fetch": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "tags": [
                    "web"
                ],
                "summary": "The page's main text, rendering it when a static read comes back empty",
                "operationId": "fetchPage",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.fetchRequest"
                            }
                        }
                    },
                    "description": "page to read",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.fetchResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/healthz": {
            "get": {
                "tags": [
                    "ops"
                ],
                "summary": "Liveness",
                "operationId": "healthz",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.healthResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/locate": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "search"
                ],
                "summary": "The French town a query names, for the map to go there",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.locateRequest"
                            }
                        }
                    },
                    "description": "The query",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.TownDTO"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/map": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "tags": [
                    "web"
                ],
                "summary": "Every URL a site declares or links to, within a scope",
                "operationId": "mapSite",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.mapRequest"
                            }
                        }
                    },
                    "description": "site and scope",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.mapResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/me": {
            "delete": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "description": "The member is marked for erasure at once and the token is refused from then on; the keys the person holds are revoked by the web before this call, since a signed key verifies offline for a year.",
                "tags": [
                    "account"
                ],
                "summary": "Erase the caller's account",
                "operationId": "eraseAccount",
                "responses": {
                    "202": {
                        "description": "Erasure under way"
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "*/*": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/me/membership": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "account"
                ],
                "summary": "Where the caller's membership stands",
                "operationId": "membership",
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.MembershipDTO"
                                }
                            }
                        }
                    },
                    "401": {
                        "description": "Unauthorized",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.ErrorDTO"
                                }
                            }
                        }
                    },
                    "403": {
                        "description": "Forbidden",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.ErrorDTO"
                                }
                            }
                        }
                    },
                    "409": {
                        "description": "Conflict",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.ErrorDTO"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/account.ErrorDTO"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/place": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "search"
                ],
                "summary": "The card of a place drawn on the map, from the imported OpenStreetMap places",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.placeRequest"
                            }
                        }
                    },
                    "description": "Where the symbol is and its name",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.PlaceDTO"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/render": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "tags": [
                    "web"
                ],
                "summary": "The page's HTML after its JavaScript has run",
                "operationId": "renderPage",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.renderRequest"
                            }
                        }
                    },
                    "description": "page to render",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.renderResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/route": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "search"
                ],
                "summary": "A trip on foot, by bike or by car between two points, from Valhalla",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.routeRequest"
                            }
                        }
                    },
                    "description": "From, to and the mode: pedestrian, bicycle or auto",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/routing.Route"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/search": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "tags": [
                    "web"
                ],
                "summary": "Ranked web results, optionally with the pages' text",
                "operationId": "search",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.searchRequest"
                            }
                        }
                    },
                    "description": "query",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.searchResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "502": {
                        "description": "Bad Gateway",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/searches": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "tags": [
                    "web"
                ],
                "summary": "Record what search engines showed people for their searches, the result they opened, and the places map searches listed",
                "operationId": "recordSearches",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.searchesRequest"
                            }
                        }
                    },
                    "description": "searches and clicks, each under a pseudonym of one person and one query",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.searchesResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/signals": {
            "post": {
                "security": [
                    {
                        "BearerAuth": [
                            "tornad:search"
                        ]
                    }
                ],
                "tags": [
                    "web"
                ],
                "summary": "Record pages people visited or clicked, to feed the web index",
                "operationId": "recordSignals",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.signalsRequest"
                            }
                        }
                    },
                    "description": "installation id and signals",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.signalsResponse"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "503": {
                        "description": "Service Unavailable",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/street": {
            "post": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "search"
                ],
                "summary": "The Panoramax street photo nearest a place, within about 40 m",
                "requestBody": {
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/httpapi.streetRequest"
                            }
                        }
                    },
                    "description": "The place's position",
                    "required": true
                },
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/panoramax.Photo"
                                }
                            }
                        }
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/street/{id}/view": {
            "get": {
                "security": [
                    {
                        "BearerAuth": []
                    }
                ],
                "tags": [
                    "search"
                ],
                "summary": "The side of a 360° Panoramax picture that faces a place, as a JPEG",
                "parameters": [
                    {
                        "description": "Panoramax picture id",
                        "name": "id",
                        "in": "path",
                        "required": true,
                        "schema": {
                            "type": "string"
                        }
                    },
                    {
                        "description": "Bearing from the picture to the place, in degrees",
                        "name": "b",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "number"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "400": {
                        "description": "Bad Request",
                        "content": {
                            "image/jpeg": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "content": {
                            "image/jpeg": {
                                "schema": {
                                    "$ref": "#/components/schemas/httpapi.errorResponse"
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    "servers": [
        {
            "url": "/"
        }
    ],
    "components": {
        "securitySchemes": {
            "BearerAuth": {
                "type": "oauth2",
                "flows": {
                    "clientCredentials": {
                        "tokenUrl": "https://id.urbangate.dev/oauth2/token",
                        "scopes": {
                            "tornad:search": "Chercher, lire et rendre des pages du web"
                        }
                    }
                }
            }
        },
        "schemas": {
            "account.ErrorDTO": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    }
                }
            },
            "account.MembershipDTO": {
                "type": "object",
                "properties": {
                    "localId": {
                        "type": "string"
                    },
                    "state": {
                        "type": "string",
                        "enum": [
                            "provisioning",
                            "ready",
                            "conflict",
                            "erasing",
                            "erased"
                        ]
                    }
                }
            },
            "console.CategoryDTO": {
                "type": "object",
                "properties": {
                    "naf": {
                        "type": "string"
                    },
                    "word": {
                        "type": "string"
                    }
                }
            },
            "console.ErrorDTO": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    }
                }
            },
            "console.HealthDTO": {
                "type": "object",
                "properties": {
                    "engines": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/health.Stats"
                        }
                    },
                    "providers": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/health.Stats"
                        }
                    },
                    "sobriety": {
                        "$ref": "#/components/schemas/sobriety.Snapshot"
                    }
                }
            },
            "console.KeywordDTO": {
                "type": "object",
                "properties": {
                    "phrase": {
                        "type": "string"
                    },
                    "vertical": {
                        "type": "string"
                    }
                }
            },
            "console.ProviderDTO": {
                "type": "object",
                "properties": {
                    "enabled": {
                        "type": "boolean"
                    },
                    "position": {
                        "type": "integer"
                    },
                    "provider": {
                        "type": "string"
                    },
                    "vertical": {
                        "type": "string"
                    }
                }
            },
            "console.PublicCallerDTO": {
                "type": "object",
                "properties": {
                    "label": {
                        "type": "string"
                    },
                    "subject": {
                        "type": "string"
                    }
                }
            },
            "console.RulesDTO": {
                "type": "object",
                "properties": {
                    "categories": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.CategoryDTO"
                        }
                    },
                    "cities": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "keywords": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.KeywordDTO"
                        }
                    }
                }
            },
            "console.RuntimeDTO": {
                "type": "object",
                "properties": {
                    "answerEnabled": {
                        "type": "boolean"
                    },
                    "answerSourcesTtlSeconds": {
                        "type": "integer"
                    },
                    "imageMinThumbnails": {
                        "type": "integer"
                    },
                    "publicQuotaPerDay": {
                        "type": "integer"
                    },
                    "publicQuotaPerMinute": {
                        "type": "integer"
                    },
                    "resultCacheEnabled": {
                        "type": "boolean"
                    },
                    "resultCacheTtlSeconds": {
                        "type": "integer"
                    },
                    "routerEnabled": {
                        "type": "boolean"
                    },
                    "spellEnabled": {
                        "type": "boolean"
                    },
                    "spellSuggest": {
                        "type": "boolean"
                    }
                }
            },
            "console.SettingsDTO": {
                "type": "object",
                "properties": {
                    "catalog": {
                        "type": "object",
                        "additionalProperties": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    },
                    "providers": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.ProviderDTO"
                        }
                    },
                    "publicCallers": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.PublicCallerDTO"
                        }
                    },
                    "runtime": {
                        "$ref": "#/components/schemas/console.RuntimeDTO"
                    },
                    "visualClasses": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.VisualClassDTO"
                        }
                    }
                }
            },
            "console.UpdateSettingsRequest": {
                "type": "object",
                "properties": {
                    "providers": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.ProviderDTO"
                        }
                    },
                    "publicCallers": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.PublicCallerDTO"
                        }
                    },
                    "runtime": {
                        "$ref": "#/components/schemas/console.RuntimeDTO"
                    },
                    "visualClasses": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/console.VisualClassDTO"
                        }
                    }
                }
            },
            "console.VisualClassDTO": {
                "type": "object",
                "properties": {
                    "label": {
                        "type": "string"
                    },
                    "qid": {
                        "type": "string"
                    }
                }
            },
            "crawl.Job": {
                "type": "object",
                "properties": {
                    "created_at": {
                        "type": "string"
                    },
                    "error": {
                        "type": "string"
                    },
                    "failed": {
                        "type": "integer"
                    },
                    "id": {
                        "type": "string"
                    },
                    "pages": {
                        "type": "integer"
                    },
                    "reason": {
                        "type": "string"
                    },
                    "scope": {
                        "$ref": "#/components/schemas/crawl.Scope"
                    },
                    "status": {
                        "type": "string"
                    },
                    "truncated": {
                        "type": "boolean"
                    },
                    "updated_at": {
                        "type": "string"
                    }
                }
            },
            "crawl.Scope": {
                "type": "object",
                "properties": {
                    "exclude_paths": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "include_paths": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_depth": {
                        "type": "integer"
                    },
                    "max_pages": {
                        "type": "integer"
                    },
                    "seed": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "crawl.StoredPage": {
                "type": "object",
                "properties": {
                    "depth": {
                        "type": "integer"
                    },
                    "error": {
                        "type": "string"
                    },
                    "markdown": {
                        "type": "string"
                    },
                    "text": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "domain.Counts": {
                "type": "object",
                "properties": {
                    "ceased": {
                        "type": "integer"
                    },
                    "observed": {
                        "type": "integer"
                    },
                    "read": {
                        "type": "integer"
                    },
                    "skipped": {
                        "type": "integer"
                    }
                }
            },
            "domain.NamedPoint": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    },
                    "name": {
                        "type": "string"
                    }
                }
            },
            "health.Stats": {
                "type": "object",
                "properties": {
                    "calls": {
                        "type": "integer"
                    },
                    "captchas": {
                        "type": "integer"
                    },
                    "empty": {
                        "type": "integer"
                    },
                    "errors": {
                        "type": "integer"
                    },
                    "lastError": {
                        "type": "string"
                    },
                    "lastErrorAt": {
                        "type": "string"
                    },
                    "lastOkAt": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "ok": {
                        "type": "integer"
                    },
                    "timeouts": {
                        "type": "integer"
                    }
                }
            },
            "httpapi.MapTiles": {
                "type": "object",
                "properties": {
                    "attribution": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.PlaceDTO": {
                "type": "object",
                "properties": {
                    "address": {
                        "type": "string"
                    },
                    "category": {
                        "type": "string"
                    },
                    "cuisine": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "hours": {
                        "type": "string"
                    },
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    },
                    "name": {
                        "type": "string"
                    },
                    "open_now": {
                        "type": "boolean"
                    },
                    "phone": {
                        "type": "string"
                    },
                    "photo": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "website": {
                        "type": "string"
                    }
                }
            },
            "httpapi.TownDTO": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string"
                    },
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    },
                    "postcode": {
                        "type": "string"
                    }
                }
            },
            "httpapi.answerRequest": {
                "type": "object",
                "properties": {
                    "deadline_ms": {
                        "type": "integer"
                    },
                    "language": {
                        "type": "string"
                    },
                    "limit": {
                        "type": "integer"
                    },
                    "near": {
                        "description": "Near is the browser's position, opt-in; it is used for this request\nonly and never cached or stored.",
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/httpapi.nearPoint"
                            }
                        ]
                    },
                    "no_cache": {
                        "type": "boolean"
                    },
                    "q": {
                        "type": "string"
                    }
                }
            },
            "httpapi.answerResponse": {
                "type": "object",
                "properties": {
                    "answer_id": {
                        "description": "AnswerID reads the sources back on GET /answer/{id}/sources for a\nshort while; absent when no store is configured.",
                        "type": "string"
                    },
                    "city": {
                        "type": "string"
                    },
                    "corrected": {
                        "description": "Corrected is the respelt query the results answer, when q as typed\nfound nothing; absent otherwise.",
                        "type": "string"
                    },
                    "excerpts": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.excerpt"
                        }
                    },
                    "featured": {
                        "$ref": "#/components/schemas/httpapi.featured"
                    },
                    "images": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.image"
                        }
                    },
                    "local": {
                        "description": "Local holds the filters and the map of a local answer.",
                        "allOf": [
                            {
                                "$ref": "#/components/schemas/httpapi.localView"
                            }
                        ]
                    },
                    "panel": {
                        "$ref": "#/components/schemas/httpapi.panel"
                    },
                    "partial": {
                        "type": "boolean"
                    },
                    "query": {
                        "type": "string"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.result"
                        }
                    },
                    "routed": {
                        "type": "boolean"
                    },
                    "sources": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.source"
                        }
                    },
                    "suggested": {
                        "description": "Suggested is a respelt query offered beside results q did find.",
                        "type": "string"
                    },
                    "vertical": {
                        "type": "string"
                    }
                }
            },
            "httpapi.crawlLevelResponse": {
                "type": "object",
                "properties": {
                    "cursor": {
                        "type": "string"
                    },
                    "depth": {
                        "type": "integer"
                    },
                    "pages": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/crawl.StoredPage"
                        }
                    },
                    "read": {
                        "type": "integer"
                    },
                    "reason": {
                        "type": "string"
                    },
                    "truncated": {
                        "type": "boolean"
                    }
                }
            },
            "httpapi.crawlNextRequest": {
                "type": "object",
                "properties": {
                    "cursor": {
                        "type": "string"
                    },
                    "deadline_ms": {
                        "type": "integer"
                    },
                    "format": {
                        "type": "string"
                    }
                }
            },
            "httpapi.crawlRequest": {
                "type": "object",
                "properties": {
                    "async": {
                        "description": "Async queues the crawl and answers 202 with a job id, the shape an\nindexing pipeline reads back later. Absent, the crawl runs one depth\nlevel in the request and answers with the pages it read.",
                        "type": "boolean"
                    },
                    "deadline_ms": {
                        "description": "DeadlineMS bounds one synchronous level, clamped to maxCrawlDeadline.",
                        "type": "integer"
                    },
                    "exclude_paths": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "format": {
                        "type": "string"
                    },
                    "include_paths": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "max_depth": {
                        "type": "integer"
                    },
                    "max_pages": {
                        "type": "integer"
                    },
                    "seed": {
                        "description": "Seed \"sitemap\" starts the crawl from every URL the site declares.",
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.crawlStatusResponse": {
                "type": "object",
                "properties": {
                    "created_at": {
                        "type": "string"
                    },
                    "error": {
                        "type": "string"
                    },
                    "failed": {
                        "type": "integer"
                    },
                    "id": {
                        "type": "string"
                    },
                    "next": {
                        "type": "integer"
                    },
                    "pages": {
                        "type": "integer"
                    },
                    "reason": {
                        "type": "string"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/crawl.StoredPage"
                        }
                    },
                    "scope": {
                        "$ref": "#/components/schemas/crawl.Scope"
                    },
                    "status": {
                        "type": "string"
                    },
                    "truncated": {
                        "type": "boolean"
                    },
                    "updated_at": {
                        "type": "string"
                    }
                }
            },
            "httpapi.errorResponse": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    }
                }
            },
            "httpapi.excerpt": {
                "type": "object",
                "properties": {
                    "n": {
                        "type": "integer"
                    },
                    "text": {
                        "type": "string"
                    }
                }
            },
            "httpapi.featured": {
                "type": "object",
                "properties": {
                    "description": {
                        "type": "string"
                    },
                    "domain": {
                        "type": "string"
                    },
                    "icon": {
                        "type": "string"
                    },
                    "name": {
                        "type": "string"
                    },
                    "preview": {
                        "type": "string"
                    },
                    "sitelinks": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.sitelink"
                        }
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.fetchRequest": {
                "type": "object",
                "properties": {
                    "format": {
                        "description": "Format picks which rendering of the page comes back: \"text\" flattens\nit, \"markdown\" keeps headings, tables and links. Empty returns both.",
                        "type": "string"
                    },
                    "max_runes": {
                        "type": "integer"
                    },
                    "paginate": {
                        "type": "integer"
                    },
                    "render": {
                        "type": "boolean"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.fetchResponse": {
                "type": "object",
                "properties": {
                    "markdown": {
                        "type": "string"
                    },
                    "pages": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "text": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    }
                }
            },
            "httpapi.healthResponse": {
                "type": "object",
                "properties": {
                    "ok": {
                        "type": "boolean"
                    }
                }
            },
            "httpapi.image": {
                "type": "object",
                "properties": {
                    "height": {
                        "type": "integer"
                    },
                    "site": {
                        "type": "string"
                    },
                    "src": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "width": {
                        "type": "integer"
                    }
                }
            },
            "httpapi.localFilter": {
                "type": "object",
                "properties": {
                    "id": {
                        "type": "string"
                    },
                    "label": {
                        "type": "string"
                    }
                }
            },
            "httpapi.localView": {
                "type": "object",
                "properties": {
                    "filters": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.localFilter"
                        }
                    },
                    "tiles": {
                        "$ref": "#/components/schemas/httpapi.MapTiles"
                    }
                }
            },
            "httpapi.locateRequest": {
                "type": "object",
                "properties": {
                    "q": {
                        "type": "string"
                    }
                }
            },
            "httpapi.mapRequest": {
                "type": "object",
                "properties": {
                    "deadline_ms": {
                        "type": "integer"
                    },
                    "exclude_paths": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "include_paths": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "limit": {
                        "type": "integer"
                    },
                    "max_depth": {
                        "type": "integer"
                    },
                    "max_pages": {
                        "type": "integer"
                    },
                    "seed": {
                        "description": "Seed \"sitemap\" starts the crawl from every URL the site declares.",
                        "type": "string"
                    },
                    "sitemap": {
                        "description": "Sitemap reads the site's sitemaps before walking its links. On by\ndefault: it is the cheapest and most complete source there is.",
                        "type": "boolean"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.mapResponse": {
                "type": "object",
                "properties": {
                    "links": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.nearPoint": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    }
                }
            },
            "httpapi.openGraph": {
                "type": "object",
                "properties": {
                    "description": {
                        "type": "string"
                    },
                    "image": {
                        "type": "string"
                    },
                    "site_name": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "type": {
                        "type": "string"
                    }
                }
            },
            "httpapi.panel": {
                "type": "object",
                "properties": {
                    "image": {
                        "type": "string"
                    },
                    "site": {
                        "type": "string"
                    },
                    "summary": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.placeRequest": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    },
                    "name": {
                        "type": "string"
                    }
                }
            },
            "httpapi.renderRequest": {
                "type": "object",
                "properties": {
                    "timeout_ms": {
                        "type": "integer"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.renderResponse": {
                "type": "object",
                "properties": {
                    "final_url": {
                        "type": "string"
                    },
                    "html": {
                        "type": "string"
                    }
                }
            },
            "httpapi.result": {
                "type": "object",
                "properties": {
                    "address": {
                        "type": "string"
                    },
                    "audio_url": {
                        "type": "string"
                    },
                    "author": {
                        "type": "string"
                    },
                    "category": {
                        "type": "string"
                    },
                    "closes_at": {
                        "type": "string"
                    },
                    "content_error": {
                        "type": "string"
                    },
                    "description": {
                        "type": "string"
                    },
                    "distance_m": {
                        "type": "integer"
                    },
                    "duration": {
                        "type": "string"
                    },
                    "favicon": {
                        "type": "string"
                    },
                    "featured": {
                        "type": "boolean"
                    },
                    "filters": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "freshness": {
                        "type": "string"
                    },
                    "hours": {
                        "type": "string"
                    },
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    },
                    "markdown": {
                        "type": "string"
                    },
                    "open_graph": {
                        "$ref": "#/components/schemas/httpapi.openGraph"
                    },
                    "open_now": {
                        "type": "boolean"
                    },
                    "opens_at": {
                        "type": "string"
                    },
                    "phone": {
                        "type": "string"
                    },
                    "preview": {
                        "type": "string"
                    },
                    "published_at": {
                        "type": "string"
                    },
                    "rating": {
                        "type": "string"
                    },
                    "score": {
                        "type": "number"
                    },
                    "since": {
                        "type": "integer"
                    },
                    "sirene_active": {
                        "description": "SireneActive is true when the place is an active SIRENE\nestablishment; Since is its creation year there.",
                        "type": "boolean"
                    },
                    "siret": {
                        "type": "string"
                    },
                    "site_name": {
                        "type": "string"
                    },
                    "source": {
                        "type": "string"
                    },
                    "source_type": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "text": {
                        "type": "string"
                    },
                    "thumbnail": {
                        "type": "string"
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    },
                    "verified": {
                        "type": "boolean"
                    },
                    "website": {
                        "type": "string"
                    }
                }
            },
            "httpapi.routeRequest": {
                "type": "object",
                "properties": {
                    "from": {
                        "$ref": "#/components/schemas/routing.Point"
                    },
                    "mode": {
                        "$ref": "#/components/schemas/routing.Mode"
                    },
                    "to": {
                        "$ref": "#/components/schemas/routing.Point"
                    }
                }
            },
            "httpapi.searchRequest": {
                "type": "object",
                "properties": {
                    "categories": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "content": {
                        "description": "Content reads the first N results' pages into the response, so one\ncall gives an agent what it would otherwise fetch one by one.",
                        "type": "integer"
                    },
                    "content_runes": {
                        "type": "integer"
                    },
                    "deadline_ms": {
                        "type": "integer"
                    },
                    "format": {
                        "type": "string"
                    },
                    "language": {
                        "type": "string"
                    },
                    "limit": {
                        "type": "integer"
                    },
                    "no_cache": {
                        "description": "NoCache bypasses the result cache, for a caller that needs a fresh\nsearch whatever the runtime settings say.",
                        "type": "boolean"
                    },
                    "origin": {
                        "description": "Origin \"agent\" marks a search an assistant made for someone: its\nresults feed the web index but never count as what people chose.",
                        "type": "string",
                        "enum": [
                            "agent"
                        ]
                    },
                    "page": {
                        "type": "integer"
                    },
                    "q": {
                        "type": "string"
                    },
                    "route": {
                        "description": "Route asks the vertical engine, as /answer does, and names the\nvertical in the response. Ignored when Categories is set, so a\ncaller that names its categories keeps today's results exactly.",
                        "type": "boolean"
                    },
                    "time_range": {
                        "type": "string"
                    }
                }
            },
            "httpapi.searchResponse": {
                "type": "object",
                "properties": {
                    "partial": {
                        "type": "boolean"
                    },
                    "query": {
                        "type": "string"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.result"
                        }
                    },
                    "vertical": {
                        "type": "string"
                    }
                }
            },
            "httpapi.searchesRequest": {
                "type": "object",
                "properties": {
                    "clicks": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.sharedClick"
                        }
                    },
                    "local_searches": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.sharedLocalSearch"
                        }
                    },
                    "searches": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.sharedSearch"
                        }
                    }
                }
            },
            "httpapi.searchesResponse": {
                "type": "object",
                "properties": {
                    "recorded": {
                        "type": "integer"
                    },
                    "refused": {
                        "type": "integer"
                    }
                }
            },
            "httpapi.sharedClick": {
                "type": "object",
                "properties": {
                    "at": {
                        "type": "string"
                    },
                    "engine": {
                        "type": "string"
                    },
                    "install": {
                        "type": "string"
                    },
                    "q": {
                        "type": "string"
                    },
                    "rank": {
                        "type": "integer"
                    },
                    "trusted": {
                        "type": "boolean"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.sharedLocalSearch": {
                "type": "object",
                "properties": {
                    "at": {
                        "type": "string"
                    },
                    "engine": {
                        "type": "string"
                    },
                    "install": {
                        "type": "string"
                    },
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    },
                    "places": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/domain.NamedPoint"
                        }
                    },
                    "q": {
                        "type": "string"
                    },
                    "trusted": {
                        "type": "boolean"
                    }
                }
            },
            "httpapi.sharedSearch": {
                "type": "object",
                "properties": {
                    "at": {
                        "type": "string"
                    },
                    "engine": {
                        "type": "string"
                    },
                    "install": {
                        "type": "string"
                    },
                    "q": {
                        "type": "string"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "trusted": {
                        "type": "boolean"
                    }
                }
            },
            "httpapi.signalRecord": {
                "type": "object",
                "properties": {
                    "at": {
                        "type": "string"
                    },
                    "kind": {
                        "type": "string",
                        "enum": [
                            "visit",
                            "click"
                        ]
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.signalsRequest": {
                "type": "object",
                "properties": {
                    "install": {
                        "description": "Install is the caller's anonymous installation id, rotated by the\ncaller; it only tells distinct people apart.",
                        "type": "string"
                    },
                    "signals": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.signalRecord"
                        }
                    }
                }
            },
            "httpapi.signalsResponse": {
                "type": "object",
                "properties": {
                    "queued": {
                        "type": "integer"
                    },
                    "recorded": {
                        "type": "integer"
                    },
                    "refused": {
                        "type": "integer"
                    }
                }
            },
            "httpapi.sitelink": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.source": {
                "type": "object",
                "properties": {
                    "excerpt": {
                        "type": "string"
                    },
                    "n": {
                        "type": "integer"
                    },
                    "title": {
                        "type": "string"
                    },
                    "url": {
                        "type": "string"
                    }
                }
            },
            "httpapi.storedSources": {
                "type": "object",
                "properties": {
                    "excerpts": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.excerpt"
                        }
                    },
                    "query": {
                        "type": "string"
                    },
                    "results": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.result"
                        }
                    },
                    "sources": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/httpapi.source"
                        }
                    },
                    "vertical": {
                        "type": "string"
                    }
                }
            },
            "httpapi.streetRequest": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    }
                }
            },
            "httpapi.usageRequest": {
                "type": "object",
                "properties": {
                    "input_tokens": {
                        "type": "integer"
                    },
                    "output_tokens": {
                        "type": "integer"
                    }
                }
            },
            "ingest.ErrorDTO": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    }
                }
            },
            "ingest.ImportRunDTO": {
                "type": "object",
                "properties": {
                    "counts": {
                        "$ref": "#/components/schemas/domain.Counts"
                    },
                    "departments": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "endedAt": {
                        "type": "string"
                    },
                    "error": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    },
                    "source": {
                        "type": "string"
                    },
                    "startedAt": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "vintage": {
                        "type": "string"
                    }
                }
            },
            "ingest.ImportStartedDTO": {
                "type": "object",
                "properties": {
                    "vintage": {
                        "type": "string"
                    }
                }
            },
            "ingest.ImportsDTO": {
                "type": "object",
                "properties": {
                    "runs": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/ingest.ImportRunDTO"
                        }
                    }
                }
            },
            "invitation.ErrorDTO": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    }
                }
            },
            "invitation.RequestDTO": {
                "type": "object",
                "properties": {
                    "email": {
                        "type": "string"
                    },
                    "message": {
                        "type": "string"
                    }
                }
            },
            "keys.CreateKeyRequest": {
                "type": "object",
                "properties": {
                    "label": {
                        "type": "string"
                    },
                    "scopes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "keys.CreatedKeyDTO": {
                "type": "object",
                "properties": {
                    "audience": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "createdAt": {
                        "type": "string"
                    },
                    "expiresAt": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    },
                    "label": {
                        "type": "string"
                    },
                    "scopes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "secret": {
                        "type": "string"
                    }
                }
            },
            "keys.ErrorDTO": {
                "type": "object",
                "properties": {
                    "error": {
                        "type": "string"
                    }
                }
            },
            "keys.KeyDTO": {
                "type": "object",
                "properties": {
                    "audience": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    },
                    "createdAt": {
                        "type": "string"
                    },
                    "expiresAt": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    },
                    "label": {
                        "type": "string"
                    },
                    "scopes": {
                        "type": "array",
                        "items": {
                            "type": "string"
                        }
                    }
                }
            },
            "keys.KeyListDTO": {
                "type": "object",
                "properties": {
                    "keys": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/keys.KeyDTO"
                        }
                    }
                }
            },
            "panoramax.Photo": {
                "type": "object",
                "properties": {
                    "bearing": {
                        "type": "number"
                    },
                    "id": {
                        "type": "string"
                    },
                    "panorama": {
                        "type": "boolean"
                    },
                    "taken": {
                        "type": "string"
                    },
                    "thumb": {
                        "type": "string"
                    },
                    "viewer": {
                        "type": "string"
                    }
                }
            },
            "routing.Mode": {
                "type": "string",
                "enum": [
                    "pedestrian",
                    "bicycle",
                    "auto"
                ],
                "x-enum-varnames": [
                    "Walk",
                    "Bike",
                    "Car"
                ]
            },
            "routing.Point": {
                "type": "object",
                "properties": {
                    "lat": {
                        "type": "number"
                    },
                    "lon": {
                        "type": "number"
                    }
                }
            },
            "routing.Route": {
                "type": "object",
                "properties": {
                    "distance_m": {
                        "type": "number"
                    },
                    "duration_s": {
                        "type": "number"
                    },
                    "mode": {
                        "$ref": "#/components/schemas/routing.Mode"
                    },
                    "shape": {
                        "type": "array",
                        "items": {
                            "type": "array",
                            "items": {
                                "type": "number",
                                "format": "float64"
                            }
                        }
                    },
                    "steps": {
                        "type": "array",
                        "items": {
                            "$ref": "#/components/schemas/routing.Step"
                        }
                    }
                }
            },
            "routing.Step": {
                "type": "object",
                "properties": {
                    "distance_m": {
                        "type": "number"
                    },
                    "instruction": {
                        "type": "string"
                    }
                }
            },
            "sobriety.Snapshot": {
                "type": "object",
                "properties": {
                    "answers": {
                        "type": "integer"
                    },
                    "bytesPerPage": {
                        "type": "number"
                    },
                    "carbonIntensity": {
                        "type": "number"
                    },
                    "energyJoules": {
                        "type": "number"
                    },
                    "energyMeasured": {
                        "type": "boolean"
                    },
                    "gco2ePer1000Queries": {
                        "type": "number"
                    },
                    "pages": {
                        "type": "integer"
                    },
                    "queries": {
                        "type": "integer"
                    },
                    "tokensPerAnswer": {
                        "type": "number"
                    },
                    "whPer1000Queries": {
                        "type": "number"
                    }
                }
            },
            "spelling.importRun": {
                "type": "object",
                "properties": {
                    "articles": {
                        "type": "integer"
                    },
                    "endedAt": {
                        "type": "string"
                    },
                    "error": {
                        "type": "string"
                    },
                    "id": {
                        "type": "string"
                    },
                    "pairs": {
                        "type": "integer"
                    },
                    "shards": {
                        "type": "integer"
                    },
                    "source": {
                        "type": "string"
                    },
                    "startedAt": {
                        "type": "string"
                    },
                    "status": {
                        "type": "string"
                    },
                    "terms": {
                        "type": "integer"
                    },
                    "vintage": {
                        "type": "string"
                    }
                }
            },
            "spelling.importStarted": {
                "type": "object",
                "properties": {
                    "vintage": {
                        "type": "string"
                    },
                    "wiki": {
                        "type": "string"
                    }
                }
            },
            "web.ExclusionDTO": {
                "type": "object",
                "properties": {
                    "label": {
                        "type": "string"
                    },
                    "rule": {
                        "type": "string"
                    }
                }
            }
        }
    }
}