{
  "openapi": "3.0.3",
  "info": {
    "title": "LangSearch Web Search API",
    "version": "1.0.0",
    "description": "Free Web Search API for AI agents. Daily account allowance applies."
  },
  "servers": [
    {
      "url": "https://api.langsearch.com"
    }
  ],
  "security": [
    {
      "bearerAuth": []
    }
  ],
  "paths": {
    "/v1/web-search": {
      "post": {
        "operationId": "webSearch",
        "summary": "Web Search",
        "description": "Search the web with date and domain filters. Return source URLs with snippets, or request full webpage text with a per-result character limit.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "minLength": 1,
                    "description": "A non-empty natural-language search query.",
                    "example": "How does a search API help an AI agent?"
                  },
                  "count": {
                    "type": "integer",
                    "maximum": 50,
                    "default": 10,
                    "description": "Maximum results requested. Use 1–50. Values below 1 are normalized to 1; values above 50 are rejected."
                  },
                  "freshness": {
                    "type": "string",
                    "default": "noLimit",
                    "pattern": "^(noLimit|oneDay|oneWeek|oneMonth|oneYear|[0-9]{4}-[0-9]{2}-[0-9]{2}(\\.\\.[0-9]{4}-[0-9]{2}-[0-9]{2})?)$",
                    "description": "Date filter: noLimit, oneDay, oneWeek, oneMonth, oneYear, YYYY-MM-DD, or YYYY-MM-DD..YYYY-MM-DD. Dates must be valid calendar dates. A single date selects that UTC day; ranges include both endpoints and require start <= end.",
                    "example": "2026-09-01..2026-09-13"
                  },
                  "includeDomains": {
                    "type": "array",
                    "description": "Restrict results to these domains. Omit or use an empty array for no inclusion filter.",
                    "items": {
                      "type": "string",
                      "minLength": 1
                    },
                    "example": [
                      "langsearch.com",
                      "openai.com"
                    ]
                  },
                  "excludeDomains": {
                    "type": "array",
                    "description": "Exclude results from these domains. Omit or use an empty array for no exclusion filter.",
                    "items": {
                      "type": "string",
                      "minLength": 1
                    },
                    "example": [
                      "reddit.com"
                    ]
                  },
                  "contents": {
                    "type": "object",
                    "description": "Choose whether to retrieve full webpage text.",
                    "properties": {
                      "text": {
                        "description": "true enables full webpage text, capped at 5000 characters per result by default. An object enables text and optionally sets max_characters; no separate true flag is needed. false or omission uses snippet mode. In text mode, text replaces snippet.",
                        "default": false,
                        "oneOf": [
                          {
                            "type": "boolean"
                          },
                          {
                            "type": "object",
                            "properties": {
                              "max_characters": {
                                "type": "integer",
                                "format": "int32",
                                "minimum": 1,
                                "maximum": 2147483647,
                                "default": 5000,
                                "description": "Maximum Unicode characters of text per result. Must be a positive integer."
                              }
                            }
                          }
                        ]
                      }
                    }
                  }
                },
                "required": [
                  "query"
                ]
              },
              "examples": {
                "fullText": {
                  "summary": "Full webpage text",
                  "value": {
                    "query": "AI search APIs",
                    "count": 10,
                    "contents": {
                      "text": true
                    }
                  }
                },
                "filteredText": {
                  "summary": "Date and domain filters with a text limit",
                  "value": {
                    "query": "AI search APIs",
                    "count": 10,
                    "freshness": "2026-09-01..2026-09-13",
                    "includeDomains": [
                      "langsearch.com",
                      "openai.com"
                    ],
                    "excludeDomains": [
                      "reddit.com"
                    ],
                    "contents": {
                      "text": {
                        "max_characters": 3000
                      }
                    }
                  }
                },
                "singleDay": {
                  "summary": "Search a specific day",
                  "value": {
                    "query": "AI search APIs",
                    "freshness": "2026-09-12",
                    "count": 10
                  }
                },
                "snippets": {
                  "summary": "Search snippets",
                  "value": {
                    "query": "AI search APIs",
                    "count": 10
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Search succeeded. Example content illustrates the response shape.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/SearchResponse"
                },
                "examples": {
                  "fullText": {
                    "summary": "Text mode",
                    "value": {
                      "code": 200,
                      "log_id": "example-request-id",
                      "msg": null,
                      "data": {
                        "_type": "SearchResponse",
                        "queryContext": {
                          "originalQuery": "LangSearch Web Search API"
                        },
                        "webPages": {
                          "webSearchUrl": "https://langsearch.com/search?q=LangSearch+Web+Search+API",
                          "value": [
                            {
                              "id": "result-0",
                              "name": "LangSearch",
                              "url": "https://langsearch.com",
                              "displayUrl": "langsearch.com",
                              "datePublished": null,
                              "text": "Free Web Search API for AI agents. The World Engine for AGI."
                            }
                          ]
                        }
                      }
                    }
                  },
                  "snippets": {
                    "summary": "Snippet mode",
                    "value": {
                      "code": 200,
                      "log_id": "example-request-id",
                      "msg": null,
                      "data": {
                        "_type": "SearchResponse",
                        "queryContext": {
                          "originalQuery": "LangSearch Web Search API"
                        },
                        "webPages": {
                          "webSearchUrl": "https://langsearch.com/search?q=LangSearch+Web+Search+API",
                          "value": [
                            {
                              "id": "result-0",
                              "name": "LangSearch",
                              "url": "https://langsearch.com",
                              "displayUrl": "langsearch.com",
                              "snippet": "Free Web Search API for AI agents.",
                              "datePublished": null
                            }
                          ]
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "description": "Invalid request",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "400",
                  "log_id": "example-request-id",
                  "message": "Invalid request"
                }
              }
            }
          },
          "401": {
            "description": "Authentication failed",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "401",
                  "log_id": "example-request-id",
                  "message": "Authentication failed"
                }
              }
            }
          },
          "403": {
            "description": "Access denied",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "403",
                  "log_id": "example-request-id",
                  "message": "Access denied"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit or daily allowance exceeded",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "429",
                  "log_id": "example-request-id",
                  "message": "Rate limit or daily allowance exceeded"
                }
              }
            }
          },
          "500": {
            "description": "Server error",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "500",
                  "log_id": "example-request-id",
                  "message": "Server error"
                }
              }
            }
          },
          "502": {
            "description": "Search provider failure",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "502",
                  "log_id": "example-request-id",
                  "message": "Search provider failure"
                }
              }
            }
          },
          "503": {
            "description": "Service unavailable",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "503",
                  "log_id": "example-request-id",
                  "message": "Service unavailable"
                }
              }
            }
          },
          "504": {
            "description": "Timeout",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                },
                "example": {
                  "code": "504",
                  "log_id": "example-request-id",
                  "message": "Timeout"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Your LangSearch API key.",
        "x-default": "Bearer YOUR_LANGSEARCH_API_KEY"
      }
    },
    "schemas": {
      "SearchResult": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Result identifier.",
            "nullable": true
          },
          "name": {
            "type": "string",
            "description": "Source title.",
            "nullable": true
          },
          "url": {
            "type": "string",
            "description": "Source URL."
          },
          "displayUrl": {
            "type": "string",
            "description": "Display-friendly URL.",
            "nullable": true
          },
          "snippet": {
            "type": "string",
            "description": "Search snippet when full webpage text is not enabled. Omitted in text mode; available length varies by source.",
            "nullable": true
          },
          "datePublished": {
            "type": "string",
            "description": "Available publication timestamp.",
            "nullable": true
          },
          "text": {
            "type": "string",
            "nullable": true,
            "description": "Full webpage text when contents.text is true or an object. Replaces snippet and is capped per result at max_characters (default 5000). May be absent when unavailable."
          }
        },
        "required": [
          "url"
        ]
      },
      "SearchResponse": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer",
            "example": 200
          },
          "log_id": {
            "type": "string",
            "description": "Request trace identifier."
          },
          "msg": {
            "type": "string",
            "description": "Response message.",
            "nullable": true
          },
          "data": {
            "type": "object",
            "properties": {
              "_type": {
                "type": "string",
                "example": "SearchResponse"
              },
              "queryContext": {
                "type": "object",
                "properties": {
                  "originalQuery": {
                    "type": "string",
                    "description": "Original search query."
                  }
                }
              },
              "webPages": {
                "type": "object",
                "properties": {
                  "webSearchUrl": {
                    "type": "string",
                    "description": "Search URL.",
                    "nullable": true
                  },
                  "someResultsRemoved": {
                    "type": "boolean",
                    "nullable": true
                  },
                  "value": {
                    "type": "array",
                    "items": {
                      "$ref": "#/components/schemas/SearchResult"
                    }
                  }
                },
                "required": [
                  "value"
                ]
              }
            },
            "required": [
              "webPages"
            ]
          }
        },
        "required": [
          "code",
          "data"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {
          "code": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "integer"
              }
            ]
          },
          "log_id": {
            "type": "string",
            "description": "Request trace identifier.",
            "nullable": true
          },
          "message": {
            "type": "string",
            "description": "Error description.",
            "nullable": true
          },
          "msg": {
            "type": "string",
            "description": "Alternative error description field.",
            "nullable": true
          }
        }
      }
    }
  }
}
