Akun terhubung

Semua endpoint akun terhubung: contoh cURL, Python, Node; koneksi Google/Facebook, daftar akun, cocokkan/tautkan profil bisnis, folder, buat GMB, putuskan.

Akun terhubung adalah pemberian izin OAuth dari pemilik Google Business Profile atau Facebook Pages yang memungkinkan API membaca dan mengelola profil bisnis yang dapat diakses akun tersebut. Resource ini mencakup tiga tugas: membuat tautan OAuth, mencocokkan atau menautkan profil bisnis akun ke lokasi Anda, dan memutuskan koneksi tersebut. Kedua operasi baca GET untuk daftar dan detail dapat menggunakan kunci Read (baca); setiap operasi POST, termasuk pengambilan profil bisnis yang hanya membaca data, memerlukan kunci Write (tulis), dan penggunaan kunci Read untuk operasi tulis menghasilkan HTTP 400 dengan SY90016.

Setiap contoh di bawah mengasumsikan bahwa klien dibuat satu kali, seperti yang ditunjukkan pada contoh pertama, dan membaca LISTINGSAPI_KEY dari lingkungan. ID yang digunakan adalah UUID connectedAccountId dari endpoint daftar dan ID lokasi dalam base64 (TG9jYXRpb246MTgwMDI4OQ==); jangan pernah menerapkan pengodean URL pada keduanya.

Ringkasan endpoint

MetodeJalurFungsiReferensi
POST/connected-accounts/connect-googleMembuat tautan koneksi massal untuk akun Google yang berlaku selama 24 jam.Hubungkan akun Google
POST/connected-accounts/connect-facebookMembuat tautan koneksi massal untuk akun Facebook yang berlaku selama 24 jam.Hubungkan akun Facebook
POST/locations/oauth_connect_urlMembuat tautan koneksi sekali pakai yang terikat pada satu lokasi.URL koneksi OAuth untuk satu lokasi
GET/connected-accountsMenampilkan daftar akun terhubung beserta kondisi koneksi dan jumlah profil bisnis yang ditautkan.Tampilkan daftar akun terhubung
GET/connected-accounts/{connectedAccountId}/detailsMembaca satu akun, termasuk status tugas pencocokan.Dapatkan detail akun terhubung
POST/connected-accounts/connected-account-listingsMenampilkan daftar profil bisnis di platform publikasi yang dapat diakses oleh suatu akun.Ambil profil bisnis dari akun terhubung
POST/connected-accounts/trigger-matchesMemasukkan tugas pengambilan dan pencocokan untuk satu atau beberapa akun ke antrean.Jalankan pencocokan lokasi
GET/connected-accounts/{connectedAccountId}/connection-suggestionsMembaca pasangan lokasi dan profil bisnis yang disarankan.Tampilkan daftar saran koneksi
POST/connected-accounts/confirm-matchesMenerima saran dan membuat tautan aktif.Konfirmasikan hasil pencocokan koneksi
POST/connected-accounts/connect-listingMenautkan satu profil bisnis yang dipilih ke satu lokasi.Hubungkan profil bisnis ke lokasi
POST/connected-accounts/disconnect-listingMemutuskan tautan satu lokasi dari satu platform publikasi.Putuskan koneksi profil bisnis dari lokasi
POST/connected-accounts/create-location-from-listingMembuat lokasi baru dari profil bisnis di platform publikasi.Buat lokasi dari profil bisnis
GET/connected-accounts/{connectedAccountId}/foldersMenampilkan daftar grup akun Google (folder).Tampilkan daftar folder GMB
POST/locations/create/gmb-listingMembuat Google Business Profile yang sepenuhnya baru untuk suatu lokasi.Buat profil bisnis GMB
POST/connected-accounts/disconnect-googleMemutuskan koneksi seluruh akun Google.Putuskan koneksi akun Google
POST/connected-accounts/disconnect-facebookMemutuskan koneksi seluruh akun Facebook.Putuskan koneksi akun Facebook
POST/locations/oauth-disconnectMemutuskan koneksi satu lokasi dari platform publikasi (operasi yang sama dengan disconnect-listing).Putuskan koneksi satu lokasi dari platform publikasi

POST /connected-accounts/connect-google

