# Swappa Scraper - Used Tech, Prices, Sellers & Price History (`abotapi/swappa-com`) Actor

Scrape Swappa used-tech listings by device, carrier, storage, condition or color. Extract prices, seller details, battery health and full listing data, plus price guides, trade-in values and monthly price history.

- **URL**: https://apify.com/abotapi/swappa-com.md
- **Developed by:** [Abot API](https://apify.com/abotapi) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Swappa Scraper: Devices, Photos and Sold Price History

Collect Swappa listings for used electronics with asking prices, condition, battery health, seller information and full photo galleries. Get completed sales, monthly sold-price trends and trade-in values for each model. Search by device name or paste listing, product, price, guide or category links, then export the results as JSON, CSV or Excel or read them through the Apify API.

### Why This Scraper?

- **Asking prices and completed sales.** Compare active listings with the amounts buyers actually paid, including condition, carrier and storage for each published sale.
- **Full device photos.** Enable `fetchDetails` for all available full-size listing photos, descriptions, damage notes, seller policies and hardware specifications.
- **Seller context.** Collect seller names, profile links, ratings, rating counts, locations, payment options and seller badges.
- **Several ways in.** Search by model name or paste catalog, product, prices, guide, sales-history, individual listing, category or brand links.
- **History depth.** Get monthly price trends and trade-in values, with optional deeper completed-sale history.
- **Repeatable monitoring.** Incremental mode labels new, updated, reappeared and expired records; resume mode skips records already collected by an interrupted run.
- **Scoped collection.** Filter search results by condition, storage, carrier and other device options. URL mode preserves the filters and starting page in your pasted links.

### Use Cases

- **Used-device retailers:** compare asking prices and completed sales before sourcing inventory.
- **Resellers:** assess device condition, photos, damage notes and seller policies together.
- **Pricing analysts:** track depreciation across models, storage sizes and condition grades.
- **Marketplace researchers:** monitor inventory, seller activity and changes on a schedule.

### Data You Get

> Sample shape: values are illustrative placeholders, not from a live record.

| Field | Example |
|---|---|
| `kind` | `listing` or `soldPrices` |
| `listingId` | `LAAA00000` |
| `productSlug` / `productName` | `apple-iphone-15-pro` / `Apple iPhone 15 Pro` |
| `price` / `priceExact` / `currency` | `500` / `499.75` / `USD` |
| `condition` / `damageDescription` | `Good` / `Minor scratches on the frame.` |
| `batteryHealthPct` | `92` |
| `storage` / `color` / `carrier` | `256GB` / `Blue` / `Unlocked` |
| `modelNumber` / `gtin13` | `A0000` / `0000000000000` |
| `images` / `imageCount` / `imagesComplete` | Full-size photo URLs / `7` / `true` |
| `sellerId` / `sellerName` / `sellerProfileUrl` | `ABC000` / `Sample Seller` / seller profile URL |
| `sellerRating` / `sellerRatingsCount` | `5.0` / `100` |
| `sellerLocation` / `sellerBadges` | `Sample City` / `["Trusted Seller"]` |
| `description` / `sellerAddendum` | Seller-provided description and additional terms |
| `shippingCost` / `shippingPolicy` / `shippingDetails` | `0` / seller policy text / shipping information |
| `returnPolicy` / `returnDetails` | Seller return terms and marketplace return information |
| `compatibleCarriers` / `conditionDetails` | Compatible carriers and condition requirements |
| `listingBadges` / `stockPhotos` | `["Approved", "Featured"]` / `false` |
| `listedAt` / `listingUpdatedAt` / `listingExpiresAt` | `2026-01-01` / `2026-01-03` / `2026-01-31` |
| `specifications` | Grouped camera, processor, memory, battery, display, dimensions and weight specifications |
| `changeType` / `changedFields` | `UPDATED` / `["price"]` |
| `url` / `scrapedAt` | Listing URL / `2026-01-01T00:00:00Z` |

Sold-price records contain `salesHistory`, `soldPriceMin`, `soldPriceAvg`, `soldPriceMax`, `priceTrend`, `storagePrices`, `carrierStoragePrices` and the dates covered. Photos, policies and specifications depend on what the listing publishes. `imagesComplete: false` means the full gallery could not be collected; the returned photos are partial. Results, Devices for sale, Device details and Sold price history are available as separate output tabs.

### How to Use

1. Select **Search** for model names or **URL** for pasted Swappa links.
2. Choose **Listings**, **Sold prices**, or **Both**, then enable device details or deeper sold history if needed.
3. Set **Max listings** to control the number of returned records.
4. Start the run and download the dataset or access it through the API.

**Search by device name:**

```json
{
  "mode": "search",
  "queries": ["iPhone 15 Pro"],
  "resultType": "listings",
  "fetchDetails": true,
  "maxListings": 20
}
```

**Use product, price and category links:**

```json
{
  "mode": "url",
  "urls": [
    "https://swappa.com/listings/apple-iphone-15-pro?condition=mint&page=2",
    "https://swappa.com/prices/apple-iphone-15-pro",
    "https://swappa.com/catalog/product/apple-iphone-15-pro",
    "https://swappa.com/guide/apple-iphone-15-pro",
    "https://swappa.com/buy/phones"
  ],
  "resultType": "both",
  "fetchDetails": true,
  "maxListings": 20
}
```

**Collect deeper sold-price history:**

```json
{
  "mode": "search",
  "queries": ["iPhone 15 Pro", "Galaxy S24 Ultra"],
  "resultType": "soldPrices",
  "deepSoldHistory": true,
  "maxListings": 2
}
```

**Monitor a model for changes:**

```json
{
  "mode": "search",
  "queries": ["iPhone 15 Pro"],
  "resultType": "listings",
  "condition": "mint",
  "incrementalMode": true,
  "emitExpired": true,
  "stateKey": "iphone-15-pro-mint",
  "maxListings": 100
}
```

#### Run it from your code

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("abotapi/swappa-com").call(run_input={
    "mode": "url",
    "urls": ["https://swappa.com/prices/apple-iphone-15-pro"],
    "resultType": "both",
    "fetchDetails": True,
    "maxListings": 5,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

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

const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('abotapi/swappa-com').call({
  mode: 'url',
  urls: ['https://swappa.com/prices/apple-iphone-15-pro'],
  resultType: 'both',
  fetchDetails: true,
  maxListings: 5,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Use the Integrations tab to connect Make, Zapier, n8n, Google Sheets or webhooks.

#### URL behavior and limits

Model listing, product, prices, guide and sales-history links select the same device model. A single-device link selects that listing and, when requested, its model's sold-price history. Category, brand and price-index links collect the device models shown on that page. URL filters and `page=N` are preserved for device listings; search-only filters do not replace them. Price and battery bounds apply to listings in either mode.

`maxListings` counts both device and sold-price records. With `both`, allow enough room for both kinds. `maxPages` limits pages per model; omitted or `0` means no page limit. An expired or unavailable listing cannot supply an active device record. Unsupported links fail with a clear message.

#### History, resume and recurring runs

Monthly trends typically cover a rolling six-month window. Recent completed sales are limited per model and filter combination, so their date range varies. `deepSoldHistory` collects additional condition, carrier and storage combinations and merges duplicate sales. Missing monthly prices remain `null`.

Use `resumeFromRunId` to finish an interrupted run without repeating its collected listing IDs. Use `incrementalMode` with the same `stateKey` for recurring monitoring. `emitUnchanged` includes unchanged rows; `emitExpired` applies only when the run proves that the monitored catalog was fully scanned. Capped or incomplete runs do not prove that unseen listings expired.

### Send results into your apps (MCP connectors)

Results can optionally be piped into apps you already use, through Model Context Protocol connectors. Authorize a connector under Apify, Settings, API and Integrations, then select it in the `mcpConnectors` input. For Notion, also set `notionParentPageUrl` to the page under which item pages should be created. Use `maxNotifyListings` to cap how many items are written to each connector per run.

What gets written is a condensed, human-readable summary per item: a title plus the key fields flattened to plain text. Nested objects collapse to their main value and arrays are trimmed to a few entries, so the connector view is a digest, not a mirror. The complete record, including the full `images`, `salesHistory` and `priceTrend` arrays, always stays in the Apify dataset. Leaving `mcpConnectors` empty skips the export entirely and never changes the dataset output.

### Input Parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| `mode` | string | `search` | Search device names or read pasted links in `url` mode. |
| `queries` | array | empty | Search mode: device names or product slugs. |
| `resultType` | string | `both` | `listings`, `soldPrices`, or `both`. |
| `condition` | string | any | Search mode: `new`, `mint`, `good`, or `fair`. |
| `carrier` | string | any | Search mode: carrier compatibility, including `unlocked`, `att`, `t-mobile`, `verizon`, and `mint`. |
| `storage` | string | any | Search mode: storage token, such as `128gb` or `1tb`. |
| `color` | string | any | Search mode: color token. |
| `modeln` | string | any | Search mode: model-number token. |
| `sort` | string | site default | Search mode: `price_low`, `price_high`, `listing_created_newest`, or `listing_created_oldest`. |
| `withWarranty` | boolean | `false` | Search mode: one-year warranty listings only. |
| `acceptsCreditCards` | boolean | `false` | Search mode: sellers accepting card payments. |
| `carrierUnlockedOnly` | boolean | `false` | Search mode: unlocked devices only. |
| `excludeBusinesses` | boolean | `false` | Search mode: individual sellers only. |
| `phoneCheckCertified` | boolean | `false` | Search mode: certified devices only. |
| `internationalShipping` | boolean | `false` | Search mode: international shipping listings only. |
| `urls` | array | empty | URL mode: listing, product, prices, guide, sales-history, category or brand links. |
| `minPrice` | integer | unset | Both modes: minimum device price in USD. |
| `maxPrice` | integer | unset | Both modes: maximum device price in USD. |
| `minBatteryHealth` | integer | unset | Both modes: minimum battery percentage; devices without a percentage are excluded. |
| `fetchDetails` | boolean | `false` | Collect full galleries and device details. Adds a per-record surcharge for enriched results. |
| `deepSoldHistory` | boolean | `false` | Collect deeper completed-sale history. Adds a per-record surcharge for deepened results. |
| `maxListings` | integer | `20` | Maximum returned records across both kinds. `0` means unlimited. |
| `maxPages` | integer | unlimited | Maximum catalog pages per model. Omitted or `0` means unlimited. |
| `incrementalMode` | boolean | `false` | Label and suppress records using the previous matching baseline. |
| `emitUnchanged` | boolean | `false` | Also emit unchanged records. |
| `emitExpired` | boolean | `false` | Emit missing listings after a complete catalog scan. |
| `stateKey` | string | derived | Name the recurring monitoring baseline. |
| `resumeFromRunId` | string | unset | Skip listing IDs already collected by this run or dataset. |
| `proxy` | object | Residential, US | Connection settings; use the recommended input preset. |
| `mcpConnectors` | array | empty | Optional connectors for sending results into your apps. |
| `notionParentPageUrl` | string | unset | Parent Notion page for connector output. |
| `maxNotifyListings` | integer | `50` | Maximum records sent to each connector. |

### Output Example

> Sample shape: values are illustrative placeholders, not from a live record.

```json
{
  "kind": "listing",
  "listingId": "LAAA00000",
  "productSlug": "apple-iphone-15-pro",
  "productName": "Apple iPhone 15 Pro",
  "brand": "Apple",
  "title": "Sample listing headline",
  "price": 500,
  "priceExact": 499.75,
  "currency": "USD",
  "condition": "Good",
  "batteryHealthPct": 92,
  "storage": "256GB",
  "color": "Blue",
  "carrier": "Unlocked",
  "carrierUnlocked": true,
  "modelNumber": "A0000",
  "gtin13": "0000000000000",
  "featured": true,
  "listingBadges": ["Approved", "Featured"],
  "stockPhotos": false,
  "imageUrl": "https://static.swappa.com/media/listing/LAAA00000/sample-front.jpg",
  "images": [
    "https://static.swappa.com/media/listing/LAAA00000/sample-front.jpg",
    "https://static.swappa.com/media/listing/LAAA00000/sample-back.jpg"
  ],
  "imageCount": 2,
  "imagesComplete": true,
  "sellerId": "ABC000",
  "sellerName": "Sample Seller",
  "sellerProfileUrl": "https://swappa.com/profile/ABC000",
  "sellerRating": 5.0,
  "sellerRatingsCount": 100,
  "sellerLocation": "Sample City",
  "sellerBadges": ["Trusted Seller"],
  "acceptsPaypal": true,
  "acceptsCreditCards": true,
  "description": "Sample device description.",
  "damageDescription": "Minor scratches on the frame.",
  "sellerAddendum": "Sample seller terms.",
  "compatibleCarriers": ["AT&T", "T-Mobile", "Verizon"],
  "compatibleCarrierCount": 3,
  "shippingCost": 0,
  "shippingPolicy": "Sample shipping policy.",
  "shippingDetails": ["Ships with tracking and insurance."],
  "returnPolicy": "Sample return policy.",
  "returnDetails": ["Marketplace return policies apply."],
  "conditionDetails": ["Minor wear and tear."],
  "listedAt": "2026-01-01",
  "listingUpdatedAt": "2026-01-03",
  "listingExpiresAt": "2026-01-31",
  "specifications": [
    {"group": "Battery and Charging", "name": "Capacity", "value": "3274 mAh"}
  ],
  "detailFetched": true,
  "changeType": "NEW",
  "changedFields": [],
  "firstSeenAt": "2026-01-01T00:00:00Z",
  "lastSeenAt": "2026-01-01T00:00:00Z",
  "url": "https://swappa.com/listing/view/LAAA00000",
  "scrapedAt": "2026-01-01T00:00:00Z"
}
```

### Plan Requirement

Use an Apify account with access to the connection settings selected in the input. Check the Pricing tab for current result and enrichment charges.

### FAQ

#### How much does it cost?

See the Pricing tab for current rates. `maxListings` controls the returned record count. Device details and deeper sold history add a surcharge to successfully enriched records.

#### Is it legal to scrape Swappa?

Use publicly available data and follow the site's terms, applicable privacy laws and other regulations. You are responsible for having a lawful basis for any personal data you process.

#### Can I collect only new or changed devices on a schedule?

Yes. Enable `incrementalMode` and reuse the same input scope and `stateKey`. Leave `emitUnchanged` off to suppress unchanged records. Use `resumeFromRunId` separately to finish an interrupted collection.

#### Why do I see only one photo?

Catalog-only collection returns a preview image. Enable `fetchDetails` for the full `images` array. Check `imagesComplete` to distinguish a complete gallery from a partial read. Some listings publish only one photo or use seller stock photos.

#### Can I paste a prices link and still get device listings?

Yes. Product, prices, guide and sales-history links select the model; `resultType` selects its listings, sold history or both. Category and brand links select the models shown on that page.

#### Why did my run fail instead of returning an empty dataset?

An unreadable page or unsupported link is reported as a failure. Review the input and try again shortly. An empty market or a filter with no matching devices is different from a page that could not be read.

#### Can I use the results with AI agents or MCP?

Yes. Read the dataset through the Apify API or configure the optional MCP connectors to send a summary into your apps. The complete records remain in the dataset.

### 🔗 Want more electronics data?

Pair this actor with these related scrapers from the same team:

<table>
<tr><td>🏷️ <a href="https://apify.com/abotapi/avito-ru-scraper"><b>Avito.ru Scraper</b></a><br>From $1/1K. Scrape structured listings from Avito.ru by region, category, filters, or...</td><td>🔌 <a href="https://apify.com/abotapi/biccamera-com-scraper"><b>Bic Camera Scraper</b></a><br>Scrape Bic Camera (biccamera.com) products: JPY price, list price and discount, Bic Point...</td></tr>
<tr><td>🔌 <a href="https://apify.com/abotapi/boulanger-com-scraper"><b>Boulanger.com</b></a><br>Scrape Boulanger (boulanger.com) electronics and home-appliance products: current price...</td><td>🔌 <a href="https://apify.com/abotapi/darty-com-scraper"><b>Darty Scraper</b></a><br>Scrape Darty (darty.com) products: current price plus strike-through reference price and...</td></tr>
<tr><td>🔌 <a href="https://apify.com/abotapi/dienmayxanh-scraper"><b>Dienmayxanh Scraper</b></a><br>Scrape dienmayxanh.com home appliances and electronics with full specifications, current...</td><td>🥦 <a href="https://apify.com/abotapi/elcorteingles-es-scraper"><b>El Corte Inglés Scraper</b></a><br>Scrape El Corte Inglés elcorteingles.es products across fashion, electronics, home...</td></tr>
</table>

👉 [Browse all abotapi scrapers](https://apify.com/abotapi)

### 💬 Support & custom scrapers

- 🐞 **Found a bug or a missing field?** Open a ticket on the [Issues tab](https://apify.com/abotapi/swappa-com/issues/open). We usually reply within hours.
- 🛠️ **Need another site, extra fields or a private build?** Email <contact@abotapi.com> or message [Telegram @abotapi](https://t.me/abotapi).
- ⭐ **Enjoying it?** A quick review on the actor page helps other users find it.

# Actor input Schema

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

Search mode resolves a device keyword to a product and walks its catalogue. URL mode reads addresses you paste.

## `resultType` (type: `string`):

Applies in both modes. Sold-price history is one record per device model carrying completed-sale rows, the monthly average sold price per storage size, list-versus-sale spreads, and the trade-in value per carrier and storage. Listings are the individual devices currently for sale.

## `queries` (type: `array`):

Device names to look up, for example 'iPhone 15 Pro' or 'MacBook Air M2'. A product slug such as 'apple-iphone-15-pro' is accepted directly. Each entry becomes one scrape target.

## `condition` (type: `string`):

Search mode only. Keep only devices graded at this condition.

## `carrier` (type: `string`):

Search mode only. Keep only devices that work on this carrier. This includes carrier-locked devices on that network AND unlocked devices, which work anywhere; devices locked to a different carrier are excluded. An unrecognised value is ignored by the source and returns everything.

## `storage` (type: `string`):

Search mode only. Keep only devices with this storage size. Sizes that a given model does not offer simply return nothing.

## `color` (type: `string`):

Search mode only. Colour slug as the catalogue uses it, for example 'black' or 'blue'. Leave empty for any colour. A value the source does not recognise is ignored and returns every colour, so check the spelling if the results look unfiltered.

## `modeln` (type: `string`):

Search mode only. The catalogue's model-number filter token. Leave empty for any model number. A value the source does not recognise is ignored and returns every model number, so check the token if the results look unfiltered.

## `sort` (type: `string`):

Search mode only. Order the catalogue before reading it.

## `withWarranty` (type: `boolean`):

Search mode only. Keep only devices sold with a one-year warranty.

## `acceptsCreditCards` (type: `boolean`):

Search mode only. Keep only devices from sellers who take card payment.

## `carrierUnlockedOnly` (type: `boolean`):

Search mode only. Keep only devices that are carrier unlocked.

## `excludeBusinesses` (type: `boolean`):

Search mode only. Drop high-volume enterprise sellers and keep individual sellers only.

## `phoneCheckCertified` (type: `boolean`):

Search mode only. Keep only devices that carry a third-party diagnostic certification.

## `internationalShipping` (type: `boolean`):

Search mode only. Keep only devices whose seller ships outside the United States.

## `urls` (type: `array`):

Multi-URL supported. Paste listing catalog, product, prices, guide, sales-history, single device, or category/brand links. Page numbers and URL filters are preserved. The catalogue filters above are ignored; the price and battery filters below still apply.

## `minPrice` (type: `integer`):

Applies in both modes. Drop devices priced below this.

## `maxPrice` (type: `integer`):

Applies in both modes. Drop devices priced above this.

## `minBatteryHealth` (type: `integer`):

Applies in both modes. Drop devices whose stated battery health is below this. Devices that publish no battery figure are dropped when this is set.

## `fetchDetails` (type: `boolean`):

Open every device page for the full description, damage notes, seller policies, compatible carriers, specifications and all full-size photos. Adds a per-record surcharge for successfully enriched results.

## `deepSoldHistory` (type: `boolean`):

The site publishes the twenty most recent completed sales per slice, so a fast-selling model shows only a couple of days. Turning this on sweeps the condition, carrier and storage slices to reach months of completed sales instead. Costs up to twelve extra requests per device model and adds the detail-enrichment surcharge to each sold-price record it deepens.

## `maxPages` (type: `integer`):

Safety stop on how deep to walk each device's catalogue. Use 0 for no limit, which is the default: the walk stops on its own when the catalogue ends, and the maximum-devices setting below is the one limit that bounds a normal run.

## `maxListings` (type: `integer`):

Stop after this many records. Use 0 for no limit.

## `incrementalMode` (type: `boolean`):

Remember the previous run of this same search and label each record NEW, UPDATED, REAPPEARED or EXPIRED. For finishing a single interrupted run use resumeFromRunId instead.

## `emitUnchanged` (type: `boolean`):

Incremental mode only. Returns records that did not change since the last run. These are extra rows and they are billed like any other row.

## `emitExpired` (type: `boolean`):

Incremental mode only. Returns a row for every previously seen device that is gone now. These are extra rows and they are billed like any other row. Only produced when the run proved it read the whole catalogue. A run given individual listing addresses reads a fixed list rather than a catalogue, so it never produces these rows.

## `stateKey` (type: `string`):

Incremental mode only. Name this monitoring baseline yourself. Leave empty and one is derived from the mode, devices, addresses and every filter, so two different setups never share a baseline.

## `resumeFromRunId` (type: `string`):

Continue one interrupted run: records that run already returned are skipped. For a repeating schedule use incrementalMode instead.

## `proxy` (type: `object`):

Residential with country US is strongly recommended. Other settings often return nothing.

## `mcpConnectors` (type: `array`):

Optionally send results into the apps you already use, via Model Context Protocol (MCP) connectors. Authorize one under Apify, Settings, API and Integrations, then select it here. Notion gets a rich page-per-item export; other connectors get a best-effort write or digest. Leave empty to skip; it never changes the dataset output. Supported: Notion (https://mcp.notion.com/mcp), Linear (https://mcp.linear.app/sse), Airtable (https://mcp.airtable.com/mcp), Apify (https://mcp.apify.com).

## `notionParentPageUrl` (type: `string`):

URL (or id) of the Notion page under which item pages are created. Required to enable the Notion export; ignored by other connectors.

## `maxNotifyListings` (type: `integer`):

Cap on items written to each connector per run. Does not affect the dataset.

## Actor input object example

```json
{
  "mode": "search",
  "resultType": "both",
  "queries": [
    "iPhone 15 Pro"
  ],
  "condition": "",
  "carrier": "",
  "storage": "",
  "sort": "",
  "withWarranty": false,
  "acceptsCreditCards": false,
  "carrierUnlockedOnly": false,
  "excludeBusinesses": false,
  "phoneCheckCertified": false,
  "internationalShipping": false,
  "urls": [
    "https://swappa.com/listings/apple-iphone-15-pro"
  ],
  "fetchDetails": false,
  "deepSoldHistory": false,
  "maxPages": 0,
  "maxListings": 20,
  "incrementalMode": false,
  "emitUnchanged": false,
  "emitExpired": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  },
  "maxNotifyListings": 50
}
```

# Actor output Schema

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

No description

## `soldPrices` (type: `string`):

No description

## `listings` (type: `string`):

No description

## `details` (type: `string`):

No description

# 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 = {
    "resultType": "both",
    "queries": [
        "iPhone 15 Pro"
    ],
    "urls": [
        "https://swappa.com/listings/apple-iphone-15-pro"
    ],
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("abotapi/swappa-com").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 = {
    "resultType": "both",
    "queries": ["iPhone 15 Pro"],
    "urls": ["https://swappa.com/listings/apple-iphone-15-pro"],
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("abotapi/swappa-com").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 '{
  "resultType": "both",
  "queries": [
    "iPhone 15 Pro"
  ],
  "urls": [
    "https://swappa.com/listings/apple-iphone-15-pro"
  ],
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call abotapi/swappa-com --silent --output-dataset

```

## MCP server setup

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

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/fyhRXbhr2QYGx9fAi/builds/ElR11p8xopC9OGagq/openapi.json
