尋找地點,並封存您不再管理的地點

依關鍵字搜尋、批次查找門市代碼與 id 對應的地點、排程在計費週期結束時封存已歇業的分店,以及取消已排程的封存。

三個讀取端點可依不同的索引鍵尋找地點:自由文字搜尋、門市代碼查詢及 id 查詢。封存是一項排程寫入作業:地點會維持運作,直到目前的計費週期結束,之後便停止同步及計費。在此之前,您都可以取消封存。

1. 依關鍵字搜尋

GET /locations/search?query= 會將搜尋詞與名稱、街道地址、城市及商店 id 進行比對,並傳回游標連線:包含 pageInfo.endCursor 的 edges[].node,使用 first 和 after 進行分頁。省略 query 即可分頁瀏覽整個帳戶的地點。

Search
curl "https://listingsapi.com/api/v4/locations/search?query=Acme&first=10" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "searchLocations": {      "edges": [        {          "cursor": "TG9jYXRpb246MTgwMDI4OQ==",          "node": {            "id": "TG9jYXRpb246MTgwMDI4OQ==",            "databaseId": 1800289,            "name": "Acme Kitchen",            "storeId": "ACME-NYC-001",            "approved": "APPROVED",            "archived": false,            "archivalScheduledAt": null          }        }      ],      "pageInfo": { "endCursor": "TG9jYXRpb246MTgwMDI4OQ==", "hasNextPage": false, "total": 1 }    }  }}

edges 陣列為空表示沒有符合項目;當您不確定商店是否已存在時,應在建立前執行這項檢查。兩個 SDK 都接受 fields,將比對範圍限制為僅 name 或 store_id。

2. 依門市代碼查詢

如果您的系統使用自訂門市代碼作為地點的索引鍵,可使用 GET /locations-by-store-codes 直接查找對應的地點。storeCodes 參數是經過 URL 編碼的 JSON 陣列。沒有符合項目的代碼不會出現在結果中。

By store code
curl -G https://listingsapi.com/api/v4/locations-by-store-codes \--data-urlencode 'storeCodes=["ACME-NYC-001","ACME-NYC-002"]' \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getLocationsByStoreCodes": [      {        "id": "TG9jYXRpb246MTgwMDI4OQ==",        "databaseId": 1800289,        "storeId": "ACME-NYC-001",        "name": "Acme Kitchen",        "archived": false      }    ]  }}

3. 批次取得 id 對應的完整記錄

當您已持有來自自身資料庫或 webhook 承載資料的 base64 id 時,GET /locations-by-ids 可透過一次呼叫傳回所有這些 id 的完整記錄。已封存的地點也能查得,因此請讀取 archived 和 archivedAt 加以區分。未知的 id 會直接略過且不另行通知;請比對數量。

By ids
curl -G https://listingsapi.com/api/v4/locations-by-ids \--data-urlencode 'ids=["TG9jYXRpb246MTgwMDI4OQ==","TG9jYXRpb246MTgwMDI5MA=="]' \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getLocationsByIds": [      { "id": "TG9jYXRpb246MTgwMDI4OQ==", "databaseId": 1800289, "name": "Acme Kitchen", "archived": false, "archivedAt": null },      { "id": "TG9jYXRpb246MTgwMDI5MA==", "databaseId": 1800290, "name": "Acme Kitchen Brooklyn", "archived": false, "archivedAt": null }    ]  }}

若要在伺服器端篩選整個帳戶中的部分地點,例如依核准狀態篩選,GET /locations 也接受經過 JSON 編碼的 filter 參數。請參閱列出所有地點。

4. 封存您不再管理的地點

POST /locations/archive 接受 input.locationIds,並為每個地點傳回一筆 result 項目。封存會排程執行,並非立即生效:每個地點會進入 ARCHIVE_SCHEDULED,持續同步直到目前的計費週期結束,並在產生下一張帳單時封存。自此,地點便停止同步至發布平台,也停止計費。

Archive
curl -X POST https://listingsapi.com/api/v4/locations/archive \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationIds": ["TG9jYXRpb246MTgwMDI4OQ==", "TG9jYXRpb246MTgwMDI5MA=="]  }}'
JSON
{  "data": {    "archiveLocations": {      "errors": null,      "result": [        { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "status": "ARCHIVE_SCHEDULED", "success": true, "errors": null },        { "locationId": "TG9jYXRpb246MTgwMDI5MA==", "status": "ARCHIVE_SCHEDULED", "success": true, "errors": null }      ]    }  }}
result[].status意義
ARCHIVE_SCHEDULED已排入佇列。地點會持續運作並計費,直到計費週期結束。
ARCHIVED已在先前的呼叫或週期中封存。

請讀取每筆項目的 success:單一無效的 id 不會阻擋批次中的其他項目。封存已排程時,清單與搜尋結果中的地點會設定 archivalScheduledAt 欄位。已封存的地點必須重新啟用後才能更新。如果已設定 webhook,便會觸發 profile.deleted 事件;這是軟刪除,且不提供硬刪除。

5. 取消已排程的封存

在週期結束前,使用相同的 id 呼叫 POST /locations/cancel_archive,即可將這些地點恢復為 ACTIVE,並持續計費。一旦地點已完成封存,此呼叫便會為該地點傳回 404。取消封存不會發出 webhook 事件。

Cancel archive
curl -X POST https://listingsapi.com/api/v4/locations/cancel_archive \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationIds": ["TG9jYXRpb246MTgwMDI4OQ=="] } }'
JSON
{  "data": {    "cancelLocationsArchive": {      "errors": null,      "result": [        { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "status": "ACTIVE", "success": true, "errors": null }      ]    }  }}

兩個 SDK 都需要兩個額外的位置引數,分別是選取類型與 changedBy 識別碼,並會將這些引數與 locationIds 一併傳送。REST 請求主體只需要 id。

後續步驟