등록 정보

모든 등록 정보 엔드포인트와 각 엔드포인트의 cURL, Python 및 Node 예제: 프리미엄 동기화 상태, 음성 비서, 사업장별 및 계정별 중복 탐지, 중복 등록 정보 노출 중단을 다룹니다.

등록 정보는 하나의 게시 플랫폼 디렉터리에 등록된 한 사업장의 항목입니다. 사업장을 생성하면 요금제에 포함된 게시 플랫폼마다 등록 정보가 대기열에 추가되며, 등록 정보 엔드포인트에서는 각 등록 정보의 진행 상태를 조회하고, 탐지된 중복 항목을 나열하고, 해당 항목을 중복으로 확인하거나 중복이 아닌 것으로 처리합니다. GET 엔드포인트 4개는 Read(읽기) 키로 사용할 수 있으며, POST 엔드포인트 2개에는 Write(쓰기) 키가 필요합니다.

엔드포인트 한눈에 보기

메서드경로기능참조
GET/locations/{locationId}/listings/premium한 사업장의 모든 프리미엄 게시 플랫폼에 대한 동기화 상태를 조회합니다.프리미엄 등록 정보 조회
GET/locations/{locationId}/voice-assistantsGoogle Assistant, Alexa, Siri, Cortana, Bixby의 동기화 상태를 조회합니다.음성 비서 등록 정보 조회
GET/locations/listings/duplicates한 계정 전체에서 탐지된 중복 항목을 페이지 단위로 모아 조회합니다.계정의 모든 중복 등록 정보 조회
GET/locations/{locationId}/listings/duplicates한 사업장의 중복 항목을 사이트별로 묶어 조회합니다.사업장의 중복 등록 정보 조회
POST/locations/listings/mark-as-duplicate노출을 중단할 등록 정보 항목을 중복으로 확인합니다.등록 정보를 중복으로 표시
POST/locations/listings/mark-as-not-duplicate등록 정보 항목을 오탐으로 처리합니다.등록 정보를 중복이 아닌 것으로 표시

프리미엄 등록 정보 상태 조회

GET /locations/{locationId}/listings/premium

사업장의 요금제에 포함된 프리미엄 게시 플랫폼마다 레코드 1개를 data.listingsForLocation 아래에 반환합니다. 페이지가 나뉜 목록이 아닌 일반 배열입니다. 같은 수준의 경로인 /listings/additional은 무료 디렉터리를 동일한 구조로 반환하며, listingType 쿼리 매개변수는 없으므로 해당 매개변수로 전달한 값은 무시됩니다.

매개변수

이름전달 위치필수 여부참고 사항
locationIdpath예Base64 id 또는 숫자형 databaseId입니다.
Premium listings
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "listingsForLocation": [      {        "id": "TGlzdGluZzoxMDQ0Njg3MjM=",        "site": { "databaseId": "1", "name": "Google Maps", "url": "maps.google.com" },        "syncStatus": "REQUIRING_ACTION",        "displayStatus": "Connect your account to sync the listing",        "actionRequired": true,        "listingUrl": null,        "syncIssue": null,        "lastUpdate": "2026-07-06T18:33:28Z"      },      {        "id": "TGlzdGluZzoxMDQ0Njg3Mjc=",        "site": { "databaseId": "387", "name": "BeLocalFocussed", "url": "belocalfocussed.com" },        "syncStatus": "SYNCED",        "displayStatus": "Synced",        "actionRequired": false,        "listingUrl": "https://belocalfocussed.com/jenny-home-26x0ffkd0e",        "syncIssue": null,        "lastUpdate": "2026-07-06T18:33:30Z"      },      {        "id": "TGlzdGluZzoxMDQ0Njg3MDk=",        "site": { "databaseId": "301", "name": "Local Mint", "url": "localmint.com" },        "syncStatus": "FAILED",        "displayStatus": "Partner experiencing issues; awaiting response",        "actionRequired": false,        "listingUrl": null,        "syncIssue": "Publisher requires website URL",        "lastUpdate": "2026-07-06T18:34:03Z"      }    ]  }}

