desearch-ai Web Search API

The Web Search API from desearch-ai — 3 operation(s) for web search.

Operations 3

GET /web SERP Web Search API #
GET /web/extract Extract API #
GET /web/crawl Extract API (Legacy) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/desearch-ai:desearch-ai-web-search-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

desearch-ai-web-search-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Desearch Web Search API
  description: The Desearch API is a powerful suite of AI-driven tools designed to integrate natural language processing, AI-powered search, image generation, and data extraction into your applications. Whether you’re building intelligent search engines, automating content creation, analyzing text data, or generating AI-based media, Desearch provides a robust and scalable solution.
  version: 1.0.0
servers:
- url: https://api.desearch.ai
security:
- ApiKeyAuth: []
tags:
- name: Web Search
paths:
  /web:
    get:
      tags:
      - Web Search
      summary: SERP Web Search API
      description: 'This API allows users to search for any information over the web. This replicates a typical search engine experience, where users can search for any information they need. Each request returns up to 20 results. Paginate with `start`, the number of results to skip: any offset works, so `start=10` returns results beginning at the 11th. A search with no results, including a `start` past the last result, returns 503 and is not charged. So does a search provider failure or timeout. An empty or whitespace-only `query` returns 422 and is not charged. A blocked query returns 200 with no results and is not charged.


        Billing metadata: successful billable responses include the `X-Desearch-Cost-Usd`, `X-Desearch-Usage-Count`, `X-Desearch-Service`, and `X-Desearch-Currency` headers. JSON object responses also include optional `cost_usd`, `usage_count`, `service`, and `currency` fields. Current prices are at https://desearch.ai/pricing. JSON arrays, text, and streaming responses keep their body shape and expose billing metadata only through headers.'
      operationId: web_search_web_get
      parameters:
      - name: query
        in: query
        required: true
        schema:
          type: string
          pattern: \S
          description: The search query string, e.g., 'latest news on AI'. An empty or whitespace-only query returns 422 and is not charged.
          title: Query
        description: The search query string, e.g., 'latest news on AI'. An empty or whitespace-only query returns 422 and is not charged.
        example: latest news on AI
      - name: start
        in: query
        required: false
        schema:
          type: integer
          maximum: 100
          minimum: 0
          description: 'How many results to skip, for pagination. Any offset works, with no rounding: 0 (default) returns results from the 1st, 10 from the 11th, 20 from the 21st, and so on. Each request returns up to 20 results. Must be between 0 and 100. A value outside that range returns 422 and is not charged.'
          default: 0
          title: Start
        description: 'How many results to skip, for pagination. Any offset works, with no rounding: 0 (default) returns results from the 1st, 10 from the 11th, 20 from the 21st, and so on. Each request returns up to 20 results. Must be between 0 and 100. A value outside that range returns 422 and is not charged.'
        example: 20
      responses:
        '200':
          description: 'A JSON object mapping Web Search to its search results. Charged once per request. A blocked query is a 200 with `data: []` and is not charged.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebSearchResultsResponse'
          headers:
            X-Desearch-Cost-Usd:
              description: Billable request cost in US dollars. Current prices are at https://desearch.ai/pricing.
              schema:
                type: number
                format: float
            X-Desearch-Usage-Count:
              description: Billable usage units applied to this request.
              schema:
                type: integer
                example: 10
            X-Desearch-Service:
              description: Priced service name used to calculate the request cost, as listed at https://desearch.ai/pricing (for example "Web Search" or "X Search").
              schema:
                type: string
                example: Web Search
            X-Desearch-Currency:
              description: Currency for cost metadata. Currently always USD.
              schema:
                type: string
                example: USD
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
        '422':
          description: Validation Error, for example `query` is missing, empty or only whitespace, or `start` is negative or above 100. The search provider is not called and the request is not charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Too Many Requests
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TooManyRequestsResponse'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalServerErrorResponse'
        '503':
          description: 'The search returned no results, for example `start` is past the last result (`error_code: upstream_empty`), or the search provider failed (`error_code: upstream_failed`) or timed out (`error_code: upstream_timeout`). The request is not charged (`X-Desearch-Cost-Usd: 0`, `X-Desearch-Usage-Count: 0`).'
        '301':
          description: Moved Permanently
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MovedPermanentlyResponse'
        '304':
          description: Not Modified
  /web/extract:
    get:
      tags:
      - Web Search
      summary: Extract API
      description: 'Fetch a public URL and return its content as text, markdown or HTML. `format=text` returns `text/plain; charset=utf-8`, `format=markdown` returns `text/markdown; charset=utf-8` and `format=html` returns `text/html; charset=utf-8`. `format=markdown` keeps headings, lists, tables and code: the main content of articles and docs, and the whole page without its navigation otherwise. By default `format=text` returns the page''s main content (the article or main block, the way reader views do), which can leave out other sections such as tables, notices and sidebars; set `full_page=true` to get all visible text of the page instead, one block per line, with table cells separated by ` | `. Pages that cannot be served answer with an `error_code` and are not charged.


        Billing metadata: successful billable responses include the `X-Desearch-Cost-Usd`, `X-Desearch-Usage-Count`, `X-Desearch-Service`, and `X-Desearch-Currency` headers. JSON object responses also include optional `cost_usd`, `usage_count`, `service`, and `currency` fields. Current prices are at https://desearch.ai/pricing. JSON arrays, text, and streaming responses keep their body shape and expose billing metadata only through headers.'
      operationId: desearch_crawl_web_extract_get
      parameters:
      - name: url
        in: query
        required: true
        schema:
          type: string
          description: URL to extract content from
          title: Url
        description: URL to extract content from
        example: https://en.wikipedia.org/wiki/Artificial_intelligence
      - name: format
        in: query
        required: false
        schema:
          enum:
          - html
          - text
          - markdown
          type: string
          description: 'Format of the content to be returned: ''text'', ''markdown'' or ''html''. Default is ''text''. ''text'' is sent as text/plain, ''markdown'' as text/markdown and ''html'' as text/html.'
          default: text
          title: Format
        description: 'Format of the content to be returned: ''text'', ''markdown'' or ''html''. Default is ''text''. ''text'' is sent as text/plain, ''markdown'' as text/markdown and ''html'' as text/html.'
        example: markdown
      - name: js
        in: query
        required: false
        schema:
          enum:
          - 'true'
          - 'false'
          type: string
          description: Render the page with a headless browser before extracting content. Use for SPAs or pages whose body is populated by JavaScript. Must be exactly `true` or `false` (case-sensitive); enables a separate billing tier when set to `true`.
          default: 'false'
          title: Js
        description: Render the page with a headless browser before extracting content. Use for SPAs or pages whose body is populated by JavaScript. Must be exactly `true` or `false` (case-sensitive); enables a separate billing tier when set to `true`.
      - name: wait
        in: query
        required: false
        schema:
          anyOf:
          - type: integer
            maximum: 30000
            minimum: 0
          - type: 'null'
          description: Optional extra wait in milliseconds after the page loads. Only applied when ``js=true``.
          title: Wait
        description: Optional extra wait in milliseconds after the page loads. Only applied when ``js=true``.
      - name: full_page
        in: query
        required: false
        schema:
          enum:
          - 'true'
          - 'false'
          type: string
          description: With `format=text`, return all visible text of the page instead of its main content. Must be exactly `true` or `false`. Applies only to `format=text`; `markdown` picks the main content or the whole page itself.
          default: 'false'
          title: Full Page
        description: With `format=text`, return all visible text of the page instead of its main content. Must be exactly `true` or `false`. Applies only to `format=text`; `markdown` picks the main content or the whole page itself.
      responses:
        '200':
          description: Extracted content of the web link
          content:
            text/plain:
              schema:
                type: string
            text/html:
              schema:
                type: string
            text/markdown:
              schema:
                type: string
          headers:
            X-Desearch-Cost-Usd:
              description: Billable request cost in US dollars. Current prices are at https://desearch.ai/pricing.
              schema:
                type: number
                format: float
            X-Desearch-Usage-Count:
              description: Billable usage units applied to this request.
              schema:
                type: integer
                example: 10
            X-Desearch-Service:
              description: Priced service name used to calculate the request cost, as listed at https://desearch.ai/pricing (for example "Web Search" or "X Search").
              schema:
                type: string
            X-Desearch-Currency:
              description: Currency for cost metadata. Currently always USD.
              schema:
                type: string
                example: USD
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
        '404':
          description: Not charged. `error_code` is `page_not_found` when the site answered 404 or 410, or `no_content` when the page has no text.
        '422':
          description: 'Not charged. Either a validation error, or `error_code` `js_required`: the page only shows its content after JavaScript runs (an app shell, or a page that asks to enable JavaScript). Retry with `js=true`.'
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Too Many Requests
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/TooManyRequestsResponse'
        '500':
          description: Internal Server Error
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/InternalServerErrorResponse'
        '503':
          description: Not charged. `error_code` is `blocked` when the site refused the request or answered with a bot check (a CAPTCHA or "verifying your request" page) instead of the page, `upstream_timeout` when the page took too long, and `upstream_failed` for any other crawler failure.
        '301':
          description: Moved Permanently
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/MovedPermanentlyResponse'
        '304':
          description: Not Modified
  /web/crawl:
    get:
      tags:
      - Web Search
      summary: Extract API (Legacy)
      description: 'Deprecated compatibility alias for `GET /web/extract`. Existing clients can continue using this route during the migration. `format=text` returns `text/plain; charset=utf-8` and `format=html` returns `text/html; charset=utf-8`.


        Billing metadata: successful billable responses include the `X-Desearch-Cost-Usd`, `X-Desearch-Usage-Count`, `X-Desearch-Service`, and `X-Desearch-Currency` headers. JSON object responses also include optional `cost_usd`, `usage_count`, `service`, and `currency` fields. Current prices are at https://desearch.ai/pricing. JSON arrays, text, and streaming responses keep their body shape and expose billing metadata only through headers.'
      operationId: desearch_crawl_web_crawl_get
      deprecated: true
      parameters:
      - name: url
        in: query
        required: true
        schema:
          type: string
          description: URL to extract content from
          title: Url
        description: URL to extract content from
        example: https://en.wikipedia.org/wiki/Artificial_intelligence
      - name: format
        in: query
        required: false
        schema:
          enum:
          - html
          - text
          - markdown
          type: string
          description: 'Format of the content to be returned: ''text'', ''markdown'' or ''html''. Default is ''text''. ''text'' is sent as text/plain, ''markdown'' as text/markdown and ''html'' as text/html.'
          default: text
          title: Format
        description: 'Format of the content to be returned: ''text'', ''markdown'' or ''html''. Default is ''text''. ''text'' is sent as text/plain, ''markdown'' as text/markdown and ''html'' as text/html.'
        example: markdown
      - name: js
        in: query
        required: false
        schema:
          enum:
          - 'true'
          - 'false'
          type: string
          description: Render the page with a headless browser before extracting content. Use for SPAs or pages whose body is populated by JavaScript. Must be exactly `true` or `false` (case-sensitive); enables a separate billing tier when set to `true`.
          default: 'false'
          title: Js
        description: Render the page with a headless browser before extracting content. Use for SPAs or pages whose body is populated by JavaScript. Must be exactly `true` or `false` (case-sensitive); enables a separate billing tier when set to `true`.
      - name: wait
        in: query
        required: false
        schema:
          anyOf:
          - type: integer
            maximum: 30000
            minimum: 0
          - type: 'null'
          description: Optional extra wait in milliseconds after the page loads. Only applied when ``js=true``.
          title: Wait
        description: Optional extra wait in milliseconds after the page loads. Only applied when ``js=true``.
      - name: full_page
        in: query
        required: false
        schema:
          enum:
          - 'true'
          - 'false'
          type: string
          description: With `format=text`, return all visible text of the page instead of its main content. Must be exactly `true` or `false`. Applies only to `format=text`; `markdown` picks the main content or the whole page itself.
          default: 'false'
          title: Full Page
        description: With `format=text`, return all visible text of the page instead of its main content. Must be exactly `true` or `false`. Applies only to `format=text`; `markdown` picks the main content or the whole page itself.
      responses:
        '200':
          description: Content of the web link
          content:
            text/plain:
              schema:
                type: string
            text/html:
              schema:
                type: string
            text/markdown:
              schema:
                type: string
          headers:
            X-Desearch-Cost-Usd:
              description: Billable request cost in US dollars. Current prices are at https://desearch.ai/pricing.
              schema:
                type: number
                format: float
            X-Desearch-Usage-Count:
              description: Billable usage units applied to this request.
              schema:
                type: integer
                example: 10
            X-Desearch-Service:
              description: Priced service name used to calculate the request cost, as listed at https://desearch.ai/pricing (for example "Web Search" or "X Search").
              schema:
                type: string
                example: Extract API
            X-Desearch-Currency:
              description: Currency for cost metadata. Currently always USD.
              schema:
                type: string
                example: USD
        '401':
          description: Unauthorized
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/UnauthorizedResponse'
        '404':
          description: Not charged. `error_code` is `page_not_found` when the site answered 404 or 410, or `no_content` when the page has no text.
        '422':
          description: 'Not charged. Either a validation error, or `error_code` `js_required`: the page only shows its content after JavaScript runs (an app shell, or a page that asks to enable JavaScript). Retry with `js=true`.'
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Too Many Requests
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/TooManyRequestsResponse'
        '500':
          description: Internal Server Error
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/InternalServerErrorResponse'
        '503':
          description: Not charged. `error_code` is `blocked` when the site refused the request or answered with a bot check (a CAPTCHA or "verifying your request" page) instead of the page, `upstream_timeout` when the page took too long, and `upstream_failed` for any other crawler failure.
        '301':
          description: Moved Permanently
          content:
            text/plain:
              schema:
                $ref: '#/components/schemas/MovedPermanentlyResponse'
        '304':
          description: Not Modified
