{
  "openapi": "3.1.0",
  "info": {
    "title": "Zephior Public Discovery API",
    "version": "1.0.0",
    "description": "Read Zephior service information and search the multilingual library of published articles, guides, comparisons, industry briefs and glossary resources. This versioned public API is read-only and requires no authentication.",
    "termsOfService": "https://zephior.com/terms",
    "license": {
      "name": "Zephior website terms",
      "url": "https://zephior.com/terms"
    },
    "contact": {
      "name": "Zephior developer support",
      "email": "hello@zephior.com",
      "url": "https://zephior.com/contact"
    }
  },
  "security": [],
  "externalDocs": {
    "description": "Zephior developer documentation",
    "url": "https://zephior.com/developers"
  },
  "servers": [
    {
      "url": "https://zephior.com/api/v1",
      "description": "Production public discovery API v1"
    }
  ],
  "tags": [
    {
      "name": "Discovery",
      "description": "Machine-readable Zephior company and service information."
    },
    {
      "name": "Search",
      "description": "Read-only search across Zephior published resources."
    }
  ],
  "paths": {
    "/": {
      "get": {
        "operationId": "getZephiorDiscoveryApiIndex",
        "tags": [
          "Discovery"
        ],
        "summary": "Get the API index",
        "description": "Returns the current public API version, status, authentication policy and canonical endpoint links.",
        "responses": {
          "200": {
            "description": "API index",
            "headers": {
              "RateLimit-Limit": {
                "description": "Maximum requests available in the current public-discovery window.",
                "schema": {
                  "type": "integer",
                  "example": 120
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests remaining in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 119
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "IETF structured rate-limit policy for the public discovery API.",
                "schema": {
                  "type": "string",
                  "example": "\"public-discovery\";q=120;w=60"
                }
              },
              "Deprecation": {
                "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
                "schema": {
                  "type": "string",
                  "example": "@1751328000"
                }
              },
              "Sunset": {
                "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
                "schema": {
                  "type": "string",
                  "format": "http-date",
                  "example": "Wed, 31 Dec 2028 23:59:59 GMT"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/site": {
      "get": {
        "operationId": "getZephiorSiteOverview",
        "tags": [
          "Discovery"
        ],
        "summary": "Get the Zephior site and service overview",
        "description": "Returns machine-readable company identity, the four Zephior services, contact details and canonical developer resources in English, German or French.",
        "parameters": [
          {
            "$ref": "#/components/parameters/Locale"
          }
        ],
        "responses": {
          "200": {
            "description": "Zephior site overview",
            "headers": {
              "RateLimit-Limit": {
                "description": "Maximum requests available in the current public-discovery window.",
                "schema": {
                  "type": "integer",
                  "example": 120
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests remaining in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 119
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "IETF structured rate-limit policy for the public discovery API.",
                "schema": {
                  "type": "string",
                  "example": "\"public-discovery\";q=120;w=60"
                }
              },
              "Deprecation": {
                "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
                "schema": {
                  "type": "string",
                  "example": "@1751328000"
                }
              },
              "Sunset": {
                "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
                "schema": {
                  "type": "string",
                  "format": "http-date",
                  "example": "Wed, 31 Dec 2028 23:59:59 GMT"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SiteOverview"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/search": {
      "get": {
        "operationId": "searchZephiorPublishedResources",
        "tags": [
          "Search"
        ],
        "summary": "Search Zephior published resources",
        "description": "Searches titles, summaries, primary keywords and related topics across the published Zephior content corpus without collecting or mutating user data.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "Search topic containing 2 to 200 characters.",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 200
            },
            "example": "RFP automation"
          },
          {
            "$ref": "#/components/parameters/Locale"
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Maximum number of results.",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 25,
              "default": 10
            }
          },
          {
            "$ref": "#/components/parameters/Cursor"
          }
        ],
        "responses": {
          "200": {
            "description": "Ranked published resources",
            "headers": {
              "RateLimit-Limit": {
                "description": "Maximum requests available in the current public-discovery window.",
                "schema": {
                  "type": "integer",
                  "example": 120
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests remaining in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 119
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "IETF structured rate-limit policy for the public discovery API.",
                "schema": {
                  "type": "string",
                  "example": "\"public-discovery\";q=120;w=60"
                }
              },
              "Deprecation": {
                "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
                "schema": {
                  "type": "string",
                  "example": "@1751328000"
                }
              },
              "Sunset": {
                "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
                "schema": {
                  "type": "string",
                  "format": "http-date",
                  "example": "Wed, 31 Dec 2028 23:59:59 GMT"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/queries": {
      "post": {
        "operationId": "createZephiorDiscoveryQueryJob",
        "tags": [
          "Search"
        ],
        "summary": "Create an asynchronous discovery query",
        "description": "Creates an idempotent public-resource query job and returns 202 Accepted with a Location header for the completed job resource.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/QueryJobRequest"
              }
            }
          }
        },
        "responses": {
          "202": {
            "description": "Query accepted and available at the Location URI",
            "headers": {
              "RateLimit-Limit": {
                "description": "Maximum requests available in the current public-discovery window.",
                "schema": {
                  "type": "integer",
                  "example": 120
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests remaining in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 119
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "IETF structured rate-limit policy for the public discovery API.",
                "schema": {
                  "type": "string",
                  "example": "\"public-discovery\";q=120;w=60"
                }
              },
              "Deprecation": {
                "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
                "schema": {
                  "type": "string",
                  "example": "@1751328000"
                }
              },
              "Sunset": {
                "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
                "schema": {
                  "type": "string",
                  "format": "http-date",
                  "example": "Wed, 31 Dec 2028 23:59:59 GMT"
                }
              },
              "Location": {
                "description": "Canonical job status URI.",
                "schema": {
                  "type": "string",
                  "format": "uri"
                }
              },
              "Retry-After": {
                "description": "Seconds before polling the job URI.",
                "schema": {
                  "type": "integer",
                  "example": 1
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DiscoveryJob"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/jobs/{jobId}": {
      "get": {
        "operationId": "getZephiorDiscoveryQueryJob",
        "tags": [
          "Search"
        ],
        "summary": "Get a discovery query job",
        "description": "Returns one completed public-resource query job by the opaque identifier from its Location URI.",
        "parameters": [
          {
            "name": "jobId",
            "in": "path",
            "required": true,
            "description": "Opaque job identifier returned by POST /queries.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Completed query job",
            "headers": {
              "RateLimit-Limit": {
                "description": "Maximum requests available in the current public-discovery window.",
                "schema": {
                  "type": "integer",
                  "example": 120
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests remaining in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 119
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "IETF structured rate-limit policy for the public discovery API.",
                "schema": {
                  "type": "string",
                  "example": "\"public-discovery\";q=120;w=60"
                }
              },
              "Deprecation": {
                "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
                "schema": {
                  "type": "string",
                  "example": "@1751328000"
                }
              },
              "Sunset": {
                "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
                "schema": {
                  "type": "string",
                  "format": "http-date",
                  "example": "Wed, 31 Dec 2028 23:59:59 GMT"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DiscoveryJob"
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    },
    "/batch": {
      "post": {
        "operationId": "batchZephiorDiscoveryRequests",
        "tags": [
          "Discovery",
          "Search"
        ],
        "summary": "Run a batch of discovery reads",
        "description": "Runs 1 to 25 site-overview or resource-search operations in one idempotent request.",
        "parameters": [
          {
            "$ref": "#/components/parameters/IdempotencyKey"
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/BatchRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Ordered batch results",
            "headers": {
              "RateLimit-Limit": {
                "description": "Maximum requests available in the current public-discovery window.",
                "schema": {
                  "type": "integer",
                  "example": 120
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests remaining in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 119
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current rate-limit window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "IETF structured rate-limit policy for the public discovery API.",
                "schema": {
                  "type": "string",
                  "example": "\"public-discovery\";q=120;w=60"
                }
              },
              "Deprecation": {
                "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
                "schema": {
                  "type": "string",
                  "example": "@1751328000"
                }
              },
              "Sunset": {
                "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
                "schema": {
                  "type": "string",
                  "format": "http-date",
                  "example": "Wed, 31 Dec 2028 23:59:59 GMT"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/BatchResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/ServerError"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "zephiorOAuth": {
        "type": "oauth2",
        "description": "Zephior product accounts use OAuth 2.0 and OpenID Connect. Product authorization is further restricted by organization roles and separate permissions. The public discovery endpoints in this specification require no token.",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://auth.zephior.com/oauth/v2/authorize",
            "tokenUrl": "https://auth.zephior.com/oauth/v2/token",
            "scopes": {
              "openid": "Identify the signed-in user.",
              "profile": "Read the signed-in user profile.",
              "email": "Read the signed-in user email address.",
              "offline_access": "Request a refresh token when the client is eligible."
            }
          }
        }
      }
    },
    "parameters": {
      "Locale": {
        "name": "locale",
        "in": "query",
        "description": "Requested authored language.",
        "schema": {
          "type": "string",
          "enum": [
            "en",
            "de",
            "fr"
          ],
          "default": "en"
        }
      },
      "Cursor": {
        "name": "cursor",
        "in": "query",
        "description": "Opaque cursor returned as nextCursor by the preceding page.",
        "schema": {
          "type": "string",
          "pattern": "^zph_[0-9]+$"
        }
      },
      "IdempotencyKey": {
        "name": "Idempotency-Key",
        "in": "header",
        "required": true,
        "description": "Stable unique key for one logical write-style request. Reuse the same key only when retrying that request.",
        "schema": {
          "type": "string",
          "minLength": 8,
          "maxLength": 200
        }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Invalid query parameter",
        "headers": {
          "RateLimit-Limit": {
            "description": "Maximum requests available in the current public-discovery window.",
            "schema": {
              "type": "integer",
              "example": 120
            }
          },
          "RateLimit-Remaining": {
            "description": "Requests remaining in the current window.",
            "schema": {
              "type": "integer",
              "example": 119
            }
          },
          "RateLimit-Reset": {
            "description": "Seconds until the current rate-limit window resets.",
            "schema": {
              "type": "integer",
              "example": 60
            }
          },
          "RateLimit-Policy": {
            "description": "IETF structured rate-limit policy for the public discovery API.",
            "schema": {
              "type": "string",
              "example": "\"public-discovery\";q=120;w=60"
            }
          },
          "Deprecation": {
            "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
            "schema": {
              "type": "string",
              "example": "@1751328000"
            }
          },
          "Sunset": {
            "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
            "schema": {
              "type": "string",
              "format": "http-date",
              "example": "Wed, 31 Dec 2028 23:59:59 GMT"
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Public API rate limit exceeded",
        "headers": {
          "RateLimit-Limit": {
            "description": "Maximum requests available in the current public-discovery window.",
            "schema": {
              "type": "integer",
              "example": 120
            }
          },
          "RateLimit-Remaining": {
            "description": "Requests remaining in the current window.",
            "schema": {
              "type": "integer",
              "example": 119
            }
          },
          "RateLimit-Reset": {
            "description": "Seconds until the current rate-limit window resets.",
            "schema": {
              "type": "integer",
              "example": 60
            }
          },
          "RateLimit-Policy": {
            "description": "IETF structured rate-limit policy for the public discovery API.",
            "schema": {
              "type": "string",
              "example": "\"public-discovery\";q=120;w=60"
            }
          },
          "Deprecation": {
            "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
            "schema": {
              "type": "string",
              "example": "@1751328000"
            }
          },
          "Sunset": {
            "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
            "schema": {
              "type": "string",
              "format": "http-date",
              "example": "Wed, 31 Dec 2028 23:59:59 GMT"
            }
          },
          "Retry-After": {
            "description": "Seconds to wait before retrying.",
            "schema": {
              "type": "integer",
              "example": 60
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "The requested resource does not exist or has expired",
        "headers": {
          "RateLimit-Limit": {
            "description": "Maximum requests available in the current public-discovery window.",
            "schema": {
              "type": "integer",
              "example": 120
            }
          },
          "RateLimit-Remaining": {
            "description": "Requests remaining in the current window.",
            "schema": {
              "type": "integer",
              "example": 119
            }
          },
          "RateLimit-Reset": {
            "description": "Seconds until the current rate-limit window resets.",
            "schema": {
              "type": "integer",
              "example": 60
            }
          },
          "RateLimit-Policy": {
            "description": "IETF structured rate-limit policy for the public discovery API.",
            "schema": {
              "type": "string",
              "example": "\"public-discovery\";q=120;w=60"
            }
          },
          "Deprecation": {
            "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
            "schema": {
              "type": "string",
              "example": "@1751328000"
            }
          },
          "Sunset": {
            "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
            "schema": {
              "type": "string",
              "format": "http-date",
              "example": "Wed, 31 Dec 2028 23:59:59 GMT"
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "ServerError": {
        "description": "Unexpected server error",
        "headers": {
          "RateLimit-Limit": {
            "description": "Maximum requests available in the current public-discovery window.",
            "schema": {
              "type": "integer",
              "example": 120
            }
          },
          "RateLimit-Remaining": {
            "description": "Requests remaining in the current window.",
            "schema": {
              "type": "integer",
              "example": 119
            }
          },
          "RateLimit-Reset": {
            "description": "Seconds until the current rate-limit window resets.",
            "schema": {
              "type": "integer",
              "example": 60
            }
          },
          "RateLimit-Policy": {
            "description": "IETF structured rate-limit policy for the public discovery API.",
            "schema": {
              "type": "string",
              "example": "\"public-discovery\";q=120;w=60"
            }
          },
          "Deprecation": {
            "description": "RFC 9745 deprecation signal. Omitted while v1 is active; a future deprecated response carries an HTTP-date or true value.",
            "schema": {
              "type": "string",
              "example": "@1751328000"
            }
          },
          "Sunset": {
            "description": "RFC 8594 date after which a deprecated API version may stop responding. Omitted while v1 is active.",
            "schema": {
              "type": "string",
              "format": "http-date",
              "example": "Wed, 31 Dec 2028 23:59:59 GMT"
            }
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "schemas": {
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "status",
          "authentication",
          "readOnly",
          "endpoints",
          "openapi"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "version": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "operational"
            ]
          },
          "authentication": {
            "type": "string",
            "enum": [
              "none"
            ]
          },
          "readOnly": {
            "type": "boolean",
            "const": true
          },
          "endpoints": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "documentation": {
            "type": "string",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "versioningPolicy": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Service": {
        "type": "object",
        "required": [
          "id",
          "name",
          "description",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "enum": [
              "ziva",
              "zelius",
              "zeke",
              "zenith"
            ]
          },
          "name": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "SiteOverview": {
        "type": "object",
        "required": [
          "name",
          "legalName",
          "description",
          "url",
          "locale",
          "services",
          "contact",
          "developerResources",
          "publishedResourceCount",
          "updatedAt"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "legalName": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "fr"
            ]
          },
          "localeName": {
            "type": "string"
          },
          "services": {
            "type": "array",
            "minItems": 4,
            "maxItems": 4,
            "items": {
              "$ref": "#/components/schemas/Service"
            }
          },
          "contact": {
            "type": "object",
            "additionalProperties": true
          },
          "developerResources": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          },
          "publishedResourceCount": {
            "type": "integer",
            "minimum": 0
          },
          "updatedAt": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "SearchResult": {
        "type": "object",
        "required": [
          "id",
          "title",
          "summary",
          "primaryKeyword",
          "collection",
          "service",
          "author",
          "locale",
          "published",
          "modified",
          "url",
          "relevance"
        ],
        "properties": {
          "id": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "primaryKeyword": {
            "type": "string"
          },
          "collection": {
            "type": "string",
            "enum": [
              "insights",
              "solutions",
              "industries",
              "compare",
              "glossary"
            ]
          },
          "service": {
            "type": "string",
            "enum": [
              "ziva",
              "zelius",
              "zeke",
              "zenith"
            ]
          },
          "author": {
            "type": "string"
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "fr"
            ]
          },
          "published": {
            "type": "string",
            "format": "date"
          },
          "modified": {
            "type": "string",
            "format": "date"
          },
          "url": {
            "type": "string",
            "format": "uri"
          },
          "relevance": {
            "type": "integer",
            "minimum": 1
          }
        }
      },
      "SearchResponse": {
        "type": "object",
        "required": [
          "query",
          "locale",
          "count",
          "nextCursor",
          "next_cursor",
          "has_more",
          "results",
          "links"
        ],
        "properties": {
          "query": {
            "type": "string"
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "fr"
            ]
          },
          "count": {
            "type": "integer",
            "minimum": 0
          },
          "nextCursor": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^zph_[0-9]+$"
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ],
            "pattern": "^zph_[0-9]+$",
            "description": "Opaque cursor for the next page; null on the final page."
          },
          "has_more": {
            "type": "boolean"
          },
          "results": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResult"
            }
          },
          "links": {
            "type": "object",
            "additionalProperties": {
              "type": "string",
              "format": "uri"
            }
          }
        }
      },
      "QueryJobRequest": {
        "type": "object",
        "required": [
          "query"
        ],
        "additionalProperties": false,
        "properties": {
          "query": {
            "type": "string",
            "minLength": 2,
            "maxLength": 200
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "fr"
            ],
            "default": "en"
          }
        }
      },
      "DiscoveryJob": {
        "type": "object",
        "required": [
          "id",
          "status",
          "createdAt",
          "completedAt",
          "query",
          "locale",
          "result"
        ],
        "properties": {
          "id": {
            "type": "string",
            "format": "uuid"
          },
          "status": {
            "type": "string",
            "enum": [
              "completed"
            ]
          },
          "createdAt": {
            "type": "string",
            "format": "date-time"
          },
          "completedAt": {
            "type": "string",
            "format": "date-time"
          },
          "query": {
            "type": "string"
          },
          "locale": {
            "type": "string",
            "enum": [
              "en",
              "de",
              "fr"
            ]
          },
          "result": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/SearchResult"
            }
          },
          "location": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "BatchRequest": {
        "type": "object",
        "required": [
          "requests"
        ],
        "additionalProperties": false,
        "properties": {
          "requests": {
            "type": "array",
            "minItems": 1,
            "maxItems": 25,
            "items": {
              "type": "object",
              "required": [
                "operation"
              ],
              "properties": {
                "operation": {
                  "type": "string",
                  "enum": [
                    "site",
                    "search"
                  ]
                },
                "query": {
                  "type": "string",
                  "minLength": 2,
                  "maxLength": 200
                },
                "locale": {
                  "type": "string",
                  "enum": [
                    "en",
                    "de",
                    "fr"
                  ],
                  "default": "en"
                }
              }
            }
          }
        }
      },
      "BatchResponse": {
        "type": "object",
        "required": [
          "idempotencyKey",
          "count",
          "responses"
        ],
        "properties": {
          "idempotencyKey": {
            "type": "string"
          },
          "count": {
            "type": "integer",
            "minimum": 1,
            "maximum": 25
          },
          "responses": {
            "type": "array",
            "items": {
              "type": "object",
              "additionalProperties": true
            }
          }
        }
      },
      "Error": {
        "type": "object",
        "required": [
          "type",
          "title",
          "status",
          "detail",
          "instance",
          "code",
          "resolution",
          "documentation_url"
        ],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599
          },
          "detail": {
            "type": "string"
          },
          "instance": {
            "type": "string",
            "format": "uri"
          },
          "code": {
            "type": "string"
          },
          "resolution": {
            "type": "string"
          },
          "documentation_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "Problem": {
        "description": "Backward-compatible alias for the canonical typed Error schema.",
        "$ref": "#/components/schemas/Error"
      }
    }
  },
  "x-api-lifecycle": {
    "policy": "https://zephior.com/api/versioning",
    "status": "active",
    "versioning": "Stable versions are selected in the URL path, beginning with /api/v1.",
    "deprecation": "Breaking changes use a new major path. Deprecated versions publish Deprecation and Sunset response headers with at least 180 days notice."
  }
}