Facebook Marketplace Listing API. Send a listing link or ID.
Item for sale with price, photos and seller. We handle the proxies, blocks and platform changes.
Facebook Marketplace Listing API at a glance
Returns a public Facebook Marketplace listing from its link or ID: title, price, condition, description, photos and the seller with their rating. It also has the struck-through earlier price, currency, category, whether it's available, pending or sold, videos, the seller's join date, the area it's in with coordinates, and pickup, shipping or Buy now. Vehicles add make, model, trim, mileage, transmission and colors, and homes their details.
GET /v1/facebook/listing
- 1 credit per request, $0.75–$1.97 per 1,000 requests
- 23 typed fields null when unknown
urlis all it needs, e.g.https://www.facebook.com/marketplace/item/1456476040872340/- 100 credits free when you sign up, no card, so you can build before you spend
Send one request. Get 23 fields back.
Copy the request in your language, or hand it to your agent. Sign up for an API key and your first 100 credits are free.
$ npm install socialtapurl = https://www.facebook.com/marketplace/item/1456476040872340/const params = new URLSearchParams({
url: "https://www.facebook.com/marketplace/item/1456476040872340/",
});
const res = await fetch(`https://socialtap.dev/v1/facebook/listing?${params}`, {
headers: { "x-api-key": process.env.SOCIALTAP_API_KEY ?? "" },
});
const body = await res.json();
if (!res.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
const { data, meta } = body;
console.log(data, meta.credits_charged);import os
import requests
res = requests.get(
"https://socialtap.dev/v1/facebook/listing",
params={"url": "https://www.facebook.com/marketplace/item/1456476040872340/"},
headers={"x-api-key": os.environ["SOCIALTAP_API_KEY"]},
)
body = res.json()
if not res.ok:
raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
data, meta = body["data"], body["meta"]
print(data, meta["credits_charged"])require "json"
require "net/http"
uri = URI("https://socialtap.dev/v1/facebook/listing")
uri.query = URI.encode_www_form('url' => 'https://www.facebook.com/marketplace/item/1456476040872340/')
req = Net::HTTP::Get.new(uri)
req["x-api-key"] = ENV.fetch("SOCIALTAP_API_KEY")
res = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(req) }
body = JSON.parse(res.body)
raise "#{body["error"]["code"]}: #{body["error"]["message"]}" unless res.is_a?(Net::HTTPSuccess)
pp body["data"]
puts body["meta"]["credits_charged"]<?php
$query = http_build_query([
'url' => 'https://www.facebook.com/marketplace/item/1456476040872340/',
]);
$ch = curl_init('https://socialtap.dev/v1/facebook/listing?' . $query);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['x-api-key: ' . getenv('SOCIALTAP_API_KEY')],
]);
$body = json_decode(curl_exec($ch), true);
if (curl_getinfo($ch, CURLINFO_RESPONSE_CODE) >= 400) {
throw new RuntimeException($body['error']['code'] . ': ' . $body['error']['message']);
}
print_r($body['data']);
echo $body['meta']['credits_charged'], PHP_EOL;package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"net/url"
"os"
)
func main() {
q := url.Values{}
q.Set("url", "https://www.facebook.com/marketplace/item/1456476040872340/")
req, err := http.NewRequest("GET", "https://socialtap.dev/v1/facebook/listing?"+q.Encode(), nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("x-api-key", os.Getenv("SOCIALTAP_API_KEY"))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer res.Body.Close()
var body struct {
Data json.RawMessage `json:"data"`
Meta map[string]any `json:"meta"`
Error *struct {
Code string `json:"code"`
Message string `json:"message"`
} `json:"error"`
}
if err := json.NewDecoder(res.Body).Decode(&body); err != nil {
log.Fatal(err)
}
if body.Error != nil {
log.Fatalf("%s: %s", body.Error.Code, body.Error.Message)
}
fmt.Println(string(body.Data), body.Meta["credits_charged"])
}curl -G 'https://socialtap.dev/v1/facebook/listing' \
--data-urlencode 'url=https://www.facebook.com/marketplace/item/1456476040872340/' \
-H "x-api-key: $SOCIALTAP_API_KEY"{
"data": {
"approximate_fields": [
"platform_specific.facebook.latitude",
"platform_specific.facebook.longitude"
],
"attributes": [
{
"name": "Condition",
"value": "Used - like new"
},
{
"name": "Material",
"value": "Steel"
},
{
"name": "Bicycle Type",
"value": "Cruiser Bike"
}
],
"availability": "in_stock",
"category": "Bicycles",
"category_id": "1658310421102081",
"condition": "used",
"condition_label": "Used - like new",
"country_code": null,
"currency": "USD",
"description": "Barely used, 24\" steel Huffy Bike perfect for outdoor terrain and everyday rides \n\n-Fully functional brakestyle with progressive sizing and clean seat cover \n\n-If needed, I am willing to deliver the bike to your home or flexible for an at-home pick-up",
"id": "1456476040872340",
"max_price": 45,
"media": [
{
"alt_text": null,
"duration_ms": null,
"expires_at": "2026-10-25T18:00:00Z",
"height": 720,
"thumbnail_url": null,
"type": "image",
"url": "https://scontent-atl3-2.xx.fbcdn.net/v/t39.84726-6/796968328_2328210001329072_7831806606744114668_n.jpg?stp=dst-jpg_p720x720_tt6&_nc_cat=101&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBE…",
"width": 960
},
{
"alt_text": null,
"duration_ms": null,
"expires_at": "2026-10-25T18:00:00Z",
"height": 960,
"thumbnail_url": null,
"type": "image",
"url": "https://scontent-atl3-1.xx.fbcdn.net/v/t45.5328-4/800796705_2129037657962264_2251174291161391522_n.jpg?stp=dst-jpg_p720x720_tt6&_nc_cat=109&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=23&_nc_ht=scontent-atl3-1.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBED…",
"width": 720
}
],
"original_price": null,
"platform": "facebook",
"platform_specific": {
"facebook": {
"delivery_types": [
"in_person",
"door_pickup",
"door_dropoff"
],
"is_buy_now_enabled": false,
"is_local_pickup": true,
"latitude": 40.663146972656,
"location": "Rockville Centre, NY",
"location_id": null,
"longitude": -73.635864257812,
"postal_code": null,
"price_period": null,
"published_at": "2026-09-09T13:45:37Z",
"seller_joined_at": "2026-09-09T13:20:08Z",
"seller_rating": null,
"seller_rating_count": null
}
},
"price": 45,
"seller": {
"avatar_url": "https://scontent-atl3-1.xx.fbcdn.net/v/t39.30808-1/795438461_122093964159482116_3880964857956452102_n.jpg?stp=c334.0.1380.1380a_cp6_dst-jpg_tt6&cstp=mx1380x1380&ctp=s100x100&_nc_cat=110&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=24&_nc_ht=scontent-atl3-…",
"display_name": "Meredith Hall",
"id": "pfbid0bhJ8iBQwR4XVDCyEgQU4hKBvHyZPUVgJuBYVSa4henf9QvFwHycKvjgyYX3imnYCl",
"is_verified": false,
"url": null,
"username": null
},
"shipping": {
"fee": null,
"is_offered": false
},
"thumbnail_url": "https://scontent-atl3-2.xx.fbcdn.net/v/t39.84726-6/796968328_2328210001329072_7831806606744114668_n.jpg?stp=dst-jpg_p720x720_tt6&_nc_cat=101&ccb=SCRUBBED&_nc_sid=SCRUBBED&_nc_ohc=SCRUBBED&_nc_oc=SCRUBBED&_nc_zt=14&_nc_ht=scontent-atl3-2.xx&_nc_gid=SCRUBBED&_nc_ss=7b289&oh=SCRUBBE…",
"title": "Barely Used, \"26 Turquoise Huffy Bike",
"type": "listing",
"unknown_fields": [],
"url": "https://www.facebook.com/marketplace/item/1456476040872340/"
},
"meta": {
"request_id": "req_3f9c2a7d1e8b4c6a9f0e2d4b6a8c0e1f",
"platform": "facebook",
"source": "api",
"is_cached": false,
"credits_charged": 1,
"latency_ms": 2624,
"fetched_at": "2026-10-25T12:00:00Z",
"input": {
"kind": "product",
"id": "1456476040872340",
"url": "https://www.facebook.com/marketplace/item/1456476040872340/"
},
"credits_remaining": 9999,
"client_request_id": null,
"warnings": []
}
}import { SocialTap } from "socialtap";
const client = new SocialTap(); // apiKey defaults to process.env.SOCIALTAP_API_KEY
const res = await client.facebook.listing.get({ url: "https://www.facebook.com/marketplace/item/1456476040872340/" });
console.log(res.data);
console.log(res.credits.charged, res.meta.request_id);import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
public class Main {
public static void main(String[] args) throws Exception {
String query = "url=" + encode("https://www.facebook.com/marketplace/item/1456476040872340/");
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://socialtap.dev/v1/facebook/listing?" + query))
.header("x-api-key", System.getenv("SOCIALTAP_API_KEY"))
.GET()
.build();
HttpResponse<String> response = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofString());
// An error is {"error": {"code", "message", ...}}; success is {data, meta}, meta.credits_charged its price.
if (response.statusCode() >= 400) throw new RuntimeException(response.body());
System.out.println(response.body());
}
static String encode(String value) {
return URLEncoder.encode(value, StandardCharsets.UTF_8);
}
}using System.Text.Json;
using var http = new HttpClient();
http.DefaultRequestHeaders.Add("x-api-key", Environment.GetEnvironmentVariable("SOCIALTAP_API_KEY"));
var query = string.Join("&",
"url=" + Uri.EscapeDataString("https://www.facebook.com/marketplace/item/1456476040872340/"));
var res = await http.GetAsync("https://socialtap.dev/v1/facebook/listing?" + query);
using var body = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
if (!res.IsSuccessStatusCode)
{
var error = body.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code")}: {error.GetProperty("message")}");
}
Console.WriteLine(body.RootElement.GetProperty("data"));
Console.WriteLine(body.RootElement.GetProperty("meta").GetProperty("credits_charged"));// Cargo.toml: reqwest = { version = "0.12", features = ["blocking", "json"] }, serde_json = "1"
use std::env;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let res = reqwest::blocking::Client::new()
.get("https://socialtap.dev/v1/facebook/listing")
.query(&[("url", "https://www.facebook.com/marketplace/item/1456476040872340/")])
.header("x-api-key", env::var("SOCIALTAP_API_KEY")?)
.send()?;
let ok = res.status().is_success();
let body: serde_json::Value = res.json()?;
if !ok {
return Err(format!("{}: {}", body["error"]["code"], body["error"]["message"]).into());
}
println!("{} {}", body["data"], body["meta"]["credits_charged"]);
Ok(())
}200 OK · GET https://socialtap.dev/v1/facebook/listingLong arrays and strings are shortened here. Real responses are complete.Docs One schema on 3 platforms.
The response reference lists every field, its type and when it is null. See the full schema.
Null means unknown
A field Facebook Marketplace doesn't show is null, never zero or an empty string, so a real zero always means zero.
What it accepts
Facebook Marketplace listing URL (/marketplace/item/<id>, also under a city's or category's path, or the older /commerce/listing/<id>; www., m. and web. hosts, any query string), or the listing's numeric ID.
Write one parser
Facebook Marketplace, Amazon and TikTok Shop answer in these fields, so the code that reads one reads them all.
platformstring- Platform ID (tiktokshop, facebook, …).
idstring- Platform-native product or listing ID (string).
urlstring- Canonical product page URL.
typestring- product: a catalog product a shop sells in many units, often in variants (TikTok Shop, Instagram and YouTube shopping); listing: a single item a person or business lists for sale (Facebook Marketplace). New values may be added; treat unknown values as product.
titlestring- Product name or listing title, as the seller wrote it.
descriptionstring- Description as plain text (paragraphs separated by blank lines); null when it has none or the source does not show it (lists and search results).
categorystring- The platform's most specific category label (Bicycles, Vitamins & Supplements), as shown; not normalized across platforms.
category_idstring- The platform's ID of that category (what its category browsing and filters take).
Live data from 33 platforms.
What teams build with the Facebook Marketplace Listing API.
Track resale prices and availability
Monitor listings of your brand's products
Vet a listing and its seller before buying
Enrich search results with full listing details
Good to know before you build.
- Coordinates are the area Facebook shows on its map, never the seller's address, so approximate_fields always lists them.
- A deleted, removed or never-existing listing returns not_found. A sold or pending one comes back with its availability.
- Photo and video links are Facebook CDN links that expire at media[].expires_at: download what you need before then.
- A property rental's price is its monthly rent, and platform_specific.facebook.price_period is month.
- The seller's rating is null unless their Marketplace ratings are public.
1 credit per request. Failed requests are free.
Buy credits once and spend them on any endpoint, on any platform.
| Source | Price per successful request | Per 1,000 requests |
|---|---|---|
Platform API api | 1 credit | $0.75–$1.97 |
Public page page | 1 credit | $0.75–$1.97 |
- Cache hits are free.
- Credits from packs and top-ups never expire.
- A monthly plan's credits are spent first, and what is left of them ends at each renewal.
- Prices exclude tax: sales tax is added at checkout where it applies.
- Outside the US, plans and packs are sold to businesses: checkout asks for your VAT, GST or other business tax ID.
Questions about the Facebook Marketplace Listing API.
More in the API reference.
How much does the Facebook Marketplace Listing API cost?
Try it on a link you already have.
Paste it in the playground, or copy the request into your code.
- No credit card
- Failed requests are free
- Works on all 218 endpoints