Mengembalikan URL OAuth dengan masa berlaku singkat. Arahkan pemilik akun ke URL tersebut; Google akan mengarahkan mereka kembali ke successUrl atau errorUrl Anda. Tautan ini dibatasi pada akun pemilik kunci API, sehingga body hanya memuat dua URL pengalihan Anda. Menerbitkan ulang tautan untuk akun yang izinnya telah kedaluwarsa akan memperbarui koneksi yang ada tanpa membuat duplikat.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus; seluruh isi body berada di dalamnya.
input.successUrlbodyyaURL https absolut yang Anda kendalikan. Menjadi tujuan pengalihan setelah persetujuan diberikan.
input.errorUrlbodyyaURL https absolut yang Anda kendalikan. Menjadi tujuan pengalihan jika terjadi pembatalan atau kegagalan.
Connect Google
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connect-google \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "successUrl": "https://app.example.com/connect/google/success",    "errorUrl": "https://app.example.com/connect/google/error"  }}'
JSON
{  "data": {    "bulkConnectLinkForGoogle": {      "success": true,      "url": "https://connect.example.com/oauth?token=8f3c1d92-...",      "errors": null    }  }}

url di atas adalah nilai contoh. Arahkan pemilik akun ke url yang dikembalikan dalam respons Anda sendiri.

Tautan berlaku selama 24 jam. errors hanya diisi jika pembuatan gagal, jadi pastikan url tidak bernilai null. Body tanpa struktur bertingkat, atau body yang memuat accountId, ditolak dengan HTTP 400.

POST /connected-accounts/connect-facebook

Operasi yang setara untuk Facebook, dengan body yang sama. Selama proses ini, pemilik akun menerima ketentuan Facebook dan memberikan izin pengelolaan halaman yang diperlukan API; jika mereka melewatkan suatu izin, koneksi tidak dapat melakukan sinkronisasi, jadi terbitkan ulang tautan dan minta mereka memberikan persetujuan kembali.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.successUrlbodyyaURL https absolut yang Anda kendalikan.
input.errorUrlbodyyaURL https absolut yang Anda kendalikan.
Connect Facebook
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connect-facebook \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "successUrl": "https://app.example.com/connect/facebook/success",    "errorUrl": "https://app.example.com/connect/facebook/error"  }}'
JSON
{  "data": {    "bulkConnectLinkForFacebook": {      "success": true,      "url": "https://connect.example.com/oauth?token=8f3c1d92-...",      "errors": null    }  }}

url di atas adalah nilai contoh. Arahkan pemilik akun ke url yang dikembalikan dalam respons Anda sendiri.

Kunci responsnya adalah bulkConnectLinkForFacebook; selebihnya, baca respons dengan cara yang persis sama seperti untuk tautan Google. Setelah pemilik akun menyelesaikan prosesnya, akun muncul di endpoint daftar sebagai FacebookAccount.

POST /locations/oauth_connect_url

Gunakan ini jika Anda sudah mengetahui lokasi yang akan dihubungkan oleh pemilik. Tautan terikat pada lokasi yang Anda tentukan, sehingga tidak ada langkah pencocokan setelahnya: saat pemilik memberikan persetujuan, kredensial langsung dikaitkan dengan lokasi tersebut. Kedua tautan massal di atas menghubungkan seluruh akun.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.locationIdbodyyaID lokasi dalam Base64, atau ID numerik tanpa pengodean.
input.sitebodyyaGOOGLE, FACEBOOK, atau APPLE.
input.successUrlbodyyaURL absolut yang dituju setelah izin diberikan.
input.errorUrlbodyyaURL absolut yang dituju saat terjadi pembatalan atau kegagalan.
Single-location link
curl -X POST https://listingsapi.com/api/v4/locations/oauth_connect_url \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "site": "GOOGLE",    "successUrl": "https://app.example.com/locations/1800289/connected",    "errorUrl": "https://app.example.com/locations/1800289/connect-failed"  }}'
JSON
{  "data": {    "createConnectUrl": {      "success": true,      "url": "https://connect.example.com/oauth?token=8f3c1d92-...",      "errors": null    }  }}

url di atas adalah nilai pengganti. Arahkan pemilik ke url yang dikembalikan dalam respons Anda sendiri.