syncStatus에 따라 분기합니다. 사용자에게는 displayStatus를 표시하고, 게시 플랫폼이 제시한 사유는 syncIssue에서 확인하며, 진행이 멈춘 제출 건은 lastUpdate를 사용해 찾습니다. listingUrl은 실제 게시된 행에만 설정됩니다.

syncStatus의미
AVAILABLE동기화할 준비가 되었지만 아직 시작되지 않았습니다.
IN_PROGRESS게시 플랫폼에 제출되었으며 응답을 기다리고 있습니다.
PENDING_APPROVAL게시 플랫폼에서 검토 중입니다.
SYNCED 또는 COMPLETED실제 게시된 상태입니다. listingUrl에 값이 입력되어 있습니다.
REQUIRING_ACTION사용자의 조치가 필요하여 진행이 중단된 상태입니다. actionRequired는 true이며, displayStatus를 확인합니다.
FAILED동기화에 실패했습니다. syncIssue를 확인합니다.
CANNOT_SUBMIT이 게시 플랫폼은 이 사업장을 전혀 등록할 수 없습니다.

Google Maps, Facebook, Waze는 해당 계정이 연결될 때까지 displayStatus: "Connect your account to sync the listing"과 함께 REQUIRING_ACTION 상태를 유지합니다. 새 사업장에서는 정상적인 상태입니다.

음성 비서 상태 조회

GET /locations/{locationId}/voice-assistants

Google Assistant, Amazon Alexa, Apple Siri, Microsoft Cortana, Samsung Bixby 등 각 음성 비서의 레코드 1개를 data.voiceAssistantsForLocation 아래에 반환합니다. 일반 배열이며, 프리미엄 엔드포인트보다 상태의 종류가 적습니다.

매개변수

이름전달 위치필수 여부참고 사항
locationIdpath예Base64 id 또는 숫자형 databaseId입니다.
Voice assistants
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/voice-assistants \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "voiceAssistantsForLocation": [      {        "databaseId": "104468723",        "voiceIdentifier": "GOOGLE_ASSISTANT",        "name": "Google Assistant",        "connectedAccountId": null,        "syncStatus": "REQUIRING_ACTION",        "actionRequired": true,        "syncIssue": null,        "errors": []      },      {        "databaseId": "104468711",        "voiceIdentifier": "SIRI",        "name": "Siri",        "connectedAccountId": null,        "syncStatus": "IN_PROGRESS",        "actionRequired": false,        "syncIssue": null,        "errors": []      }    ]  }}

actionRequired가 true이거나 syncIssue가 설정된 행은 모두 따로 표시합니다. errors에는 게시 플랫폼 측 오류 문자열이 포함되며, 해당하는 경우 connectedAccountId는 동기화에 사용되는 연결된 계정을 가리킵니다. Google Assistant 결과는 Google Business Profile 연결에서 가져오므로, 주의가 필요한 가장 흔한 이유는 Google 연결이 없는 것입니다. Siri 결과는 해당 사업장의 Apple Maps 등록 정보에서 가져옵니다.

syncStatus의미
NOT_SUBMITTED아직 음성 비서에 전송되지 않았습니다.
IN_PROGRESS제출이 진행 중입니다.
REQUIRING_ACTION동기화를 진행하려면 먼저 고객의 입력이 필요합니다.
LIVE게시되었습니다. 음성 비서에는 실제 게시된 항목으로 연결되는 링크가 없습니다.

계정 전체의 중복 항목 집계

GET /locations/listings/duplicates

모든 사업장과 게시 플랫폼에서 감지된 중복 항목 중 키로 조회할 수 있는 모든 항목을 data.duplicateListingsRollup에 반환합니다. 오프셋 기반 페이지 형식으로, page와 perPage를 입력받고 records[]와 함께 pageInfo.totalRecords, pageInfo.totalPages, pageInfo.hasNextPage를 반환합니다. 필터는 JSON이 아니라 개별 쿼리 매개변수로 전달합니다. 아무 값도 지정하지 않으면 status의 기본값은 POTENTIAL이고 tag의 기본값은 all이므로, 매개변수 없이 호출하면 계정의 미처리 중복 항목을 반환합니다.

