# OmniSocials Google Business API

> Publish updates, events and offers to your Business Profile, with a button on any post, and read your location’s numbers. One API key, no Google Cloud project of your own.

This is the machine-readable version of [omnisocials.com/google-business-api](https://omnisocials.com/google-business-api), maintained for AI agents. Facts checked against the OmniSocials app and API on October 17, 2026. Platform reference: [docs.omnisocials.com/platforms/google-business](https://docs.omnisocials.com/platforms/google-business). API reference: [docs.omnisocials.com/api](https://docs.omnisocials.com/api).

## Basics

- Base URL: `https://api.omnisocials.com/v1`
- Auth: `Authorization: Bearer omsk_live_...`. One key belongs to one workspace. Keys are created in the app under Settings, API.
- Channel id in `accounts`: `google_business`. The account connects inside the OmniSocials app, not through the API.
- Rate limit: 100 requests per minute per key. A 429 carries `Retry-After`.
- Responses use a `{ "data": ... }` envelope. Create returns `201`.
- Webhooks: `post.scheduled`, `post.published`, `post.failed`, `post.approved`, `post.rejected`, signed with HMAC-SHA256 in `X-OmniSocials-Signature`.

## Skip the Google access request

Google’s own API needs a Cloud project, approved access to the Business Profile APIs, the business.manage scope and tokens that expire every hour. OmniSocials already did that work.

- On your own: OAuth client, Four APIs, API access, Verification, Locations, Tokens, Captions, Hosting, then the first post.
- Permissions your own app must get approved: `.../auth/business.manage`, `.../auth/userinfo.profile`, `.../auth/userinfo.email`.
- On OmniSocials: sign in, create an API key, POST. Business Profile API access already in place.

## Schedule a post

```bash
curl -X POST https://api.omnisocials.com/v1/posts/create \
  -H "Authorization: Bearer $OMNISOCIALS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "content": "Post from your own code: SDKs in 8 languages.",
  "accounts": ["google_business"],
  "media_urls": ["https://cdn.example.com/sdks.jpg"],
  "schedule_at": "2026-10-22T18:00:00Z",
  "google_business": {
    "cta": {
      "actionType": "LEARN_MORE",
      "url": "https://omnisocials.com/sdk"
    }
  }
}'
```

The answer (`201`, shortened):

```json
{
  "data": {
    "id": "1024",
    "status": "scheduled",
    "app_url": "https://app.omnisocials.com/create-post/1024"
  }
}
```

## Every post type, one request

Updates, events and offers share one request shape. Add one image or none, a button, an event’s title and dates or an offer’s redeem link. OmniSocials checks the post against Google’s rules before it saves it.

- **Six buttons.** Learn more, Book, Order online, Buy, Sign up or Call now, on any post type. Every one but Call now opens your link. (`cta.actionType`, `cta.url`)
- **Google’s post types.** Update, Event or Offer. Events and offers carry a title and dates; an offer adds a redeem link or a coupon, and terms. (`topic_type`, `event`, `offer`)
- **One image or none.** A JPEG or PNG image up to 5 MB, or text alone. Other image types are refused in your request, before anything reaches Google. (`media_urls`)

### Update

```json
{
  "content": "Post from your own code: SDKs in 8 languages.",
  "accounts": ["google_business"],
  "media_urls": ["https://cdn.example.com/sdks.jpg"],
  "schedule_at": "2026-10-22T18:00:00Z",
  "google_business": {
    "cta": {
      "actionType": "LEARN_MORE",
      "url": "https://omnisocials.com/sdk"
    }
  }
}
```

### Event

```json
{
  "content": "See how OmniSocials picks your best hours.",
  "accounts": ["google_business"],
  "media_urls": ["https://cdn.example.com/best-times.jpg"],
  "schedule_at": "2026-10-23T09:00:00Z",
  "google_business": {
    "topic_type": "EVENT",
    "event": {
      "title": "Live demo: best times to post",
      "schedule": {…}
    }
  }
}
```

### Offer

```json
{
  "content": "Plan every channel from one calendar.",
  "accounts": ["google_business"],
  "media_urls": ["https://cdn.example.com/app.jpg"],
  "schedule_at": "2026-10-24T09:00:00Z",
  "google_business": {
    "topic_type": "OFFER",
    "event": {
      "title": "Try OmniSocials free for 14 days",
      "schedule": {…}
    },
    "offer": {
      "redeemOnlineUrl": "https://omnisocials.com/pricing",
      "termsConditions": "A card is needed for the trial."
    }
  }
}
```

## Events and offers Google accepts

Give a post a title and dates to make it an event. Add a coupon code or a redeem link and terms to make it an offer. Links and phone numbers in the caption fail your request with a clear message, before Google can answer with a bare 400.

`POST /v1/posts/create`:

```json
{
  "content": "Plan every channel from one calendar: omnisocials.com",
  "accounts": ["google_business"],
  "media_urls": ["https://cdn.example.com/app.jpg"],
  "schedule_at": "2026-10-24T09:00:00Z",
  "google_business": {
    "topic_type": "OFFER",
    "event": {
      "title": "Try OmniSocials free for 14 days",
      "schedule": {
        "startDate": { "year": 2026, "month": 10, "day": 24 },
        "startTime": { "hours": 9, "minutes": 0 },
        "endDate": { "year": 2026, "month": 11, "day": 30 },
        "endTime": { "hours": 23, "minutes": 59 }
      }
    },
    "offer": {
      "redeemOnlineUrl": "https://omnisocials.com/pricing",
      "termsConditions": "A card is needed for the trial."
    }
  }
}
```

The answer:

```json
{ "error": { "code": "validation_error",
  "message": "Google Business doesn't allow links in the caption. Remove the link from the text. You can add a “Learn more”, “Buy”, or “Book” button to the post that opens the link instead." } }
```

The answer:

```json
{ "data": { "id": "1023", "status": "scheduled" } }
```

- **Events.** A title of up to 58 characters with a start and an end, in Google’s own date and time fields. Google prints them above your text. (`topic_type: "EVENT"`, `event.schedule`)
- **Offers.** A coupon code or an https redeem link, terms of up to 4,000 characters, and the dates the offer runs. (`offer.couponCode`, `offer.redeemOnlineUrl`)
- **Captions Google accepts.** A link or a phone number in the text fails your request with the reason. Put the link on the offer or a button; Call now uses your profile’s number. (`400 validation_error`)

## Read your location’s numbers

Google discontinued per-post insights in 2023, so the numbers live on the location: views from Search and Maps, calls, direction requests, website clicks, bookings, rating and reviews. A post answers metrics_unavailable with a note, never zeros.

`GET /v1/analytics/accounts`:

```json
{
  "data": [
    {
      "platform": "google_business",
      "date": "2026-10-07",
      "metrics": {
        "period": "daily", "data_date": "2026-10-04",
        "impressions": 98,
        "impressions_breakdown": {
          "desktop_maps": 7, "desktop_search": 30,
          "mobile_maps": 19, "mobile_search": 42
        },
        "calls": 0, "direction_requests": 1,
        "website_clicks": 1, "bookings": 0,
        "impressions_30d": 2940, "website_clicks_30d": 38,
        "search_keywords": [
          { "keyword": "omnisocials", "value": 212 },
          { "keyword": "social media scheduler", "value": 38 }
        ],
        "search_keywords_month": "2026-09"
      }
    }
  ],
  "date": "2026-10-07"
}
```

`GET /v1/analytics/posts/1019`:

```json
{
  "data": {
    "post_id": "1019",
    "platforms": {
      "google_business": {
        "metrics": {
          "metrics_unavailable": true,
          "note": "Google discontinued per-post insights for Business Profile posts in 2023. Account-level metrics are collected instead.",
          "state": "LIVE"
        }
      }
    }
  }
}
```

- **Views by surface.** How often the profile was seen on Google Search and on Maps, on desktop and on mobile. Per day and over the last 30 days. (`impressions_breakdown`, `impressions_30d`)
- **What people did.** Calls, direction requests, website clicks and bookings, plus the average rating and the number of reviews. (`calls`, `direction_requests`, `review_count`)
- **Search keywords.** Once a month, the searches that showed your profile and how often. Google lags two to three days; data_date says which day. (`search_keywords`, `data_date`)

## Connect a location once, post from code

Sign in with Google once inside OmniSocials and pick the location. Create an API key, and your code posts and reports for that location.

- **Sign in with Google.** Connect once in OmniSocials with the Google account that manages your Business Profile. Its hourly tokens stay with OmniSocials.
- **Every location in one list.** Locations from every account the Google account reaches, in one picker. With a single location, it is picked for you.
- **Checked when you create.** A post for a workspace without a selected location fails in your request, with the fix, not later at publish time. (`400 validation_error`)

`GET /v1/accounts?platform=google_business` answers:

```json
{
  "data": [
    {
      "id": "4127_google_business",
      "platform": "google_business",
      "content_types": ["post"],
      "status": "active",
      "needs_reconnect": false
    }
  ],
  "workspace_name": "OmniSocials"
}
```

## Google’s rules, in one place

OmniSocials checks every post against them before it reaches Google, so a bad post fails in your request, not at publish time.

| Limit | Value |
| --- | --- |
| Caption | 1,500 characters, a post needs text |
| In the caption | No links and no phone numbers |
| Image | One JPEG or PNG, up to 5 MB |
| Video | Not on Google Business |
| Title and coupon | 58 characters each |
| Offer terms | 4,000 characters |
| Redeem link | https:// only |
| Buttons | A link on all but Call now |
| Rate limit | 100 requests a minute per API key |
| Accounts | One location per workspace |

## Your first update in three steps

About five minutes from sign-up to a scheduled update on your Business Profile. Then hand the key to your coding agent.

1. **Create an API key** (`Settings › API`). Start your trial, open Settings, API and create a key. It is shown once.
2. **Connect your location** (`GET /v1/accounts`). Sign in with Google in OmniSocials once and pick the location. Then list it from your code.
3. **Send your first update** (`POST /v1/posts/create`). Post now with create-and-publish, or add schedule_at to plan it.

## FAQ

### Do I need my own Google Cloud project or API access?

No. The location connects through OmniSocials’ Google connection, with Google’s own sign-in. You call the OmniSocials API with an API key and never handle Google’s tokens, which expire every hour.

### Which Business Profiles can I post to?

Any location your Google account manages, in every account it can reach. Right after you sign in with Google you pick the location; with only one, OmniSocials picks it for you. A Google account without a location can’t be connected.

Each workspace posts to one location. A second location goes in a second workspace, with its own key.

### Can my own users connect their profiles through the API?

Not yet. Locations connect inside the OmniSocials app. Every API key in that workspace can then post to the location.

### Which post types can I publish?

Updates, events and offers, Google’s own three. Each post takes text and one image, or no image. An event adds a title with a start and an end; an offer adds a title, its dates, a coupon code or a redeem link, and terms.

Google Business takes no video and no second image.

### Which buttons can a post have?

Learn more, Book, Order online, Buy, Sign up or Call now, on any post type: cta.actionType is LEARN_MORE, BOOK, ORDER, SHOP, SIGN_UP or CALL. Every button except Call now needs a url. Call now uses the phone number on your Business Profile.

### Why does the API refuse my caption?

Google turns down a post with a phone number or a link in the text, with a bare 400 that doesn’t say why. OmniSocials checks the caption first and answers 400 validation_error with what to change, before the post is saved. Put the link on the offer or a button, and use Call now for your number.

### Can I read analytics for my posts?

Not per post. Google discontinued per-post insights for Business Profiles in 2023, so GET /v1/analytics/posts/:id answers metrics_unavailable: true with a note, never zeros.

GET /v1/analytics/accounts returns the location’s numbers per day and over 30 days: views on Search and Maps, on desktop and mobile, calls, direction requests, website clicks, bookings, rating and review count, and once a month the search keywords that showed your profile. Google reports them up to three days late.

### Can I answer Google reviews through the API?

No. Google reviews aren’t in the Social Inbox. The API reads the average rating and the number of reviews, as part of the location’s numbers.

### What happens when a post fails to publish?

On a temporary error, OmniSocials retries it up to 3 times, 15 minutes apart. When Google can’t fetch the image, OmniSocials warms it up and tries once more a few seconds later. Then post.published or post.failed fires.

### How do webhooks work?

Register a URL and pick the events: post.scheduled, post.published, post.failed, post.approved and post.rejected. Every delivery is signed with HMAC-SHA256 in the X-OmniSocials-Signature header.

### Is the Google Business Profile API free?

Google doesn’t charge for it, but you have to request API access for a Google Cloud project and wait for Google to approve it. Through OmniSocials you skip the request, and the API is part of the plan, $10 per seat per month billed annually.

### What are the rate limits?

100 requests a minute per API key. Past that the API answers 429 with a Retry-After header that says when to try again.

### How much does OmniSocials cost?

One plan with every feature included: $10 per seat per month billed annually, or $12 billed monthly. Team members and client seats cost the same. Every account starts with a 14-day free trial.

The REST API, the SDKs, the CLI, webhooks and the MCP server are part of that one plan.

## Pricing

From $10 per seat a month, API included. 14-day free trial.

## Related

- [Google Business scheduler](https://omnisocials.com/google-business.md)
- [Google Business MCP server](https://omnisocials.com/google-business-mcp.md)
- [All channels](https://omnisocials.com/channels.md)

## Links

- Page: https://omnisocials.com/google-business-api
- Google Business platform docs: https://docs.omnisocials.com/platforms/google-business
- API reference: https://docs.omnisocials.com/api
- REST API overview: https://omnisocials.com/api.md
- MCP server: https://omnisocials.com/mcp.md
- Sign up: https://app.omnisocials.com/signup