Tautan hanya dapat digunakan sekali, jadi buat tautan baru untuk setiap percobaan alih-alih menyimpannya dalam cache. URL pengalihan yang relatif atau tidak dapat diurai menghasilkan respons success: true dengan null url, jadi periksa url, bukan hanya success. Kunci yang tidak diizinkan mengakses lokasi ini mendapatkan respons 403 dengan SY90003. SDK otomatis mengubah site menjadi huruf kapital.

Tampilkan daftar akun yang terhubung

GET /connected-accounts

Mengembalikan semua akun yang telah diotorisasi pada akun API Anda, beserta kondisi koneksi dan jumlah lokasi yang terhubung ke setiap akun. Hasilnya berupa halaman berbasis offset: records[] ditambah pageInfo.totalRecords, dengan paginasi menggunakan parameter query page dan perPage yang tidak bersarang. Urutan ditetapkan berdasarkan email akun secara menaik.

NamaLetakWajibCatatan
pagequerytidakNomor halaman dimulai dari 1. Nilai default 1.
perPagequerytidakJumlah rekaman per halaman. Nilai default 20.
publisherquerytidakGoogleAccount, FacebookAccount, AppleAccount, YelpAccount, TripadvisorAccount, LinkedinAccount, PinterestAccount, atau TwitterAccount.
statusquerytidakConnected, NotConnected, atau ConnectionIssue. Menggunakan kombinasi huruf kapital dan huruf kecil.
List accounts
curl "https://listingsapi.com/api/v4/connected-accounts?publisher=GoogleAccount&status=Connected&page=1&perPage=20" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "connectedAccountsInfo": {      "pageInfo": { "hasNextPage": false, "hasPreviousPage": false, "totalPages": 1, "totalRecords": 1 },      "records": [        {          "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",          "connectedAccountType": "GoogleAccount",          "email": "owner@brightsmile-dental.com",          "status": "CONNECTED",          "connectivityIssue": null,          "connectedLocationsCount": 0,          "requestMatchesStatus": "MATCH_COMPLETED",          "lastFetchMatchesRequestedAt": "2026-07-06 21:43:07 UTC"        }      ]    }  }}

Pilih rekaman yang nilai email-nya merujuk pada pemilik yang memberikan persetujuan, lalu simpan connectedAccountId-nya; setiap pemanggilan berikutnya menggunakan nilai tersebut. Apa pun selain keempat parameter query tersebut diabaikan, bukan ditolak, sehingga pageInfo dalam JSON mengembalikan halaman 1 tanpa pemberitahuan.

status pada rekamanArti
CONNECTEDKredensial valid. Aman untuk memicu pencocokan atau melakukan publikasi.
MATCH_IN_PROGRESSProses pencocokan sedang dalam antrean atau sedang berjalan.
CONNECTIVITY_ISSUEIzin telah kedaluwarsa. connectivityIssue menjelaskan alasannya; terbitkan ulang tautan koneksi.

Filter status dan field status pada rekaman menggunakan kumpulan nilai yang berbeda. Menggunakan kembali CONNECTED sebagai filter merupakan nilai enum yang tidak valid dan menghasilkan respons 400.

Dapatkan detail satu akun

GET /connected-accounts/{connectedAccountId}/details

Mengembalikan field yang sama dengan satu rekaman dalam daftar, dengan cakupan satu akun. Gunakan ini untuk memeriksa requestMatchesStatus secara berkala setelah memicu pencocokan, atau untuk memeriksa status dan connectivityIssue sebelum mengirim pembaruan melalui akun tersebut.

NamaLetakWajibCatatan
connectedAccountIdpathyaUUID dari endpoint daftar.
Account details
curl https://listingsapi.com/api/v4/connected-accounts/4f712c17-4f95-42dd-90f4-97171a2e67b5/details \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "connectedAccountDetails": {      "details": {        "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",        "connectedAccountType": "GoogleAccount",        "status": "CONNECTED",        "connectivityIssue": null,        "connectedLocationsCount": 0,        "requestMatchesStatus": "MATCH_COMPLETED"      }    }  }}

