POST/api/v4/connected-accounts/confirm-matches

Confirm connection matches

Confirms suggested location-to-listing matches returned by the connection suggestions endpoint.

Requires an API key. See Authentication for header format and key rotation.

Parameters

Body

NameTypeRequiredDescription
inputobjectrequiredWrapper object. The entire request body must be nested under `input`.
input.matchRecordIdsarray of stringsrequiredMatch-record global IDs to confirm: the standard base64 of `<MatchRecordType>:<matchedDataDatabaseId>`, built from a connection-suggestion record. At least one ID is required.

Sample request

Ready-to-paste body. Replace placeholder IDs and values with yours.

Request body
{  "input": {    "matchRecordIds": [      "R21iTG9jYXRpb25NYXRjaGVkRGF0YTowZDVlMzA2Zi0wZGEwLTQ2ZTMtOTI5Zi1mZDNjNjdjY2Q4Y2M="    ]  }}

Responses

200Request accepted. `success` is `true` when every match was confirmed; when some IDs could not be confirmed they are listed in `failedIds` and `success` is `false`.
Response
{  "data": {    "confirmConnectMatches": {      "failedIds": null,      "success": true    }  }}
400Bad request, the body was not wrapped in `input`, `matchRecordIds` was omitted (error message: `Field value.matchRecordIds of required type [ID!]! was not provided`), or `input` carried a field the endpoint does not accept.
401Unauthenticated, missing or invalid API key.

Accepts suggested location-to-listing pairings and confirms them, establishing the live connection between Listings API locations and their corresponding Google Business Profile or Facebook listings. Once confirmed, the listing begins syncing with the matched Listings API location.

Request shape. The body must be wrapped in an input object, and the only field it accepts is matchRecordIds, an array of match-record IDs ([ID!]!, required). Sending a flat (unwrapped) body is rejected with an HTTP 400, and so is an unknown field inside input, such as connectedAccountId or the older matchIds (Unknown field "connectedAccountId"). A stray key outside input is ignored rather than rejected. There is no connectedAccountId field on this request; the account is inferred from the match records themselves.

Building a matchRecordIds value. A connection-suggestion record has no id. Take its matchedDataDatabaseId and its accountType, join them with a colon behind the match-record type name, and base64-encode the result:

accountTypeMatch-record type
GMBGmbLocationMatchedData
FBFbLocationMatchedData
APPLEAppleLocationMatchedData
Python
import base64 TYPES = {    "GMB": "GmbLocationMatchedData",    "FB": "FbLocationMatchedData",    "APPLE": "AppleLocationMatchedData",} def match_record_id(record):    raw = f"{TYPES[record['accountType']]}:{record['matchedDataDatabaseId']}"    return base64.b64encode(raw.encode()).decode()

An ID that does not decode to one of those three types does not produce a 400. The call returns HTTP 200 with success: false and no failedIds, so check success on every call.

This endpoint is the final step of the bulk-connect workflow: connect the account, run POST /connected-accounts/trigger-matches to generate suggestions, review them with the connection-suggestions endpoint, then confirm the approved records here.

Use case: bulk-accepting reviewed matches. After an agency imports a client's Google account and reviews the suggested pairings in your own UI, submit the approved matchRecordIds in one call instead of one call per match. Send only the IDs the operator approved so unreviewed or wrong suggestions are left untouched.

Confirming a match does not immediately push data to Google or Facebook; it links the Listings API location to the publisher listing so subsequent listing updates flow through. A successful call returns success: true with failedIds: null. When one or more IDs could not be confirmed (for example, an unknown or already-consumed match record, or a match whose location has since been archived), those IDs are returned in failedIds and success is false, so you can retry or show only the failures. failedIds carries the decoded database ids, not the encoded values you sent, so match them back against matchedDataDatabaseId. For manually picking a single listing without going through suggestions, use the connect-listing endpoint instead.

Request
curl -X POST 'https://listingsapi.com/api/v4/connected-accounts/confirm-matches' \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H 'Content-Type: application/json' \  -d '{    "input": {      "matchRecordIds": [        "R21iTG9jYXRpb25NYXRjaGVkRGF0YTowZDVlMzA2Zi0wZGEwLTQ2ZTMtOTI5Zi1mZDNjNjdjY2Q4Y2M="      ]    }  }'