> ## Documentation Index
> Fetch the complete documentation index at: https://lava.so/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Aggregated search across all 9 providers

> Fan out a single query across 9 search providers in parallel — Tavily, Exa, Jina, Parallel, Perplexity Sonar, Firecrawl, Lava News, Serper, Brave Search — and return a unified normalized result set with explicit per-provider failure surfacing. Charges sum of upstream provider costs plus a $0.005 lava-search markup. Use this when you want the raw evidence pile to reason over yourself; use /search/answer instead when you want an LLM-synthesized answer with citations.



## OpenAPI

````yaml /openapi.json post /search/sources
openapi: 3.0.0
info:
  title: Lava API
  description: >-
    Lava API enables businesses to implement usage-based billing for AI
    services. This API allows tracking, managing, and billing for third-party AI
    API usage through a forwarding system.
  version: 1.0.0
  contact:
    name: Lava support
    url: https://www.lava.so/contact
servers:
  - url: https://api.lava.so/v1/
    description: Lava API v1
security: []
tags:
  - name: Authentication
  - name: Core Endpoints
  - name: Models
  - name: Services
  - name: Requests
  - name: Wallet
  - name: Payment Methods
  - name: Spend Keys
  - name: Usage
  - name: Checkout Sessions
  - name: Customers
  - name: Plans
  - name: Subscriptions
  - name: Meters
  - name: Webhooks
  - name: Secret Keys
  - name: Credit Bundles
  - name: Gateway Settings
  - name: Skills
  - name: News Data
  - name: Search
  - name: Enrich
paths:
  /search/sources:
    post:
      tags:
        - Search
      summary: Aggregated search across all 9 providers
      description: >-
        Fan out a single query across 9 search providers in parallel — Tavily,
        Exa, Jina, Parallel, Perplexity Sonar, Firecrawl, Lava News, Serper,
        Brave Search — and return a unified normalized result set with explicit
        per-provider failure surfacing. Charges sum of upstream provider costs
        plus a $0.005 lava-search markup. Use this when you want the raw
        evidence pile to reason over yourself; use /search/answer instead when
        you want an LLM-synthesized answer with citations.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - q
              properties:
                q:
                  type: string
                  description: The search query
                providers:
                  type: array
                  items:
                    type: string
                  nullable: true
                  description: >-
                    Optional subset of providers to query. Defaults to all 9.
                    Valid ids: tavily, exa, jina, parallel, perplexity,
                    firecrawl, lava_news, serper, brave_search.
                max_results_per_source:
                  type: integer
                  minimum: 1
                  maximum: 50
                  nullable: true
                  description: Max results per provider (default 10, max 50)
                since:
                  type: string
                  format: date-time
                  nullable: true
                  description: >-
                    ISO 8601 timestamp; only results published after this date
                    are returned (provider-dependent — not all upstream APIs
                    honor this).
            examples:
              medicineQuery:
                value:
                  q: GLP-1 cardiovascular outcomes meta-analyses 2026
              subsetQuery:
                value:
                  q: post-quantum NIST standardization status
                  providers:
                    - exa
                    - tavily
                    - lava_news
                  max_results_per_source: 5
      responses:
        '200':
          description: >-
            Aggregated results across the requested providers, with explicit
            partial-failure surfacing.
          content:
            application/json:
              schema:
                type: object
                required:
                  - results
                  - sources_failed
                  - cost
                properties:
                  results:
                    type: array
                    items:
                      type: object
                      required:
                        - source
                        - title
                        - url
                        - snippet
                      properties:
                        source:
                          type: string
                          description: >-
                            The provider id that returned this result (e.g.
                            "tavily", "lava_news").
                        title:
                          type: string
                        url:
                          type: string
                        snippet:
                          type: string
                        published_at:
                          type: string
                          format: date-time
                          nullable: true
                        score:
                          type: number
                          nullable: true
                        raw:
                          type: object
                          nullable: true
                          description: >-
                            Original upstream payload (for callers that want
                            fields beyond the unified shape).
                  sources_failed:
                    type: array
                    items:
                      type: object
                      required:
                        - provider
                        - reason
                      properties:
                        provider:
                          type: string
                        reason:
                          type: string
                          description: >-
                            One of: timeout, upstream_error, parse_error,
                            unknown_error.
                  cost:
                    type: object
                    required:
                      - breakdown
                      - markup
                      - total
                    properties:
                      breakdown:
                        type: object
                        additionalProperties:
                          type: string
                        description: >-
                          Per-provider cost (decimal string) for every provider
                          that returned results.
                      markup:
                        type: string
                        description: Flat lava-search markup (always "0.05").
                      total:
                        type: string
                        description: sum(breakdown) + markup, as a decimal string.
        '400':
          description: >-
            Unknown provider id in request body. Response includes
            `error.unknown[]` listing the unrecognized ids.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '502':
          description: >-
            Every requested provider failed. Response includes
            `sources_failed[]` for diagnosis. No markup charged.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
      security:
        - Auth: []
components:
  schemas:
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            message:
              type: string
              description: Human-readable error message describing what went wrong
              example: Invalid authentication credentials
            code:
              type: string
              description: Machine-readable error code describing what went wrong
              example: forward_token_json_invalid
            status:
              type: integer
              description: HTTP status code of the error
              example: 400
            issues:
              type: array
              items:
                type: object
                properties:
                  path:
                    type: array
                    items:
                      type: string
                    description: Path to the field that caused the validation error
                  message:
                    type: string
                    description: Error message describing the validation issue
                required:
                  - path
                  - message
              description: >-
                Optional array of specific validation issues with their paths
                and messages
              example:
                - path:
                    - model
                  message: 'Missing required field: model'
                - path:
                    - messages
                    - '0'
                    - content
                  message: Invalid message content format
          required:
            - message
            - code
            - status
      required:
        - error
  securitySchemes:
    Auth:
      type: http
      scheme: bearer
      description: >-
        Bearer token authentication used for standard API calls. Format: 'Bearer
        YOUR_API_KEY'

````