Rekaman berada satu tingkat di bawah pada data.connectedAccountDetails.details. requestMatchesStatus berubah dari MATCH_IN_PROGRESS menjadi MATCH_COMPLETED saat saran sudah siap. Selesai berarti proses pencocokan telah berakhir, bukan berarti ada yang sudah ditautkan: connectedLocationsCount tetap bernilai 0 sampai Anda mengonfirmasi atau menghubungkan profil bisnis.

Ambil profil bisnis yang dapat diakses oleh suatu akun

POST /connected-accounts/connected-account-listings

Menampilkan semua profil bisnis Google Business Profile atau Facebook yang dapat diakses oleh akun tersebut, baik yang sudah maupun yang belum ditautkan ke salah satu lokasi Anda. id pada setiap rekaman adalah connectedAccountListingId yang digunakan oleh connect-listing dan create-location-from-listing. Ini adalah POST yang hanya membaca data, dan mengembalikan halaman berbasis offset: records[] ditambah pageInfo, dengan paginasi menggunakan kunci page dan perPage yang tidak bersarang dalam body.

NamaLetakWajibCatatan
connectedAccountIdbodyyaUUID akun yang profil bisnisnya akan diambil. Tidak dibungkus dalam input.
pagebodytidakNomor halaman. Nilai default 1.
perPagebodytidakJumlah rekaman per halaman. Nilai default 500, yang juga merupakan nilai maksimum.
locationInfobodytidakPencarian teks bebas pada nama, alamat, lokalitas, kode pos, kode toko, dan nomor telepon.
Account listings
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connected-account-listings \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5", "perPage": 50, "locationInfo": "William St" }'
JSON
{  "data": {    "connectedAccountListings": {      "pageInfo": { "hasNextPage": false, "totalPages": 1, "totalRecords": 60 },      "records": [        {          "id": "R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA==",          "accountTypeName": "Google",          "locationName": "Trial",          "address": "123 William St, NY 10038, Manhattan, US",          "phone": "(718) 667-7787",          "liveLink": null        }      ]    }  }}

Telusuri seluruh hasil per halaman menggunakan pageInfo.hasNextPage dan pageInfo.totalPages. SDK otomatis menempatkan connectedAccountId dalam body, sehingga hal ini hanya memengaruhi pemanggilan REST yang ditulis secara manual.

Picu pencocokan

POST /connected-accounts/trigger-matches

Memasukkan tugas ke antrean untuk mengambil setiap profil yang dapat diakses oleh akun-akun yang ditentukan dan memasangkan masing-masing profil dengan salah satu lokasi Anda. Pencocokan mempertimbangkan setiap lokasi aktif yang tidak diarsipkan dan belum terhubung. Proses ini hanya menyimpan saran; tidak ada yang dihubungkan sampai Anda mengonfirmasi.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.connectedAccountIdsbodyyaArray UUID akun dari endpoint daftar.
Trigger matches
curl -X POST https://listingsapi.com/api/v4/connected-accounts/trigger-matches \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "connectedAccountIds": ["4f712c17-4f95-42dd-90f4-97171a2e67b5"] } }'
JSON
{  "data": {    "connectedAccountsTriggerMatches": {      "success": true,      "failedIds": null    }  }}

success: true berarti tugas telah dimasukkan ke antrean, bukan berarti pencocokan telah selesai. Akun yang tidak dapat dimasukkan ke antrean tercantum dalam failedIds dan success bernilai false. Lakukan polling pada endpoint detail hingga requestMatchesStatus bernilai MATCH_COMPLETED sebelum membaca saran; polling setiap 15 detik dengan perulangan terbatas menjaga penggunaan paket Launch dalam batas 10 permintaan per menit.

Baca saran koneksi

GET /connected-accounts/{connectedAccountId}/connection-suggestions

Mengembalikan pasangan yang diusulkan oleh proses pencocokan: lokasi Anda di satu sisi (locationInfo, dengan locationId sebagai databaseId) dan profil bisnis di platform publikasi di sisi lain (suggestedLocationInfo). Hasil ini menggunakan paginasi berbasis offset dengan parameter query page dan perPage yang tidak bersarang; urutan ditetapkan berdasarkan informasi lokasi secara menaik.

