# Rentalcars Offer API Documentation

<p>Get one offer from a search with its pickup and dropoff depot. Rentalcars has no route for a single offer, so this endpoint runs the search again and returns the offer with the matching vehicle_id. Send the same search parameters you used for the search. Offers change over time, so an offer can be gone on a later call. Then the endpoint returns 404 and does not bill. One search returns at most 500 offers. The pagination object shows total_offers, offer_cap and capped. The market (cor) and the currency decide the prices. The response echoes both values in the market object. Scrappa is not affiliated with Rentalcars.com. This is an unofficial API.</p>

- **Documentation:** [https://scrappa.co/docs/rentalcars-api/rentalcars_offer](https://scrappa.co/docs/rentalcars-api/rentalcars_offer)
- **API group:** Rentalcars API
- **Endpoint:** `GET https://scrappa.co/api/rentalcars/offer`

## Authentication

Send your Scrappa API key in the `X-API-KEY` request header. Paid endpoints also support accountless x402 payments when called without an API key.

## Parameters

| Parameter | Type | Required | Description |
| --- | --- | --- | --- |
| `pickup_location` | string | Yes | Pickup place. A 3-letter IATA airport code or "lat,lng". Example: BER. |
| `dropoff_location` | string | No | Dropoff place. Same format as the pickup place. Default: the pickup place. |
| `pickup_date` | string | Yes | Pickup date in Y-m-d format. It must not be in the past. Example: 2026-12-01. |
| `pickup_time` | string | No | Pickup time in H:i format. Default: 10:00. |
| `dropoff_date` | string | Yes | Dropoff date in Y-m-d format. It must not be before the pickup date. |
| `dropoff_time` | string | No | Dropoff time in H:i format. Default: 10:00. |
| `drivers_age` | integer | No | Age of the driver, from 18 to 99. Default: 30. |
| `vehicle_id` | string | Yes | The vehicle_id of an offer from the search response. |
| `cor` | string | No | Country of residence as a 2-letter code, or auto. It sets the market and the prices. With auto no market is sent and the offers follow the exit country. Use auto when you want to pass the search_key and vehicle_id to /terms. Default: gb. |
| `currency` | string | No | Currency code for prices. Default: EUR. |

## Example response

```json
{
    "meta": {
        "attempts": 1,
        "duration_ms": 3,
        "endpoint_family": "offer"
    },
    "offer": {
        "car": {
            "fuel": "N/A",
            "doors": 4,
            "seats": 4,
            "groups": [],
            "car_class": "XXMR",
            "image_url": "https://cdn2.rcstatic.com/images/car_images/new_images/wildcards/ghost_car_lrg.jpg",
            "categories": [
                "special"
            ],
            "transmission": "MANUAL",
            "make_and_model": "Wild Card",
            "suitcase_count": 2,
            "large_suitcases": 2,
            "small_suitcases": 1,
            "air_conditioning": true
        },
        "fees": [
            {
                "per": null,
                "name": "DAMAGE_EXCESS",
                "type": null,
                "amount": 1200,
                "source": "MAPPED",
                "currency": "EUR",
                "distance": null,
                "unlimited": null,
                "tax_included": true,
                "distance_unit": null,
                "always_payable": true,
                "payable_locally": false,
                "included_in_total": false
            },
            {
                "per": null,
                "name": "DEPOSIT",
                "type": null,
                "amount": 250,
                "source": "MAPPED",
                "currency": "EUR",
                "distance": null,
                "unlimited": null,
                "tax_included": true,
                "distance_unit": null,
                "always_payable": true,
                "payable_locally": false,
                "included_in_total": false
            }
        ],
        "rank": 3,
        "price": {
            "total": 221.78,
            "deposit": 221.78,
            "per_day": 73.93,
            "currency": "EUR",
            "discount": 0,
            "base_total": 186.8,
            "base_currency": "GBP",
            "drive_away_total": 221.78
        },
        "source": "rest",
        "deposit": {
            "amount": 250,
            "currency": "EUR"
        },
        "mileage": {
            "per": "PER_RENTAL",
            "type": "LIMITED",
            "unlimited": false,
            "distance_unit": "KM",
            "extra_currency": "EUR",
            "extra_per_unit": 0.37,
            "included_distance": 900
        },
        "pay_when": "PAY_NOW",
        "supplier": {
            "id": "17",
            "name": "Alamo",
            "type": "INTEGRATED",
            "logo_url": "https://cdn2.rcstatic.com/sp/images/suppliers/17_logo_200.png"
        },
        "insurance": {
            "products": []
        },
        "promotions": [],
        "vehicle_id": "859050623",
        "fuel_policy": {
            "type": "RETURN_SAME"
        },
        "pickup_type": "CAR_RENTAL_CENTRE",
        "depot_rating": {
            "scope": "depot",
            "average": 7.5,
            "locating": 7.7,
            "condition": 7.3,
            "efficiency": 7.2,
            "cleanliness": 8.3,
            "num_ratings": 953,
            "collect_time": 7.1,
            "drop_off_time": 8,
            "value_for_money": 7
        },
        "theft_excess": {
            "amount": 1200,
            "currency": "EUR"
        },
        "damage_excess": {
            "amount": 1200,
            "currency": "EUR"
        },
        "pickup_depot_id": "4829006",
        "dropoff_depot_id": "4829006",
        "proposition_type": "BR",
        "free_cancellation": true,
        "provisional_extras": [
            {
                "type": "BABY_SEAT",
                "price": {
                    "amount": 46.49509179677124,
                    "currency": "EUR"
                }
            },
            {
                "type": "CHILD_SEAT",
                "price": {
                    "amount": 46.49509179677124,
                    "currency": "EUR"
                }
            }
        ],
        "credit_card_required": false,
        "special_offer_message": "Car equipped with all-season tyres."
    },
    "market": {
        "country": "GB",
        "currency": "EUR"
    },
    "search_key": "eyJkcml2ZXJzQWdlIjozMCwiZHJvcE9mZkRhdGVUaW1lIjoiMjAyNi0xMS0yN1QxMDowMDowMCIsImRyb3BPZmZMb2NhdGlvbiI6IkJFUiIsImRyb3BPZmZMb2NhdGlvblR5cGUiOiJJQVRBIiwicGlja1VwRGF0ZVRpbWUiOiIyMDI2LTExLTI0VDEwOjAwOjAwIiwicGlja1VwTG9jYXRpb24iOiJCRVIiLCJwaWNrVXBMb2NhdGlvblR5cGUiOiJJQVRBIiwicmVudGFsRHVyYXRpb25JbkRheXMiOjMsInNlcnZpY2VGZWF0dXJlcyI6WyJJTkNMVURFX05VTUJFUl9PRl9TVUlUQ0FTRVMiLCJSRVRVUk5fRVhUUkFTX1dJVEhfUFJJQ0lOR19JTl9NVUxUSV9DQVJfUkVTUE9OU0UiLCJBUFBMRV9DQVJEX0VOQUJMRUQiXSwic2lnbmF0dXJlIjoiUFNmZFFUenJMUTNaVG1aT0JqYlNXdzVTckVRdHFlWXJCNWg5R3ZGb2s3Zz0ifQ==",
    "pickup_depot": {
        "id": "4829006",
        "city": "Berlin",
        "iata": "BER",
        "name": "Berlin Brandenburg Airport Willy Brandt",
        "rating": {
            "scope": "depot",
            "average": 7.5,
            "locating": 7.7,
            "condition": 7.3,
            "efficiency": 7.2,
            "cleanliness": 8.3,
            "num_ratings": 953,
            "collect_time": 7.1,
            "drop_off_time": 8,
            "value_for_money": 7
        },
        "address": "1 Melli-Beese-Ring, Sch\u00f6nefeld, Berlin, Germany, 12529",
        "latitude": 52.364206,
        "longitude": 13.508656,
        "location_id": "466611",
        "pickup_type": "CAR_RENTAL_CENTRE",
        "supplier_id": "17",
        "country_code": "DE",
        "pickup_instructions": null,
        "drop_off_instructions": null,
        "distance_from_search_km": null
    },
    "dropoff_depot": {
        "id": "4829006",
        "city": "Berlin",
        "iata": "BER",
        "name": "Berlin Brandenburg Airport Willy Brandt",
        "rating": {
            "scope": "depot",
            "average": 7.5,
            "locating": 7.7,
            "condition": 7.3,
            "efficiency": 7.2,
            "cleanliness": 8.3,
            "num_ratings": 953,
            "collect_time": 7.1,
            "drop_off_time": 8,
            "value_for_money": 7
        },
        "address": "1 Melli-Beese-Ring, Sch\u00f6nefeld, Berlin, Germany, 12529",
        "latitude": 52.364206,
        "longitude": 13.508656,
        "location_id": "466611",
        "pickup_type": "CAR_RENTAL_CENTRE",
        "supplier_id": "17",
        "country_code": "DE",
        "pickup_instructions": null,
        "drop_off_instructions": null,
        "distance_from_search_km": null
    },
    "search_parameters": {
        "engine": "rentalcars_offer",
        "market": "gb",
        "currency": "EUR",
        "vehicle_id": "859050623",
        "drivers_age": 30,
        "rental_days": 3,
        "pickup_datetime": "2026-11-08T10:00:00",
        "pickup_location": "BER",
        "dropoff_datetime": "2026-11-11T10:00:00",
        "dropoff_location": "BER",
        "pickup_location_type": "IATA",
        "dropoff_location_type": "IATA"
    }
}
```

## Errors

| Status | Error | Description |
| --- | --- | --- |
| 422 | Validation Error | A parameter is missing or invalid. No request is made upstream. Not billed. |
| 422 | Request Rejected | Rentalcars rejected the search values, for example a filter value that is not in available_filters. Not billed. |
| 404 | Offer Not Found | No offer matches the vehicle_id or the supplier in this search and market. Not billed. |
| 503 | Rentalcars Temporarily Unavailable | Rentalcars did not answer in time. Retry after a short pause. Other 503 codes start with rentalcars_ too, for example rentalcars_invalid_response. Not billed. |

## More Scrappa resources

- [API documentation](https://scrappa.co/docs)
- [Full LLM-readable API reference](https://scrappa.co/llms-full.txt)
- [OpenAPI specification](https://scrappa.co/docs/api.json)
- [Pricing](https://scrappa.co/pricing)
