# Migrating from RapidAPI

The **Price Analytics** and **Idealo data** listings on RapidAPI run on the same backend as
the kwery API. Moving over does not change the data source, only how you call it: you get
batches of up to 1 000 values, webhooks, more marketplaces, and billing per successful
result instead of per request.

This page covers everything that differs. Most integrations need four changes: the base URL,
the key header, the request body, and the step that fetches results.

## 1. Get a kwery API key 

Sign up at [kwery.co](https://kwery.co/signup?utm_source=rapidapi&utm_campaign=migration).
The free plan includes 1 000 credits and needs no card. The dashboard issues an API key
(`kwy_live_…`). Send it in place of your RapidAPI headers:

| RapidAPI | kwery |
|  --- | --- |
| `X-RapidAPI-Key: <your RapidAPI key>` | `Authorization: Bearer kwy_live_…` (or `x-api-key: kwy_live_…`) |
| `X-RapidAPI-Host: price-analytics.p.rapidapi.com` | — (drop it) |


See [Authentication](/guides/authentication) for key rotation and revocation.

## 2. Endpoint mapping 

Base URL: `https://api.kwery.co`

| RapidAPI endpoint | kwery |
|  --- | --- |
| `POST /search-by-term` | `POST /job` with `"key": "term"` |
| `POST /search-by-id` | `POST /job` with `"key": "id"` (Amazon: `"key": "asin"`) |
| `POST /search-by-gtin` | `POST /job` with `"key": "gtin"` |
| `POST /search-by-pzn` | `POST /job` with `"key": "pzn"` (Idealo only) |
| `GET /poll-job/{job_id}` | `GET /job/{id}` for status, then `GET /job/{id}/download` for results |


On the **Idealo data** listing, `source` was implied. On kwery, send `"source": "idealo"`
explicitly.

## 3. Request changes 

The fields keep their names: `source`, `country` and `values`, plus the new `key`. Send
JSON (`Content-Type: application/json`). `values` is an array and takes up to 1 000 values
per job, where RapidAPI allowed one.

**Before (RapidAPI):**

```bash
curl -s https://price-analytics.p.rapidapi.com/search-by-gtin \
  -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \
  -H "X-RapidAPI-Host: price-analytics.p.rapidapi.com" \
  -F source=idealo -F country=de -F values=4006381333962
```

**After (kwery):**

```bash
curl -s https://api.kwery.co/job \
  -H "Authorization: Bearer $KWERY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "idealo",
    "country": "de",
    "key": "gtin",
    "values": ["4006381333962", "4719512101148"]
  }'
```

Three request details to carry over:

- **Amazon offers.** On RapidAPI, an Amazon search always fetched the full seller list. On
kwery, ask for it with `"topic": "search_and_offers"`. Without it you get the product and
its buy box only. See [Amazon](/sources/amazon).
- **Google and GTINs.** GTIN search on Google was deprecated on RapidAPI as well. On kwery,
use `"key": "product"` and send the GTIN together with the product title. See
[Google Shopping](/sources/google-shopping#gtin-plus-data).
- **Countries.** `uk` and `gb` both work, as before.


## 4. Getting results 

RapidAPI's `poll-job` returned the results itself once the job had finished. On kwery,
status and results are separate calls:

```bash
# Status: { "error": false, "job": { "_id": "…", "status": "working", "done": 1, "all": 2 } }
curl -s https://api.kwery.co/job/$JOB_ID -H "Authorization: Bearer $KWERY_API_KEY"

# Results, once status is "finished": { "job_id": "…", "status": "finished", "results": [ … ] }
curl -s https://api.kwery.co/job/$JOB_ID/download -H "Authorization: Bearer $KWERY_API_KEY"
```

Results are kept for **72 hours**. Add `.csv` to the download path for a CSV export.

Two ways to skip polling:

- **`wait` for one value.** `"wait": true` works as it did on RapidAPI. The request stays
open for up to 120 s and the response carries `results` inline. If it takes longer, you get
`wait_timed_out: true` and continue with `GET /job/{id}?wait=60`. See
[Quickstart](/guides/getting-started#wait).
- **Webhooks for batches.** Submit to `POST /stream` with a `callback_url` (same body as
`POST /job`, up to 100 000 values) and the results are pushed to you in signed batches as
they complete. See [Webhooks](/guides/webhooks).


## 5. Response changes 

|  | RapidAPI | kwery |
|  --- | --- | --- |
| Job created | `{ "error": false, "job_id": "…" }` | `{ "error": false, "job": { "_id": "…", "status": "new", … } }`. The id is `job._id`. |
| Status poll | `{ "error": false, "job_id", "status", "done", "all" }` | `{ "error": false, "job": { "_id", "status", "done", "all" } }` |
| Results | inline in `poll-job` once finished | `GET /job/{id}/download`, same `results` array shape |
| Errors | `{ "error": true, "message": "…" }`, HTTP 200 | unchanged. See [Errors & limits](/guides/errors-and-limits). |


Each entry in `results` keeps `query`, `content`, `success` and `reason`, with the same
`reason` values (`not found`, `timeout`, …).

### Field names inside `content` 

kwery uses **one set of field names across all marketplaces**. Names you may have parsed on
RapidAPI are renamed:

| RapidAPI name | kwery name |
|  --- | --- |
| `shop_name` / `shop_id` | `seller_name` / `seller_id` |
| `shop_url` | `seller_url` |
| `shop_rating`, `shop_review_rating` | `seller_rating` |
| `shop_review_count` | `seller_rating_count` |
| `review_rating`, `average_rating` | `rating` |
| `review_count` | `rating_count` |
| `asin` (Amazon) | `product_id` |
| `ean` | `gtin` |
| `brand` | `brand_name` |
| `image` | `image_url` |
| `total_price` | `total` |
| `title` (on offer rows) | `name` |
| Amazon `buybox_price`, `buybox_owner`, `buybox_owner_id` | `buybox.price`, `buybox.seller_name`, `buybox.seller_id` |
| term-search `items[]` | `offers[]` |


Value scales do not change: Amazon ratings stay 0–100, most others 0–5. On eBay, a missing
seller rating is `null` instead of the string `"N/A"`. The full field list per marketplace is
under [Sources](/sources).

### New fields 

Each result also carries `trust` (a 0–100 score with the reasons behind it, see
[Trust](/guides/trust)), `served_from` (`live` or `cache`) and `observed_at` (when the data was
seen on the marketplace). They are additive: code that ignores unknown fields keeps working.

## 6. Quota vs credits 

RapidAPI counted **every request** against your quota, including each poll. kwery bills only
**completed results**:

- Status polls, downloads and refused requests are free.
- Failed lookups (blocked, timed out) are free.
- A found product, or a freshly determined "not found", costs the source's credit weight:
1 credit on most sources, 0.5 on Amazon and eBay, 3 on Kaufland.
- Results served from cache within your `max_age` are free.


So to compare, count the **values** you look up per month, not your RapidAPI request count.
For example, 8 000 Idealo lookups a month is 8 000 credits however often you poll. Plans and
weights: [Pricing](/guides/pricing).

## Checklist 

1. Sign up and create an API key.
2. Point the base URL to `https://api.kwery.co` and swap the headers.
3. Replace `search-by-*` calls with `POST /job` and the matching `key`. Send `values` as an array.
4. Amazon: add `"topic": "search_and_offers"` if you used the seller list.
5. Read the job id from `job._id`. Fetch results from `/job/{id}/download` (or use `wait`).
6. Update the field names you read from `content`.
7. Cancel your RapidAPI subscription once the new integration runs.


Questions about moving over, or about volumes above the self-serve plans:
[support@kwery.co](mailto:support@kwery.co).