NamaLetakWajibCatatan
connectedAccountIdpathyaUUID akun.
pagequerytidakNomor halaman dimulai dari 1. Nilai default 1.
perPagequerytidakJumlah rekaman per halaman. Nilai default 20.
Suggestions
curl "https://listingsapi.com/api/v4/connected-accounts/4f712c17-4f95-42dd-90f4-97171a2e67b5/connection-suggestions?page=1&perPage=20" \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "connectionSuggestionsForAccount": {      "pageInfo": { "hasNextPage": false, "totalPages": 1, "totalRecords": 2 },      "records": [        {          "accountType": "GMB",          "matchedDataDatabaseId": "0d5e306f-0da0-46e3-929f-fd3c67ccd8cc",          "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",          "locationId": "73415",          "locationInfo": { "name": "My Business", "city": "Lincoln", "stateIso": "NE" },          "suggestedLocationInfo": { "locationInfo": { "name": "My Business", "city": "Lincoln" } }        }      ]    }  }}

Saran tidak memiliki id. Simpan matchedDataDatabaseId dan accountType bersama-sama; confirm-matches memerlukan keduanya untuk membentuk id-nya. Jika Anda membaca terlalu awal, sebelum MATCH_COMPLETED, endpoint mengembalikan records: [] dengan totalRecords: 0, yang terlihat sama persis seperti "tidak ada kecocokan".

accountTypePlatform publikasiTipe rekaman kecocokan
GMBGoogle Business ProfileGmbLocationMatchedData
FBFacebook PagesFbLocationMatchedData
APPLEApple Business ConnectAppleLocationMatchedData

Konfirmasi kecocokan

POST /connected-accounts/confirm-matches

Menerima saran yang Anda setujui dan membuat koneksi aktif. Setiap id merupakan hasil pengodean base64 dari <MatchRecordType>:<matchedDataDatabaseId>, dengan tipe yang dipilih dari tabel di atas. Akun ditentukan dari rekaman, sehingga tidak ada field connectedAccountId; field yang tidak dikenal di dalam input ditolak dengan status 400.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus. Hanya matchRecordIds yang dideklarasikan.
input.matchRecordIdsbodyyaArray id rekaman kecocokan dalam base64. Minimal satu.
Confirm matches
# base64 of GmbLocationMatchedData:0d5e306f-0da0-46e3-929f-fd3c67ccd8cccurl -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="] } }'
JSON
{  "data": {    "confirmConnectMatches": {      "success": true,      "failedIds": null    }  }}

failedIds berisi nilai matchedDataDatabaseId yang telah didekode dan tidak dapat dikonfirmasi, seperti rekaman yang sudah digunakan atau lokasi yang diarsipkan setelah pencocokan, jadi cocokkan nilai tersebut kembali dengan rekaman saran. Saran yang tidak dikirim dibiarkan tanpa perubahan. Konfirmasi menghubungkan lokasi ke profil bisnis; tindakan ini tidak dengan sendirinya mengirim data ke platform publikasi.

Hubungkan satu profil bisnis ke lokasi

POST /connected-accounts/connect-listing

Menghubungkan satu profil bisnis yang sudah Anda pilih ke satu lokasi, tanpa saran atau langkah konfirmasi. Gunakan ini ketika hasil pencocokan ambigu, misalnya dua toko yang berdekatan dengan nama serupa, dan operator memilih profil yang tepat dari profil bisnis milik akun tersebut.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.locationIdbodyyaid lokasi dalam base64.
input.connectedAccountIdbodyyaUUID akun yang memiliki profil bisnis.
input.connectedAccountListingIdbodyyaid dari rekaman yang diperoleh dari endpoint profil bisnis akun. Bukan listingId.
Connect listing
curl -X POST https://listingsapi.com/api/v4/connected-accounts/connect-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",    "connectedAccountListingId": "R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA=="  }}'
JSON
{  "data": {    "connectListing": {      "success": true,      "message": null    }  }}

Kegagalan menghubungkan mengembalikan success: false dengan message yang bukan null, misalnya Listing record not found ketika id profil bisnis tidak ditemukan, atau catatan bahwa profil bisnis sudah terhubung ke lokasi lain. Di kedua SDK, metode ini berada pada resource listings, bukan pada akun yang terhubung.

Putuskan koneksi satu profil bisnis dari lokasi

POST /connected-accounts/disconnect-listing

