Endpoints

Posts

Create and manage Google Business Profile posts

Manage local posts on your Google Business Profile.

List Posts

Retrieve all posts for a location.

GET /api/v1/posts?locationId=locations/123
Authorization: Bearer {token}

Query Parameters:

ParameterTypeDescription
locationIdstringRequired. Location resource name
pageSizenumberMax results per page (default: 50)
pageTokenstringPagination token

Response:

{
  "status": "ok",
  "data": {
    "localPosts": [
      {
        "name": "locations/123/localPosts/456",
        "summary": "Check out our new menu!",
        "state": "LIVE",
        "createTime": "2025-01-15T10:00:00Z"
      }
    ],
    "nextPageToken": "..."
  }
}
import { SynoveoClient } from '@synoveo/sdk'

const client = new SynoveoClient({ clientId, clientSecret })

// Get single page
const page = await client.posts.list('locations/123', { pageSize: 50 })

// Iterate all posts
for await (const post of client.posts.listAll('locations/123')) {
  console.log(post.summary)
}

Create Post

Create a new post on the business profile.

POST /api/v1/posts?locationId=locations/123
Authorization: Bearer {token}
Content-Type: application/json

{
  "summary": "Grand opening sale! 20% off everything.",
  "callToAction": {
    "actionType": "LEARN_MORE",
    "url": "https://example.com/sale"
  },
  "topicType": "OFFER"
}

Response:

{
  "status": "ok",
  "data": {
    "name": "locations/123/localPosts/789",
    "summary": "Grand opening sale! 20% off everything.",
    "state": "PROCESSING",
    "createTime": "2025-01-15T14:30:00Z"
  }
}
const post = await client.posts.create('locations/123', {
  summary: 'Grand opening sale! 20% off everything.',
  callToAction: {
    actionType: 'LEARN_MORE',
    url: 'https://example.com/sale'
  },
  topicType: 'OFFER'
})

Post Types

Topic TypeDescription
STANDARDGeneral update
EVENTEvent announcement with dates
OFFERPromotional offer with optional coupon
ALERTCOVID or special alert

Call to Action Types

ActionDescription
BOOKBook an appointment
ORDERPlace an order
SHOPShop online
LEARN_MORELearn more link
SIGN_UPSign up form
CALLCall the business

Update Post

Update an existing post.

PATCH /api/v1/posts/{postId}?locationId=locations/123
Authorization: Bearer {token}
Content-Type: application/json

{
  "summary": "Updated post content"
}
const updated = await client.posts.update(
  'locations/123',
  'postId',
  { summary: 'Updated post content' }
)

Delete Post

Delete a post.

DELETE /api/v1/posts/{postId}?locationId=locations/123
Authorization: Bearer {token}

Response:

{
  "status": "ok",
  "data": { "deleted": true }
}
await client.posts.deletePost('locations/123', 'postId')

Errors

CodeDescription
QUOTA_EXCEEDEDMonthly post limit reached
GOOGLE_API_ERRORGoogle rejected the post
VALIDATION_ERRORInvalid post data
PLAN_RESTRICTIONPosts not available on current plan

On this page