매개변수

이름전달 위치필수 여부참고 사항
statusquery아니요POTENTIAL(기본값), PROCESSING, FIXED 또는 FAILED입니다. 대소문자를 구분하지 않습니다. 다른 값을 지정하면 400 오류가 발생합니다.
siteIdquery아니요숫자형 사이트 id(premium 엔드포인트의 site.databaseId 또는 plan-sites id)로 하나의 게시 플랫폼으로 범위를 좁힙니다.
tagquery아니요집계 범위를 하나의 태그로 제한합니다. 기본값은 all입니다.
pagequery아니요1부터 시작하는 페이지 번호입니다. 기본값은 1입니다.
perPagequery아니요페이지당 레코드 수입니다.

Python 및 Node 래퍼는 tag와 page만 제공합니다. status 또는 siteId로 필터링하거나 perPage를 설정하려면 중복 등록 정보 처리에 나온 대로 라우트를 직접 호출합니다.

Account rollup
curl "https://listingsapi.com/api/v4/locations/listings/duplicates?status=POTENTIAL&page=1&perPage=50" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "duplicateListingsRollup": {      "pageInfo": {        "hasNextPage": true,        "hasPreviousPage": false,        "totalPages": 34,        "totalRecords": 1673      },      "records": [        {          "id": "3329229",          "name": "Woodbury Train Station",          "nameValid": false,          "duplicateProcessingState": "POTENTIAL",          "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",          "locationId": "73451",          "siteName": "City Squares",          "siteUrl": "citysquares.com"        }      ]    }  }}

집계 결과는 중복 항목이 어디에 있는지 알려 주며, 각 레코드에는 locationId와 siteName이 명시되어 있습니다. duplicateProcessingState는 사업장별 엔드포인트가 status로 보고하는 것과 동일한 수명 주기 상태입니다. hasNextPage가 false가 될 때까지 한 번에 한 페이지씩 조회합니다. 간격 없이 반복 호출하면 금방 429 오류가 발생합니다.

상태의미
POTENTIAL감지되었지만 아직 아무도 조치하지 않았습니다.
PROCESSING중복으로 확인되었으며, 게시 플랫폼에서 노출 중단 처리가 진행 중입니다.
FIXED게시 플랫폼에서 해당 항목을 삭제하거나 병합했습니다.
FAILED노출 중단 처리가 완료되지 않았습니다. liveLink를 확인합니다.

단일 사업장의 중복 항목 조회

GET /locations/{locationId}/listings/duplicates

단일 사업장에서 감지된 모든 중복 항목을 게시 플랫폼 사이트별로 그룹화하여 data.duplicateListingsForLocation에 반환합니다. 단순 배열 형식입니다. 각 그룹은 listings 배열이 있는 사이트(name, url)이며, 각 항목에는 두 표시 엔드포인트가 모두 입력받는 listingItemId가 포함됩니다. 빈 배열은 감지된 항목이 없음을 의미합니다.

매개변수

이름전달 위치필수 여부참고 사항
locationIdpath예Base64 id 또는 숫자형 databaseId입니다.
Duplicates for a location
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI4OQ==/listings/duplicates \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "duplicateListingsForLocation": [      {        "id": "U2l0ZToxNTA=",        "name": "City Squares",        "url": "citysquares.com",        "listings": [          {            "id": "RHVwbGljYXRlOjIzNTk4NDUw",            "listingItemId": "TGlzdGluZ0l0ZW06MjM1OTg0NTA=",            "name": "Woodbury Train Station",            "liveLink": "http://citysquares.com/b/woodbury-train-station-23598450",            "status": "POTENTIAL"          }        ]      }    ]  }}

liveLink를 열어 항목을 검토한 다음 listingItemId를 보관합니다. Node SDK에서는 평탄화된 d.id가 이후 전달할 값입니다. status는 위의 계정 집계와 동일한 4가지 값을 사용합니다.

등록 정보 항목을 중복으로 확인

POST /locations/listings/mark-as-duplicate