Memutus koneksi antara satu lokasi dan satu platform publikasi. Lokasi beserta datanya tetap ada; hanya sinkronisasi keluar ke platform publikasi tersebut yang berhenti. Ini bukan endpoint untuk operasi massal, jadi lakukan perulangan untuk setiap lokasi. Untuk mengalihkan toko ke akun Google lain, putuskan koneksi di sini terlebih dahulu, lalu lakukan pencocokan atau hubungkan melalui akun baru.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.locationIdbodyyaid satu lokasi tersebut dalam base64.
input.sitebodysalah satuGOOGLE, FACEBOOK, atau APPLE. Wajib kecuali providerId dikirim.
input.providerIdbodysalah satuPengenal akun milik platform publikasi itu sendiri, sebagai pengganti site.
Disconnect listing
curl -X POST https://listingsapi.com/api/v4/connected-accounts/disconnect-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "site": "GOOGLE" } }'
JSON
{  "data": {    "disconnectConnectedAccountsLocations": {      "clientMutationId": null,      "success": true,      "errors": null    }  }}

Jika site maupun providerId tidak dikirim, endpoint mengembalikan SY10056. Untuk lokasi yang tidak memiliki koneksi aktif ke situs tersebut, endpoint mengembalikan SY10057 alih-alih melaporkan keberhasilan tanpa indikasi bahwa tidak ada koneksi, sehingga success: true benar-benar berarti koneksi telah dihapus. SDK hanya menerima site dan mengubahnya menjadi huruf kapital.

Membuat lokasi dari profil bisnis

POST /connected-accounts/create-location-from-listing

Pencocokan hanya memasangkan profil bisnis dengan lokasi yang sudah Anda miliki. Untuk profil bisnis yang belum memiliki lokasi, tindakan ini membuat lokasi dari data platform publikasi dan langsung menautkannya ke profil bisnis tersebut. Impor dari Google mencakup nama, alamat, koordinat, telepon, situs web, deskripsi, jam operasional reguler dan khusus, kategori, tanggal pembukaan, kode toko, dan zona waktu, serta metode pembayaran dan tautan media sosial yang diambil dari atribut Google pada profil bisnis. Impor dari Facebook mencakup nama, lokasi, jam operasional, kategori, deskripsi, dan informasi kontak.

Untuk impor dari Google, data tidak dikirim ulang ke Google, sehingga profil bisnisnya tetap berstatus IN_PROGRESS hingga pembaruan lokasi pertama Anda dipublikasikan ke profil bisnis tersebut. Data dikirim ke setiap platform publikasi lainnya seperti biasa, dan endpoint ini tidak menerima cakupan situs, sehingga lokasi dibuat untuk seluruh platform publikasi di akun Anda. Batasi cakupannya dengan enabledSiteIds tepat setelah pembuatan, dan segera kirim pembaruan tersebut: item pesanan untuk platform publikasi lainnya dibuat tidak lama setelah lokasi dibuat, dan pembaruan tersebut tidak menarik kembali item yang sudah dibuat.

Kedua SDK belum menyediakan metode untuk endpoint ini, sehingga contoh Python dan Node memanggil REST dengan header yang sama.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.connectedAccountIdbodyyaUUID akun yang memiliki profil bisnis.
input.connectedAccountListingIdbodyyaid dari sebuah rekaman yang diperoleh dari endpoint profil bisnis akun. Bukan listingId.
Create from listing
curl -X POST https://listingsapi.com/api/v4/connected-accounts/create-location-from-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",    "connectedAccountListingId": "R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA=="  }}'
JSON
{  "data": {    "createLocationFromConnectedAccountListing": {      "success": true,      "locationId": 88277,      "errors": null    }  }}

locationId adalah databaseId biasa milik lokasi baru. Jika gagal, success bernilai false, locationId bernilai null, dan errors memuat kode alasan seperti SY81067 (id profil bisnis tidak ditemukan); penyebab lainnya adalah profil bisnis yang sudah ditautkan ke lokasi lain, atau akun yang kredensialnya telah kedaluwarsa. Setelah dibuat, kelola lokasi tersebut seperti lokasi lainnya.

Menampilkan daftar folder akun Google

GET /connected-accounts/{connectedAccountId}/folders

