# Serper

Organic search results plus provider-native SERP verticals and rich response fields.

Canonical: https://searchsdk.dev/docs/providers/serper
Markdown: https://searchsdk.dev/docs/providers/serper.md

<a id="overview"></a>

## Normalized search

> **TypeScript reference**
> The API names, code and policy behavior in this article describe the TypeScript SDK. See [your language guide](https://searchsdk.dev/docs/sdks) for its supported surface and limits.

Normalized search maps organic title, link, and snippet fields. It does not substitute answer boxes, knowledge graph data, local listings, or shopping results for organic web rows.

**serper-search.ts · server**

```typescript
import { createSearch } from '@belweave/search-sdk';
import { serper } from '@belweave/search-sdk/serper';

const apiKey = process.env.SERPER_API_KEY;
if (!apiKey) throw new Error('SERPER_API_KEY is required');

const client = createSearch({ provider: serper({ apiKey }) });
const response = await client.web.search({
  query: 'SQLite write concurrency',
  limit: 5,
});
console.log(response.results, response.attempts);
```

Use native operations for result verticals and rich SERP fields. Public examples do not establish account quotas or independent speed and cost comparisons. Endpoint inventory and generated request types describe documented mappings, with live account behavior still unverified.

Domain filters unavailable on the normalized adapter.

<a id="native-client"></a>

## Provider-native client

**serper-native.ts · server**

```typescript
import { createSerperClient } from '@belweave/search-sdk/native-serper';

const apiKey = process.env.SERPER_API_KEY;
if (!apiKey) throw new Error('SERPER_API_KEY is required');

const client = createSerperClient({ apiKey, timeoutMs: 10_000 });
const response = await client.search({ body: { q: 'SQLite write concurrency', num: 5 } });
console.log(response.data, response.metadata);
```

Read provider data from `response.data` and sanitized transport details from `response.metadata`. Native TypeScript response types are not runtime schema validation. Preserve the operation's native response and source identities.

<a id="operations"></a>

## Native operation inventory

Methods available on this native client. Paths are relative to each operation's fixed base; a provider may use more than one origin. Eligible operations retry only when you opt into a client retry policy.

| Method | HTTP / relative path | Response / retry eligibility |
| --- | --- | --- |
| `search` | `POST /search` | json · no automatic retry |
| `searchGet` | `GET /search` | json · eligible |
| `images` | `POST /images` | json · no automatic retry |
| `imagesGet` | `GET /images` | json · eligible |
| `videos` | `POST /videos` | json · no automatic retry |
| `videosGet` | `GET /videos` | json · eligible |
| `places` | `POST /places` | json · no automatic retry |
| `placesGet` | `GET /places` | json · eligible |
| `maps` | `POST /maps` | json · no automatic retry |
| `mapsGet` | `GET /maps` | json · eligible |
| `reviews` | `POST /reviews` | json · no automatic retry |
| `reviewsGet` | `GET /reviews` | json · eligible |
| `news` | `POST /news` | json · no automatic retry |
| `newsGet` | `GET /news` | json · eligible |
| `shopping` | `POST /shopping` | json · no automatic retry |
| `shoppingGet` | `GET /shopping` | json · eligible |
| `scholar` | `POST /scholar` | json · no automatic retry |
| `scholarGet` | `GET /scholar` | json · eligible |
| `patents` | `POST /patents` | json · no automatic retry |
| `patentsGet` | `GET /patents` | json · eligible |
| `autocomplete` | `POST /autocomplete` | json · no automatic retry |
| `autocompleteGet` | `GET /autocomplete` | json · eligible |
| `lens` | `POST /lens` | json · no automatic retry |
| `lensGet` | `GET /lens` | json · eligible |
| `scrape` | `POST /` | json · no automatic retry |
| `scrapeGet` | `GET /` | json · eligible |

<a id="lifecycle"></a>

## Limits and operation lifecycle

- Pass `signal` and per-call `timeoutMs` on native request input when needed.
- Persist a returned job identifier before explicitly reading or polling the same job. Native clients do not automatically poll.
- SSE data is incremental provider event text. Parse and validate terminal or error events according to the provider contract; there is no reconnect or replay.
- Native operations may create, delete, ingest, or incur charges. A successful HTTP response is not proof that a remote job completed.

<a id="sources"></a>

## Official sources

Use the official reference for current schemas, account access, and operation-specific requirements.

- [Official product and examples](https://serper.dev/)
- [Official playground](https://serper.dev/playground)

- [Native request and response reference](https://searchsdk.dev/docs/api/native-transport)
- [All providers](https://searchsdk.dev/docs/providers)