게시 플랫폼에서 노출을 중단할 수 있도록 등록 정보 항목을 확인된 중복으로 표시합니다. listingItemId 값을 input에 담아 전송하고, 항목마다 호출하는 대신 한 사업장에서 중복으로 확인된 모든 항목을 한 번의 호출로 일괄 처리합니다. 이 작업은 쓰기 작업이며 Write(쓰기) 키가 필요합니다.

매개변수

이름전달 위치필수 여부참고 사항
input.listingItemIdsbody예중복 항목 엔드포인트에서 가져온 base64 listingItemId 값의 배열입니다.
input.locationIdbody아니요Base64 또는 숫자형 사업장 id입니다. 작업 범위를 하나의 사업장으로 제한합니다.
Mark as duplicate
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="]  }}'
JSON
{  "data": {    "markAsDuplicate": {      "success": true,      "errors": null    }  }}

success: true는 항목이 수락되어 PROCESSING 상태로 이동함을 의미합니다. success: false인 200 응답이나 400 응답에는 각 항목에 code, message, path가 포함된 errors 배열이 함께 반환되며, 일반적인 원인은 알 수 없거나 형식이 잘못된 id입니다. Python SDK는 페이로드를 반환하지만 Node SDK는 대신 ValidationError를 발생시키므로, promise가 정상적으로 이행되면 성공한 것입니다.

등록 정보 항목을 중복이 아닌 것으로 제외

POST /locations/listings/mark-as-not-duplicate

잠재적 중복 항목을 오탐으로 판단하여 제외합니다. 감지는 보수적으로 수행되므로 같은 프랜차이즈의 다른 지점, 별도로 존재하는 유효한 두 번째 프로필 또는 이름이 변경된 사업장도 표시됩니다. 제외된 항목은 두 중복 항목 엔드포인트 모두에 더 이상 나타나지 않습니다. 위 엔드포인트와 동일한 본문을 입력받으며, 잘못 표시된 항목을 되돌릴 때도 사용합니다.

매개변수

이름전달 위치필수 여부참고 사항
input.listingItemIdsbody예제외할 base64 listingItemId 값의 배열입니다.
input.locationIdbody아니요Base64 또는 숫자형 사업장 id입니다. 작업 범위를 하나의 사업장으로 제한합니다.
Mark as not duplicate
curl -X POST https://listingsapi.com/api/v4/locations/listings/mark-as-not-duplicate \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "listingItemIds": ["TGlzdGluZ0l0ZW06MjM1OTg0NTA="]  }}'
JSON
{  "data": {    "markAsNotDuplicate": {      "success": true,      "errors": null    }  }}

응답은 data.markAsNotDuplicate이며, 중복으로 표시하는 호출과 동일한 success 및 errors 필드를 포함합니다. 제외된 항목은 중복이 아닌 것으로 확인되어 기록되며, 다음 감지 실행 시 다시 나타나지 않습니다.

발생할 수 있는 오류

코드 또는 상태의미해결 방법
401API 키가 없거나 유효하지 않습니다.Authorization: API $LISTINGSAPI_KEY를 전송합니다.
계정 집계에서 발생하는 400status는 POTENTIAL, PROCESSING, FIXED, FAILED 중 하나가 아닙니다.4가지 값 중 하나를 사용합니다.
mark 엔드포인트에서 발생하는 400등록 정보 항목의 id를 알 수 없거나 형식이 잘못되었습니다. errors[].code와 message를 읽습니다.duplicates 엔드포인트에서 가져온 listingItemId 값을 전송합니다.
success: false인 200요청은 실행되었지만 입력이 거부되었습니다. 자세한 내용은 data.<op>.errors에 있습니다.모든 쓰기 작업에서 상태뿐 아니라 본문도 확인합니다.
SY90016(HTTP 400)쓰기 작업에 Read 키를 사용했습니다.2개의 mark 엔드포인트에는 Write 키를 사용합니다.
429요청 빈도 제한을 초과했습니다. Launch 요금제는 분당 10개의 요청을 허용합니다.Retry-After를 기다린 후 재개합니다. 요청 빈도 제한을 참조하세요.

모든 코드는 오류 참조 문서에 나열되어 있습니다.

다음 단계