Mengembalikan grup akun (folder) Google Business Profile yang dapat diakses oleh akun Google yang terhubung. Gunakan endpoint ini sebelum membuat profil bisnis GMB agar profil baru ditempatkan dalam grup yang diharapkan pemiliknya. Respons berupa array biasa di bawah getFoldersUnderGoogleAccount, bukan halaman. Path ini hanya berlaku untuk koneksi GoogleAccount.

NamaLetakWajibCatatan
connectedAccountIdpathyaUUID akun bertipe Google.
Folders
curl https://listingsapi.com/api/v4/connected-accounts/4f712c17-4f95-42dd-90f4-97171a2e67b5/folders \-H "Authorization: API $LISTINGSAPI_KEY"
JSON
{  "data": {    "getFoldersUnderGoogleAccount": [      { "folderId": "accounts/104890024806530350198", "folderName": "Bright Smile Dental", "locationCount": null }    ]  }}

Gunakan folderId tanpa perubahan; nilainya adalah string accounts/{id}, bukan angka. locationCount dapat bernilai null ketika Google tidak melaporkannya, jadi perlakukan sebagai opsional.

Membuat Google Business Profile untuk lokasi

POST /locations/create/gmb-listing

Membuat profil bisnis Google yang benar-benar baru untuk lokasi yang belum memilikinya, di bawah akun Google yang terhubung, dan secara opsional di dalam folder. Berbeda dengan connect-listing, yang menautkan profil bisnis yang sudah ada. Lokasi harus sudah memiliki nama, alamat, dan telepon, dan setiap lokasi hanya boleh memiliki satu profil bisnis Google.

NamaLetakWajibCatatan
inputbodyyaObjek pembungkus.
input.locationIdbodyyaid lokasi dalam Base64.
input.connectedAccountIdbodyyaUUID akun Google tempat profil bisnis akan dibuat.
input.folderIdbodytidakString accounts/{id} dari endpoint folder. Hilangkan untuk menempatkannya di tingkat akar akun.
Create GMB listing
curl -X POST https://listingsapi.com/api/v4/locations/create/gmb-listing \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{  "input": {    "locationId": "TG9jYXRpb246MTgwMDI4OQ==",    "connectedAccountId": "4f712c17-4f95-42dd-90f4-97171a2e67b5",    "folderId": "accounts/104890024806530350198"  }}'
JSON
{  "data": {    "createGmbListingForLocation": {      "clientMutationId": null,      "success": true,      "errors": null    }  }}

Pembuatan berlangsung secara asinkron: success: true berarti permintaan telah diterima, dan Google meninjau profil baru sebelum dipublikasikan. Ketika success bernilai false, errors menjelaskan alasannya: field wajib belum diisi, profil bisnis Google sudah ada, lokasi telah diarsipkan, atau akun tidak aktif.

Putuskan koneksi seluruh akun Google

POST /connected-accounts/disconnect-google

Memutus koneksi untuk seluruh akun: setiap lokasi yang ditautkan melalui akun tersebut berhenti disinkronkan. Tidak ada field locationIds; untuk memutus koneksi satu lokasi dan mempertahankan akun, gunakan disconnect-listing. Gunakan operasi ini saat klien berhenti menggunakan layanan, atau saat pemberian akses yang bermasalah tidak dapat dihapus dan Anda ingin memulai ulang dengan tautan koneksi baru.

NamaDiWajibCatatan
inputbodyyaObjek pembungkus.
input.connectedAccountIdbodyyaUUID akun Google. Koneksi seluruh akun diputus.
Disconnect Google
curl -X POST https://listingsapi.com/api/v4/connected-accounts/disconnect-google \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "connectedAccountId": "d2397854-52c2-41d7-95f1-b90cba16498d" } }'
JSON
{  "data": {    "gmbBulkDisconnect": {      "success": true    }  }}

success: true dikembalikan bahkan untuk connectedAccountId yang tidak dikenal, sehingga artinya adalah "permintaan telah diproses", bukan "koneksi aktif telah dihapus". Ambil kembali daftar akun yang terhubung jika Anda memerlukan kepastian.

Putuskan koneksi seluruh akun Facebook

POST /connected-accounts/disconnect-facebook

Operasi yang setara untuk Facebook dengan body yang sama. Halaman yang ditautkan melalui akun tersebut berhenti disinkronkan dan interaksi Facebook berhenti muncul.

