Choose how to integrate

Compare REST, the Python and Node SDKs, the MCP server, and webhooks, then pick the surface that fits your stack and your workload.

Every surface talks to the same API at https://listingsapi.com/api/v4 with the same key, so this is not a one-way choice. Most teams start with one SDK, add webhooks once they are past the first sync, and give their AI tooling the MCP server on the side.

1. Pick a surface

REST directly. Any language, the full surface, no dependency to manage. You handle the response envelope, both pagination styles, and error checking yourself. Choose it when you already have an HTTP client you trust or when you need an endpoint the SDKs do not wrap yet.

Python SDK. pip install listingsapi. Typed resource classes under client.locations, client.reviews, and so on, cursor pages that walk themselves with auto_paging_iter(), retries on 429 and 5xx, and client-side validation on locations.add() so a bad create never leaves your machine. Read Python SDK.

Node SDK. npm install listingsapi-js. TypeScript with bundled types, zero runtime dependencies, Node 18 or later. Methods live flat on the client (client.fetchAllLocations()), fetchAll: true flattens a paginated list, and numeric ids are base64-encoded for you. Read Node SDK.

MCP server. A hosted Streamable HTTP server at https://listingsapi.com/mcp for AI assistants such as Claude and Cursor. There is nothing to install: the assistant can search the docs, browse the REST endpoints, and act on your account with the same tools you would call. Connect with your API key or through OAuth. The dashboard page at /dashboard/mcp shows the exact config to paste into each client and lists every tool with the key level it needs. Step by step for Claude, ChatGPT, Cursor and Gemini: Connect an AI agent with MCP.

Webhooks. Not a replacement for the above but a companion. The API pushes an HTTP POST to one URL on your account when a location, listing, review, or post changes, so you stop polling for changes. Read Webhooks overview.

2. Understand the auth model

Every surface authenticates with an API key. The header is the literal word API, a space, then the key. Keys carry an access level: a Read key covers every lookup and report, and a Write key is needed to create or update anything. A Read key on a write endpoint returns HTTP 400 with SY90016. Keys are per account, so every key shares one rate-limit budget.

OAuth exists for the MCP server only. An MCP client can sign in through the browser instead of pasting a key; REST and the SDKs always use the header. Details are in Authentication.

3. Know the two pagination styles

REST list endpoints paginate in one of two ways, and the SDKs hide the difference. Cursor connections take first and after, and return edges[].node with pageInfo.endCursor. Offset pages take page and perPage, and return records[] with pageInfo.totalRecords.

StyleParamsPayloadUsed by
Cursorfirst, afteredges[].node, pageInfo.endCursor, pageInfo.hasNextPageLocations, location search, reviews
Offsetpage, perPagerecords[], pageInfo.totalRecords, pageInfo.totalPagesConnected accounts, suggestions, posts, duplicate rollup
NonePlain arrayCountries, subcategories, plan sites, a location's photos

Here is the same list-locations call on the three code surfaces. Only the cURL version has to read the envelope by hand.

List locations
curl "https://listingsapi.com/api/v4/locations?first=5" \-H "Authorization: API $LISTINGSAPI_KEY" # Read data.allLocations.edges[].node, then pass# data.allLocations.pageInfo.endCursor back as ?after= for the next page.

Whatever the surface, a failure comes back as an errors[] array whose message starts with an SY code, and mutations can answer 200 with success: false. Rate limits answer 429 with Retry-After; the Launch plan allows 10 requests a minute. See Error codes and Rate limits.

4. Decide between webhooks and polling

Poll when you need a snapshot on your own schedule, such as a nightly sync of every location, or when an event has no webhook. Use webhooks when latency matters: a new review, a listing going live, a post rejected by Google.

Webhooks are one URL per account, set in the dashboard at /dashboard/webhooks. Every delivery carries an X-ListingsAPI-Signature: sha256=<base64 HMAC> header, you have 5 seconds to answer 2xx, and there are no retries. That last point matters: treat the event as a trigger to read the record back, and keep a timed reconciliation poll as a safety net. React to events with webhooks walks through a receiver.

5. Compare at a glance

SurfaceBest forAuthPagination handled?Read more
RESTAny language, full surface, custom HTTP stacksAPI key headerNo, you follow cursors or pagesGetting started
Python SDKBackend jobs, data pipelines, scriptsAPI key from LISTINGSAPI_KEYYes, SyncPage and auto_paging_iter()Python SDK
Node SDKTypeScript services, serverless, dashboardsAPI key from LISTINGSAPI_KEYYes, fetchAll: trueNode SDK
MCPClaude, Cursor, and other AI assistantsAPI key or OAuthYes, tools return complete results/dashboard/mcp
WebhooksReacting to changes within secondsHMAC signature on each deliveryNot applicable, one event per deliveryWebhooks overview

Next steps