GET/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.

Requires an API key. See Authentication for header format and key rotation.

Parameters

Path

NameTypeRequiredDescription
bulkPostIdstringrequiredBase64-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.

  • bulkPostId is the Base64-encoded id returned by the bulk-create call or the bulk list — not a raw integer.
  • socialPostAnalyticsBySite aggregates across every location in the campaign; socialPostAnalyticsByLocationId breaks 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"