NamaDiWajibCatatan
inputbodyyaObjek pembungkus.
input.connectedAccountIdbodyyaUUID akun Facebook. Koneksi seluruh akun diputus.
Disconnect Facebook
curl -X POST https://listingsapi.com/api/v4/connected-accounts/disconnect-facebook \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "connectedAccountId": "d2397854-52c2-41d7-95f1-b90cba16498d" } }'
JSON
{  "data": {    "fbBulkDisconnect": {      "success": true    }  }}

Kunci responsnya adalah fbBulkDisconnect. Seperti pada Google, success: true untuk id yang tidak dikenal berarti telah diproses, bukan telah dihapus.

Putuskan koneksi satu lokasi dari platform publikasi

POST /locations/oauth-disconnect

Bagian pemutusan koneksi dari alur OAuth per lokasi. Ini adalah operasi yang sama dengan disconnect-listing yang tersedia melalui jalur kedua: body input identik dan kunci respons disconnectConnectedAccountsLocations sama. Pilih jalur yang lebih mudah dipahami dalam integrasi Anda.

NamaDiWajibCatatan
inputbodyyaObjek pembungkus.
input.locationIdbodyyaid Base64 dari satu lokasi tersebut.
input.sitebodysalah satuGOOGLE, FACEBOOK, atau APPLE. Wajib kecuali providerId dikirim.
input.providerIdbodysalah satuPengenal akun milik platform publikasi itu sendiri, sebagai pengganti site.
OAuth disconnect
curl -X POST https://listingsapi.com/api/v4/locations/oauth-disconnect \-H "Authorization: API $LISTINGSAPI_KEY" \-H "Content-Type: application/json" \-d '{ "input": { "locationId": "TG9jYXRpb246MTgwMDI4OQ==", "site": "GOOGLE" } }'
JSON
{  "data": {    "disconnectConnectedAccountsLocations": {      "clientMutationId": null,      "success": true,      "errors": null    }  }}

Aturan SY10056 dan SY10057 yang sama berlaku, dan kunci yang tidak diizinkan mengakses lokasi ini akan menerima 403 dengan SY90003. Pemutusan koneksi mempertahankan lokasi dan datanya secara utuh; hanya sinkronisasi keluar ke platform publikasi tersebut yang berhenti. Arahkan pemilik kembali melalui URL koneksi, atau jalankan pencocokan dan connect-listing, untuk menautkan profil bisnis yang benar setelahnya.

Kesalahan yang akan Anda temui

Permintaan dengan format yang salah dan kunci yang tidak valid menghasilkan respons 4xx dengan errors[] di tingkat teratas yang nilai message-nya diawali dengan kode tersebut. Operasi tulis juga dapat mengembalikan 200 dengan success: false dan alasannya di dalam data.<operation>, jadi periksa body setiap respons operasi tulis. Daftar lengkapnya tersedia di Kode kesalahan.

Kode atau statusArtiPerbaikan
SY90016 (400)Kunci Read digunakan pada POST.Gunakan kunci Write.
SY90003 (403)Kunci tersebut tidak diizinkan menghubungkan atau memutus koneksi lokasi ini.Gunakan kunci yang memiliki akses ke lokasi tersebut.
SY10056 (200)Permintaan pemutusan koneksi tidak mengirimkan site maupun providerId.Kirim salah satunya.
SY10057 (200)Lokasi tersebut tidak memiliki koneksi aktif untuk situs itu.Tidak ada yang perlu dihapus; periksa profil bisnis lokasi tersebut.
SY81067 (200)connectedAccountListingId tidak dapat ditemukan pada create-from-listing.Ambil kembali daftar profil bisnis akun tersebut dan gunakan id dari salah satu record.
400, Variable "$input" ... was not providedBody tidak dibungkus dalam input, atau ada field wajib yang tidak disertakan.Tempatkan body di dalam input; gunakan connectedAccountListingId, bukan listingId.
400, enum tidak validStatus CONNECTED dari suatu record digunakan kembali sebagai filter status untuk daftar.Gunakan Connected, NotConnected, atau ConnectionIssue untuk memfilter.
429Batas laju permintaan terlampaui.Tunggu sesuai Retry-After; lihat Batas laju permintaan.

Langkah berikutnya