/api/v4/bulk-posts/{bulkPostId}Fetch a bulk post by ID
Returns a single bulk (multi-location) post campaign with its content, per-location publish status, and engagement analytics.
Parameters
Path
| Name | Type | Required | Description |
|---|---|---|---|
| bulkPostId | string | required | Base64-encoded bulk post ID (the `id` returned by POST /bulk-posts or listed by GET /locations/{locationId}/bulk-posts). |
Responses
200The campaign's content, per-location publish details, and analytics.
{
"data": {
"socialPostViewBulk": {
"socialPostId": "U29jaWFsUG9zdDo1MTA4OA==",
"socialPostInfo": {
"id": "U29jaWFsUG9zdDo1MTA4OA==",
"name": "Diwali Offer - All Stores",
"status": "SUCCESS",
"type": "OFFER",
"createdAt": "2026-06-20",
"scheduledStartDate": "2026-06-22",
"scheduledEndDate": "2026-07-06",
"views": 4210,
"clicks": 318,
"shares": 12,
"reactions": 87,
"comments": 4,
"sites": ["GOOGLE", "FACEBOOK"],
"message": [
{ "site": "GOOGLE", "message": "Festive savings across all our stores this week." },
{ "site": "FACEBOOK", "message": "Festive savings across all our stores this week!" }
],
"cta": [
{ "type": { "value": "GET_OFFER", "label": "Get offer" }, "url": "https://jennyhome.example/diwali", "site": "GOOGLE", "tinyUrl": "https://tiny.cc/jh-diwali" }
],
"contextInfo": {
"couponCode": "DIWALI25",
"redeemUrl": "https://jennyhome.example/diwali",
"termsConditions": "Valid in-store only. Cannot be combined with other offers.",
"title": "25% off storewide",
"discount": "25%",
"startDay": "2026-06-22",
"endDay": "2026-07-06"
},
"mediaUrl": [
{ "url": "https://cdn.listingsapi.com/posts/51088/diwali.jpg", "site": "GOOGLE", "type": "IMAGE" }
],
"publishDetails": [
{ "site": "GOOGLE", "status": "PUBLISHED", "createdDate": "2026-06-20", "publishedDate": "2026-06-22", "submissionError": null },
{ "site": "FACEBOOK", "status": "PUBLISHED", "createdDate": "2026-06-20", "publishedDate": "2026-06-22", "submissionError": null }
],
"postLinks": [
{ "site": "GOOGLE", "link": "https://www.google.com/maps/place/?post=51088" }
],
"locationIds": [1800289, 1800290, 1800291]
},
"publishedLocationsCount": 3,
"socialPostAnalyticsBySite": [
{ "site": "GOOGLE", "views": 3120, "clicks": 240, "reactions": 61, "shares": 0, "comments": 0 },
{ "site": "FACEBOOK", "views": 1090, "clicks": 78, "reactions": 26, "shares": 12, "comments": 4 }
],
"socialPostAnalyticsByLocationId": [
{
"locationId": 1800289,
"siteStats": [
{ "site": "GOOGLE", "status": "PUBLISHED", "views": 1040, "clicks": 80, "reactions": 20, "shares": 0, "comments": 0 },
{ "site": "FACEBOOK", "status": "PUBLISHED", "views": 360, "clicks": 26, "reactions": 9, "shares": 4, "comments": 1 }
]
}
]
}
}
}401Unauthenticated — missing or invalid API key.
The bulk counterpart to GET /posts/{postId}. It returns the same SocialPostView shape for a campaign that was published to multiple locations at once, so publishedLocationsCount is greater than 1 and socialPostAnalyticsByLocationId carries a row per store.
Use case — track a chain-wide rollout. After firing POST /bulk-posts for a festive offer across every store, poll GET /bulk-posts/{bulkPostId} until socialPostInfo.status is SUCCESS. Then read socialPostAnalyticsByLocationId to see which stores drove the most clicks, and scan publishDetails (plus each location's siteStats.status) to find any store where a site returned ERROR.
Notes.
bulkPostIdis the Base64-encodedidreturned by the bulk-create call or the bulk list — not a raw integer.socialPostAnalyticsBySiteaggregates across every location in the campaign;socialPostAnalyticsByLocationIdbreaks the same numbers down per store.
This example is built from the API schema. The live seed account (Jenny Home) has no bulk campaigns, so there was no real ID to fetch; an unknown or invalid ID returns {"data":null,"errors":[{"message":"An error occurred processing your request."}]}.
curl -X GET 'https://listingsapi.com/api/v4/bulk-posts/<bulkPostId>' \
-H "Authorization: API $LISTINGSAPI_KEY"