添加地点
使用发布平台所需的字段创建地点,处理验证错误,并确认地点已加入提交队列。
商家信息、评价、帖子和分析数据均以地点 ID 为关联键。POST /api/v4/locations 会创建地点,并为您套餐中的每个发布平台各生成一条商家信息,将其加入队列。
1. 收集必填字段
共有 10 个必填字段。服务区域商家也需要发送完整地址:使用 hideAddress: true 时,ListingsAPI 会存储地址,但不会将其提交给发布平台。发布平台会将省略的可选字段显示为空白,因此请发送您掌握的所有信息。
2. 创建地点
POST /api/v4/locations 通过 JSON 请求体中的 input 对象接收这些字段。Python SDK 方法 locations.add() 以关键字参数的形式接收相同的字段,并在发送请求前验证必填字段。Node SDK 方法 createLocation() 直接接收 camelCase 对象。
curl -X POST https://listingsapi.com/api/v4/locations \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "name": "Acme Kitchen", "storeId": "ACME-NYC-001", "description": "Acme Kitchen is a family-owned neighborhood restaurant in downtown New York serving wood-fired pizza, hand-rolled pasta, and a short seasonal menu built around produce from nearby farms. Open for lunch and dinner seven days a week, with takeout and delivery available.", "street": "123 Jump Street", "city": "New York", "stateIso": "NY", "postalCode": "10013", "countryIso": "US", "phone": "6443859313", "bizUrl": "https://acmekitchen.example.com", "subCategoryId": 1432, "businessHours": [ { "day": "MONDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "TUESDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "WEDNESDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "THURSDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "10:00pm" }] }, { "day": "FRIDAY", "type": "OPEN", "slots": [{ "start": "11:00am", "end": "11:00pm" }] }, { "day": "SATURDAY", "type": "OPEN", "slots": [{ "start": "12:00pm", "end": "11:00pm" }] }, { "day": "SUNDAY", "type": "CLOSED", "slots": [] } ] }}'3. 读取响应
创建成功时会返回 success: true,并在 data.createLocation.location 中返回新地点。请保留这两个标识符:id 是后续每次写入都需要使用的 base64 值,databaseId 则是控制台和 webhook 载荷中显示的数字值。
{ "data": { "createLocation": { "success": true, "errors": null, "location": { "id": "TG9jYXRpb246MTgwMDI5MA==", "databaseId": 1800290, "storeId": "ACME-NYC-001", "name": "Acme Kitchen", "city": "New York", "stateIso": "NY", "countryIso": "US", "status": "PENDING" } } }}地点处于验证和排队阶段时,status 为 PENDING。该状态会自动推进,无需再次调用 API。
4. 处理验证错误
创建操作可能在两个环节失败。格式错误的请求或无效密钥会导致返回 4xx,其中包含顶层 errors 数组。格式正确但包含 API 不接受的字段的请求会导致返回 200,其中包含 success: false,具体问题位于 data.createLocation.errors 中,因此请检查每次写入的响应体,而不仅仅是状态码。
{ "data": { "createLocation": { "success": false, "errors": [ { "code": "SY10005", "message": "SY10005: description must be at least 200 characters", "path": ["input", "description"] } ], "location": null } }}两个 SDK 都会在失败时抛出异常。Python 的 locations.add() 会在本地检查必填字段,并在发送请求前抛出 ValidationError。当 API 拒绝输入时,Node 的 createLocation() 会抛出 ValidationError,因此上面的示例没有检查成功标志。
您最常遇到的错误代码如下:
5. 确认提交已开始
创建地点后,系统会为套餐中的每个发布平台各排队一条商家信息。每条商家信息的初始状态为 AVAILABLE 或 IN_PROGRESS,在发布平台接受后变为 SYNCED,并附带 listingUrl。
curl https://listingsapi.com/api/v4/locations/TG9jYXRpb246MTgwMDI5MA==/listings/premium \-H "Authorization: API $LISTINGSAPI_KEY"配置 webhook 后,无需轮询。记录创建后会触发 profile.created 事件,而每个发布平台的状态发生变化时都会触发 listing.submission 事件。
后续步骤
- 更新地点:更改营业时间、标记暂停营业、添加 Google 类别。
- 上传地点照片:标志、封面和图库图片。
- 连接 Google 并导入地点:关联 Google Business Profile,使 Google 商家信息、评价和帖子开始同步。
- 连接 Apple Business Connect:通过所有者已验证的 Apple Business 账号发布到 Apple Maps;如果所有者没有此类账号,则通过 ListingsAPI 账户发布。
- 查看商家信息状态和上线链接:跟踪您刚刚加入队列的提交。