components:
  schemas:
    WebSearchResultItem:
      properties:
        title:
          type: string
          title: Title
          description: EXCLUSIVE Major coffee buyers face losses as Colombia ...
        snippet:
          type: string
          title: Snippet
          description: Coffee farmers in Colombia, the world's No. 2 arabica producer, have failed to deliver up to 1 million bags of beans this year or nearly 10% ...
        link:
          type: string
          maxLength: 2083
          minLength: 1
          format: uri
          title: Link
          description: https://www.reuters.com/world/americas/exclusive-major-coffee-buyers-face-losses-colombia-farmers-fail-deliver-2021-10-11/
        highlights:
          anyOf:
          - items:
              type: string
            type: array
          - type: 'null'
          title: Highlights
          description: 'Key excerpts from the page. Returned unless the request sets `highlights: false`.'
        text:
          anyOf:
          - type: string
          - type: 'null'
          title: Text
          description: 'Full page text. Returned only when the request sets `page_text: true`.'
      type: object
      required:
      - title
      - snippet
      - link
      title: WebSearchResultItem
      example:
        link: https://www.reuters.com/world/americas/exclusive-major-coffee-buyers-face-losses-colombia-farmers-fail-deliver-2021-10-11/
        snippet: Coffee farmers in Colombia, the world's No. 2 arabica producer, have failed to deliver up to 1 million bags of beans this year or nearly 10% ...
        title: EXCLUSIVE Major coffee buyers face losses as Colombia ...
    TooManyRequestsResponse:
      properties:
        detail:
          additionalProperties:
            anyOf:
            - type: string
            - type: integer
          type: object
          title: Detail
          example:
            error_code: 429
            message: Too Many Requests
            retry_after: 60 seconds
      type: object
      required:
      - detail
      title: TooManyRequestsResponse
    InternalServerErrorResponse:
      properties:
        detail:
          additionalProperties:
            anyOf:
            - type: string
            - type: integer
          type: object
          title: Detail
          example:
            description: An unexpected error occurred on the server.
            error_code: 500
            message: Internal Server Error
      type: object
      required:
      - detail
      title: InternalServerErrorResponse
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    MovedPermanentlyResponse:
      properties:
        detail:
          additionalProperties:
            anyOf:
            - type: string
            - type: integer
          type: object
          title: Detail
          example:
            error_code: 301
            location: https://new-url.com
            message: Moved Permanently
      type: object
      required:
      - detail
      title: MovedPermanentlyResponse
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
            - type: string
            - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
      type: object
      required:
      - loc
      - msg
      - type
      title: ValidationError
    WebSearchResultsResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/WebSearchResultItem'
          type: array
          title: Data
      type: object
      required:
      - data
      title: WebSearchResultsResponse
    UnauthorizedResponse:
      properties:
        detail:
          type: string
          title: Detail
          example: Invalid API key
      type: object
      required:
      - detail
      title: UnauthorizedResponse
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization