/api/v4/posts/{postId}Get a post
Returns a single social post campaign with its content, per-site publish status, and engagement analytics.
Parameters
Path
| Name | Type | Required | Description |
|---|---|---|---|
| postId | string | required | Base64-encoded social post ID (e.g. from the `id` field of a posts list, or the `socialPost.id` returned by POST /posts). |
Responses
200The post's content, publish details, and analytics.
{
"data": {
"socialPostView": {
"socialPostId": "U29jaWFsUG9zdDo0NDEyMg==",
"socialPostInfo": {
"id": "U29jaWFsUG9zdDo0NDEyMg==",
"name": "Summer Hours Update",
"status": "SUCCESS",
"type": "ANNOUNCEMENT",
"createdAt": "2026-06-28",
"scheduledStartDate": "2026-06-28",
"scheduledEndDate": "2026-07-28",
"views": 128,
"clicks": 14,
"shares": 0,
"reactions": 3,
"comments": 1,
"sites": ["GOOGLE"],
"message": [
{ "site": "GOOGLE", "message": "We have extended our summer hours! Open until 9pm on weekdays." }
],
"cta": [
{ "type": { "value": "LEARN_MORE", "label": "Learn more" }, "url": "https://jennyhome.example/hours", "site": "GOOGLE", "tinyUrl": "https://tiny.cc/jh-hours" }
],
"contextInfo": null,
"mediaUrl": [
{ "url": "https://cdn.listingsapi.com/posts/44122/summer.jpg", "site": "GOOGLE", "type": "IMAGE" }
],
"publishDetails": [
{ "site": "GOOGLE", "status": "PUBLISHED", "createdDate": "2026-06-28", "publishedDate": "2026-06-28", "submissionError": null }
],
"postLinks": [
{ "site": "GOOGLE", "link": "https://www.google.com/maps/place/?post=44122" }
],
"locationIds": [1800289]
},
"publishedLocationsCount": 1,
"socialPostAnalyticsBySite": [
{ "site": "GOOGLE", "views": 128, "clicks": 14, "reactions": 3, "shares": 0, "comments": 1 }
],
"socialPostAnalyticsByLocationId": [
{
"locationId": 1800289,
"siteStats": [
{ "site": "GOOGLE", "status": "PUBLISHED", "views": 128, "clicks": 14, "reactions": 3, "shares": 0, "comments": 1 }
]
}
]
}
}
}401Unauthenticated — missing or invalid API key.
Fetches one post campaign by its ID, including the message and CTA per site, the media attached, the live publish status on each site (publishDetails), and engagement broken down both by site (socialPostAnalyticsBySite) and by location (socialPostAnalyticsByLocationId).
Use case — post-publish verification. Right after creating an announcement with POST /posts, take the returned socialPost.id and poll GET /posts/{postId} until socialPostInfo.status flips from INPROGRESS to SUCCESS. If a site fails, publishDetails[].submissionError carries the reason and publishDetails[].status shows ERROR.
Use case — engagement dashboard. For a single-location post, read socialPostAnalyticsBySite to render a Google-vs-Facebook comparison of views and clicks without re-listing the whole location.
Notes.
postIdis the Base64-encoded ID surfaced asidin the posts list or associalPost.idin the create response — not a raw integer.- To fetch a multi-location (bulk) campaign, use
GET /bulk-posts/{postId}, which returns the same shape withpublishedLocationsCount > 1.
This example is built from the API schema. The live seed account (Jenny Home) has no posts, so there was no real post 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/posts/<postId>' \
-H "Authorization: API $LISTINGSAPI_KEY"