# Alamo Car Rental Scraper: Rates, Classes & Branches (`recordsdata/alamo-scraper`) Actor

Scrape alamo.com car rental quotes for any airport or city: vehicle classes with daily and total rates incl. taxes, prepay savings, mileage and driver age fees, plus branches and the class catalog. No login, no proxy. Low volume: Alamo limits quote requests. Export JSON, CSV or Excel.

- **URL**: https://apify.com/recordsdata/alamo-scraper.md
- **Developed by:** [RecordsData](https://apify.com/recordsdata) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $22.00 / 1,000 rental offers

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![RecordsData](https://api.apify.com/v2/key-value-stores/AAm3a1h3Z9nYfrvh9/records/banner?v=3)

## Alamo Scraper: Car Rental Prices, Branches and Vehicle Classes

> Alamo Scraper is an Apify Actor that extracts live car rental quotes from Alamo Rent A Car (alamo.com). For a pickup branch, a date range and a driver age it returns one row per car class with the daily price, the total price with taxes and fees, the prepay price, the mileage policy, the young renter fee and the availability. It also returns the Alamo branch directory (address, coordinates, opening hours, services) and the vehicle class catalog. No login, proxy or browser is needed. Pay per result.

Export the result as JSON, CSV, Excel, XML or HTML, or read it through the Apify API. A quote is a price estimate for the dates you ask for. The actor never books or reserves a car.

Alamo limits how many quotes its booking service answers per time window, so rental offers are a low-volume job. One quote returns every car class of one branch for one date range (13 to 44 rows), so a single quote is already many rows. The actor spaces quotes at least 10 seconds apart, and a run may stop early when the service starts refusing quotes. Locations and vehicle classes are not limited this way.

### What can you scrape from Alamo?

- **Rental offers (`rental-offer`)**: every car class that Alamo quotes for your pickup branch, return branch, dates and driver age. Each row has the class code, the example model, seats, bags, transmission, fuel, daily rate, total price, taxes and fees, prepay price, mileage policy and the availability status.
- **Locations (`location`)**: the Alamo branch pages with address, city, state, postal code, coordinates, opening hours, airport code, services such as After Hours Return and Skip the Counter, and counter directions. The directory lists 1,429 branches in 92 countries, 248 of them in the United States.
- **Vehicle classes (`vehicle-class`)**: the car class catalog for a country of residence, with the example model, category, seats, transmission, fuel, drive type and the feature list.

### Why use this Alamo scraper?

- **Prices for your dates**: you choose the pickup branch, the dates and times, the return branch and the driver age, and every row echoes them, so rows from many searches can sit in one table.
- **Price breakdown that adds up**: `totalPrice` includes taxes and fees. `baseSubtotal` is the sum of the base rates, `taxesAndFees` is the difference, and `pricePerDay` is the total divided by the rental days.
- **Real filters**: vehicle category, transmission, fuel type, minimum seats, maximum price per day and maximum total price, applied to the rows you receive.
- **One-way rentals**: set a return branch that differs from the pickup branch and each row is flagged `isOneWay`.
- **Any branch, in several ways**: use an airport code (`SAT`), a branch id (`52A3`), a city (`Austin, TX`) or a branch page address from alamo.com.
- **Public data only**: no login, no account, no proxy, no browser.

### How to scrape Alamo rental prices in four steps

1. Open the actor and keep **What to collect** on **Rental offers**.
2. Add one or more **Pickup locations**, for example `LAX`, `Austin, TX` or `https://www.alamo.com/en/car-rental-locations/us/tx/san-antonio-international-airport-52a3.html`.
3. Set the **Pickup date** and either the **Return date** or the **Rental days**. Leave them empty to quote a pickup 14 days from today for 3 days.
4. Click **Start**, then open the **Overview** tab or export the dataset.

### Three ways to collect data

| Mode | What you get | Typical use |
| --- | --- | --- |
| Rental offers | One row per car class and pickup branch | Price comparison, rate monitoring, travel apps |
| Locations | One row per branch | Branch lists, store locators, lead lists |
| Vehicle classes | One row per car class of the catalog | Fleet research, product matching |

### What data do you get from Alamo?

| Field | Description |
| --- | --- |
| `recordType` | `rental-offer`, `location` or `vehicle-class` |
| `title` | Readable name of the row |
| `carClassCode`, `vehicleClass`, `exampleModel` | Alamo class code, class name and example model |
| `category`, `subCategory` | Cars, SUVs, Trucks or Vans, and the sub category |
| `passengers`, `largeBags`, `smallBags`, `doors` | Capacity of the class |
| `transmission`, `fuelType`, `driveType` | Technical profile |
| `pricePerDay`, `totalPrice` | Daily price and total price in the branch currency, taxes and fees included |
| `baseRatePerDay`, `baseSubtotal`, `taxesAndFees`, `rates` | Price breakdown and the unit rates Alamo applies (daily, weekly, extra day) |
| `prepayTotalPrice`, `prepaySavings` | Pay-now price and the saving against paying at the counter |
| `renterCurrency`, `totalPriceRenterCurrency` | Price in the driver's currency when it differs from the branch currency |
| `unlimitedMileage`, `mileagePolicy` | Mileage rule of the quote |
| `minimumRenterAge`, `youngRenterFeePerDay`, `additionalDriverFeePerDay` | Age and driver fees read from the branch policy |
| `availability`, `isAvailable` | Status of the class for the dates |
| `pickupLocationId`, `pickupLocationName`, `pickupAirportCode`, `pickupAddress`, `pickupLatitude`, `pickupLongitude` | The pickup branch |
| `returnLocationId`, `isOneWay`, `pickupDateTime`, `returnDateTime`, `driverAge`, `renterCountry` | The search that produced the row |
| `address`, `city`, `state`, `postalCode`, `country`, `latitude`, `longitude`, `openingHours`, `services` | Branch fields in location rows |

#### Sample output

```json
{
  "imageUrl": "https://assets.gcs.ehi.com/content/alamo/data/vehicle/bookingCountries/US/SUVS/PGAR.doi.640.high.imageSmallThreeQuarterNodePath.png/1740004423988.png",
  "recordType": "rental-offer",
  "title": "Premium Crossover (Dodge Durango or similar) at San Antonio International Airport",
  "offerId": "52A3|52A3|2026-11-06T10:00|2026-11-09T10:00|30|US|PGAR",
  "url": "https://www.alamo.com/en/car-rental-locations/us/tx/san-antonio-international-airport-52a3.html",
  "carClassCode": "PGAR",
  "vehicleClass": "Premium Crossover",
  "exampleModel": "Dodge Durango",
  "category": "SUVs",
  "subCategory": "Premium & Luxury SUV",
  "passengers": 7,
  "luggageCapacity": 3,
  "largeBags": 2,
  "smallBags": 1,
  "transmission": "Automatic",
  "driveType": "2 Wheel Drive",
  "features": ["Cruise Control", "AM/FM Stereo Radio", "Automatic", "Air Conditioning", "2 Wheel Drive", "Bluetooth"],
  "availability": "AVAILABLE_AT_RETAIL_RATE",
  "isAvailable": true,
  "currency": "USD",
  "pricePerDay": 82.23,
  "totalPrice": 246.68,
  "baseRatePerDay": 56.21,
  "baseSubtotal": 168.63,
  "taxesAndFees": 78.05,
  "rates": [{ "type": "DAILY", "quantity": 3, "amount": 56.21 }],
  "rentalDays": 3,
  "prepayTotalPrice": 235.91,
  "prepaySavings": 10.77,
  "unlimitedMileage": true,
  "mileagePolicy": "Unlimited mileage",
  "minimumRenterAge": 21,
  "youngRenterFeePerDay": 25,
  "additionalDriverFeePerDay": 15,
  "pickupQuery": "https://www.alamo.com/en/car-rental-locations/us/tx/san-antonio-international-airport-52a3.html",
  "pickupLocationId": "52A3",
  "pickupLocationName": "San Antonio International Airport",
  "pickupAirportCode": "SAT",
  "pickupLocationType": "airport",
  "pickupAddress": "9559 Airport Blvd, San Antonio, TX 78216",
  "pickupCity": "San Antonio",
  "pickupState": "TX",
  "pickupCountry": "US",
  "pickupLatitude": 29.5259,
  "pickupLongitude": -98.4731,
  "pickupTimeZone": "America/Chicago",
  "returnLocationId": "52A3",
  "returnLocationName": "San Antonio International Airport",
  "isOneWay": false,
  "pickupDateTime": "2026-11-06T10:00",
  "returnDateTime": "2026-11-09T10:00",
  "driverAge": 30,
  "renterCountry": "US",
  "scrapedAt": "2026-10-23T17:57:54.806Z"
}
```

### Use with AI agents (MCP)

Connect the Apify MCP server to Claude, Cursor or another MCP client and this actor appears as a tool: `https://mcp.apify.com?tools=RecordsData/alamo-scraper`. Example prompt: "Compare Alamo SUV prices at LAX for the first week of December for a 28 year old driver."

### Run it from code

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('RecordsData/alamo-scraper').call({
  mode: 'offers',
  pickupLocations: ['LAX'],
  pickupDate: '2026-12-05',
  rentalDays: 7,
  vehicleCategories: ['SUVs'],
  maxItems: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.map((o) => `${o.vehicleClass}: ${o.pricePerDay} ${o.currency} per day`));
```

### Is it legal to scrape Alamo? Limits and responsible use

The actor reads public pages and the public booking quote service of alamo.com. It does not log in, solve captchas or use a browser. It makes one request at a time at a gentle pace, and quotes at least 10 seconds apart. Alamo's terms of use restrict robots and automated access without written consent, so review them before commercial use, and keep your own use proportionate. Rows contain no data about renters or drivers.

### Frequently Asked Questions

#### What can I scrape from Alamo?

Rental quotes per car class for a branch and dates, the Alamo branch directory, and the vehicle class catalog. Pick the kind with **What to collect**.

#### Do I need a proxy, a login or an API key?

No. The actor makes plain HTTP requests and needs no proxy, browser or Alamo account. You only need an Apify account, and the free plan returns up to 10 items per run.

#### Is the price the same as on alamo.com?

It is the quote Alamo returns for the same branch, dates, times and driver age: the pay-later total with taxes and fees, plus the prepay total. It is an estimate for those dates, not a booking, and Alamo can change prices at any moment. Rates differ by driver age, so set **Driver age** to the age you want to compare.

#### Which fees and extras are not included?

Itemised fee lines, insurance products, equipment such as child seats, and fuel prices are not part of the output. The actor reports one `taxesAndFees` amount, the total minus the base rates. For drivers under 25 it includes the young renter surcharge.

#### How do I find a branch?

Use an airport code such as `SAT`, a branch id such as `52A3`, a city such as `Austin, TX`, or a branch page address. For branches outside the United States set **Country of the locations**, for example `GB` for `LHR`. Run **Locations** mode to list the branches of a state or country.

#### Why do I get fewer classes than I expected?

Alamo only quotes the classes a branch has for the dates. **Available offers only** removes classes marked as sold out, and your category, transmission, fuel, seats and price filters remove more. Turn them off to see the full quote.

#### How do one-way rentals work?

Put a different branch in **Return location**. Every row then has `isOneWay` true and the price includes any one-way charge Alamo applies.

#### Can I get prices in my own currency?

Rows carry the branch currency in `currency`. When the driver's country of residence uses another currency, the renter view appears in `renterCurrency`, `totalPriceRenterCurrency` and `pricePerDayRenterCurrency`.

#### What happens when the search finds nothing or the input is wrong?

A search with no hits, an unknown branch, a closed pickup time or a wrong input ends as succeeded with one free error row that explains the problem. Error rows are never charged.

#### How many rental offers can I collect in one run?

Offers are a low-volume job. One quote returns every car class of one branch for one date range, usually 13 to 44 rows, so one quote is many rows. A run with a handful of branches is the normal use. The actor waits at least 10 seconds between two quotes, so 10 branches take a few minutes. Keep **Branches per city** and the number of searches small, and use the Locations and Vehicle classes kinds for large lists.

#### Why did a run stop early or end with "The site could not be read"?

Alamo limits quote volume per time window. When quotes come in a quick burst, its booking service refuses them for a while and the limit eases after a few minutes. The actor waits at least 10 seconds between quotes, retries a refused quote once after 30 to 60 seconds, and stops when two branches in a row are refused. The run then ends early and says so in its message. If nothing was delivered the run is marked failed and nothing is charged. Rows already delivered stay in the dataset. Wait a few minutes, then run again with fewer branches. Locations and vehicle classes are not affected. The plain message "The site could not be read" appears for other failures, such as the site being down.

### Support

Questions, a missing field or a feature request: contact.punkrecordsdata@gmail.com. Reviews on the actor page help other people find it.

This actor is an independent tool and is not affiliated with Alamo Rent A Car or Enterprise Holdings.

# Actor input Schema

## `mode` (type: `string`):

offers: one row per car class quoted for a pickup branch and your dates. locations: one row per Alamo branch (address, coordinates, hours, services). vehicleClasses: the car classes Alamo rents out in a country.

## `pickupLocations` (type: `array`):

Where the car is picked up. Type an airport code (SAT), a branch id (52A3), a city (Austin or Austin, TX) or a branch page address from alamo.com. A city is expanded to its branches, airports first. In locations mode this narrows the branch list; leave it empty there to read every branch of the country.

## `returnLocation` (type: `string`):

Where the car is dropped off, same formats as the pickup. Leave empty to return it where it was picked up. A different branch makes a one-way rental, which Alamo usually prices higher.

## `locationCountry` (type: `string`):

Two-letter country code of the pickup places (US, CA, GB, MX, DE, AU...). It is used to look up airport codes and city names, and it is the country whose branches the locations mode lists.

## `locationState` (type: `string`):

Optional two-letter state or province code that narrows the locations mode to one state, for example TX or ON. Only countries with states in Alamo's address tree (US, CA, MX...) support it.

## `pickupDate` (type: `string`):

Day the rental starts, formatted 2026-12-12. Leave empty to use 14 days from today. It must not be in the past.

## `pickupTime` (type: `string`):

Local time at the pickup branch on a 24-hour clock, for example 10:00. The branch must be open then or Alamo refuses the quote.

## `returnDate` (type: `string`):

Day the car comes back, formatted 2026-12-15. Leave empty to use the pickup date plus the number of rental days below.

## `returnTime` (type: `string`):

Local time at the return branch on a 24-hour clock. Leave empty to use the pickup time.

## `rentalDays` (type: `integer`):

Length of the rental when no return date is given. Prices follow Alamo's daily, weekly and monthly rate steps, so a 7-day or 30-day rental can cost less per day.

## `driverAge` (type: `integer`):

Age of the main driver. Drivers under 25 pay Alamo's young renter surcharge, which is included in the totals, and some car classes are not offered to them.

## `renterCountry` (type: `string`):

Two-letter country code (US, CA, GB...). Alamo shows prices in the driver's currency next to the branch currency; the renterCurrency columns hold that view. It also picks the vehicle catalog in vehicleClasses mode.

## `vehicleCategories` (type: `array`):

Keep only these categories: Cars, SUVs, Trucks, Vans. Leave empty for all of them.

## `transmission` (type: `string`):

Keep only automatic or only manual cars.

## `fuelType` (type: `string`):

Keep only one fuel type.

## `minPassengers` (type: `integer`):

Keep only car classes that seat at least this many people.

## `maxPricePerDay` (type: `number`):

Keep only offers whose all-in price per day (taxes and fees included, branch currency) is at most this amount.

## `maxTotalPrice` (type: `number`):

Keep only offers whose total for the whole rental (taxes and fees included, branch currency) is at most this amount.

## `availableOnly` (type: `boolean`):

Skip car classes that Alamo does not offer for those dates (sold out or on request).

## `airportsOnly` (type: `boolean`):

In locations mode, keep only branches at an airport.

## `maxBranchesPerLocation` (type: `integer`):

When a pickup location is a city that has several branches, quote at most this many of them (airports first). An airport code or a branch id always means one branch.

## `includeContactDetails` (type: `boolean`):

Add the public phone number of each branch to the location rows. Off by default.

## `maxItems` (type: `integer`):

Stop after this many rows. Each car class quote, branch or vehicle class counts as one item. Free accounts are limited to 10 items per run.

## `proxyConfiguration` (type: `object`):

Off by default: the site answers Apify servers directly. Turn on the Apify proxy only if you see repeated blocked requests in the log.

## Actor input object example

```json
{
  "mode": "offers",
  "pickupLocations": [
    "SAT"
  ],
  "locationCountry": "US",
  "pickupTime": "10:00",
  "rentalDays": 3,
  "driverAge": 30,
  "renterCountry": "US",
  "transmission": "any",
  "fuelType": "any",
  "availableOnly": true,
  "airportsOnly": false,
  "maxBranchesPerLocation": 3,
  "includeContactDetails": false,
  "maxItems": 50,
  "proxyConfiguration": {}
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields per row

## `fullData` (type: `string`):

Complete dataset with all fields

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "pickupLocations": [
        "SAT"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("recordsdata/alamo-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "pickupLocations": ["SAT"] }

# Run the Actor and wait for it to finish
run = client.actor("recordsdata/alamo-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "pickupLocations": [
    "SAT"
  ]
}' |
apify call recordsdata/alamo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,recordsdata/alamo-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/hTpheKpSsqIBgfGhA/builds/X5f0ACzI9RB6vu5zF/openapi.json
