Synup · AsyncAPI Specification
Synup Webhooks
Version
View Spec
View on GitHub
Local MarketingListings ManagementReputation ManagementLocal SEOReviewsSocial-MediaAnalyticsBusiness ListingsReview ManagementAgency SoftwareAsyncAPIEvents
AsyncAPI Specification
name: Synup webhook event catalog
generated: '2026-08-13'
method: searched
source: https://developer.synup.com/synup-webhooks-doc-2259000
description: Synup publishes 43 account webhook events as OpenAPI 3.1 webhook documents (one page per
event) plus a delivery guide. There is no AsyncAPI document — this catalog and openapi/synup-webhooks-openapi.yml
are the machine-readable capture. Payload schemas are verbatim provider content and live in the OpenAPI
file.
spec: openapi/synup-webhooks-openapi.yml
asyncapi_published: false
delivery:
transport: HTTPS POST with a JSON body
subscription_model: account-wide; a single Webhooks URL per account receives every event — there is
no per-event subscription
configuration: Synup workspace -> Settings -> Notifications -> Configure Webhooks
endpoint_requirements:
- HTTPS only, plain HTTP rejected
- Publicly resolvable host; loopback, RFC-1918, link-local and cloud metadata IPs are refused
- Respond within 10 seconds
- Be duplicate-tolerant — de-duplicate on the stable IDs inside data
ack: Return 2xx to acknowledge; any non-2xx or timeout is a failed attempt
ordering: not guaranteed
retries: Synup records attempt count, last attempt time and HTTP response code per delivery
gates:
- webhooks feature enabled on the account
- a Webhooks URL is set
- a signing secret has been generated
- the endpoint has passed verification
security:
signature_header: X-Synup-Signature
algorithm: sha256=base64(HMAC-SHA256(signing_secret, raw_request_body))
verification_guidance:
- Use the raw request body bytes; re-serializing parsed JSON breaks the HMAC
- Compare in constant time
- Reject with 401 on mismatch
secret_rotation: Regenerating the secret invalidates the old one immediately and resets verified status;
changing the Webhooks URL also resets it
handshake:
event: endpoint.verification
request: '{"event":"endpoint.verification","nonce":"<random hex>","timestamp":"<ISO-8601 UTC>"}'
expected_response: HTTP 200 whose body is HMAC-SHA256(secret, nonce) as a lowercase hex string (a
JSON-quoted hex string is also accepted)
envelope:
event: string — the dotted event name
timestamp: ISO-8601 UTC datetime the event was emitted
account_id: integer — the Synup account
location_id: string | null — numeric string for location-scoped events, null for brand-scoped events
data: object — event-specific payload
agency_account_id: integer — present only when the account is managed by a parent agency account
scope: string — present only on AI post idea events; "local" or "social"
event_count: 43
event_groups:
- prefix: campaign
events: 6
- prefix: connection
events: 6
- prefix: endpoint
events: 1
- prefix: idea
events: 2
- prefix: idea_image
events: 2
- prefix: idea_pipeline
events: 2
- prefix: idea_series
events: 1
- prefix: interaction
events: 2
- prefix: listing
events: 1
- prefix: profile
events: 3
- prefix: rankings
events: 2
- prefix: review_analytics
events: 2
- prefix: social_connection
events: 4
- prefix: social_post
events: 9
events:
- event: campaign.feedback_submitted
summary: Campaign feedback submitted
scope: location
description: 'A customer submitted a rating/feedback on the campaign''s review-funnel page. Scope: location-scoped.
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: campaign.recipients_added
summary: Campaign recipients added
scope: location
description: 'A batch of customers was enrolled into a campaign. Scope: location-scoped. Delivered as
a signed HTTP POST to your Webhooks URL.'
- event: campaign.review_posted
summary: Review posted (campaign-attributed)
scope: location
description: 'A new review landed at a location with at least one active campaign within the 30-day
attribution window. Attribution is location-level. Scope: location-scoped. Delivered as a signed HTTP
POST to your Webhooks URL.'
- event: campaign.send_rejected
summary: Campaign message send rejected
scope: location
description: 'A message could not be sent (insufficient credits, invalid contact, or provider rejection).
Scope: location-scoped. Delivered as a signed HTTP POST to your Webhooks URL.'
- event: campaign.sent
summary: Review campaign sent
scope: location
description: 'A campaign was launched and invites started going out. Scope: location-scoped. Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: campaign.status_change
summary: Campaign message status changed
scope: location
description: 'A recipient''s message engagement changed (delivered / opened / clicked / bounced / dropped
/ unsubscribed). Scope: location-scoped. Delivered as a signed HTTP POST to your Webhooks URL.'
- event: connection.google_verification_failed
summary: Google verification failed
scope: location
description: 'A Google Business Profile verification reached a terminal failure (suspended, duplicate,
or fetch error). In-progress states do not fire. Scope: location-scoped. Delivered as a signed HTTP
POST to your Webhooks URL.'
- event: connection.google_verification_verified
summary: Google verification passed
scope: location
description: 'A location''s Google Business Profile passed verification. Scope: location-scoped. Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: connection.listing_inaccessible
summary: Listing became inaccessible
scope: location
description: 'The connected account can no longer access the location''s listing (access lost even though
credentials may still be valid). Scope: location-scoped. Delivered as a signed HTTP POST to your Webhooks
URL.'
- event: connection.location_connected
summary: Listing connected
scope: location
description: 'A Google or Facebook listing is newly linked to a location. Scope: location-scoped. Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: connection.location_disconnected
summary: Listing disconnected
scope: location
description: 'A Google or Facebook listing is unlinked/removed from a location. Scope: location-scoped.
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: connection.reauth_required
summary: Listing re-authorization required
scope: location
description: 'The connected account''s credentials were invalidated; the customer must reconnect / re-authorize.
Scope: location-scoped. Delivered as a signed HTTP POST to your Webhooks URL.'
- event: endpoint.verification
summary: Endpoint verification handshake
scope: location
description: 'Endpoint-verification handshake. Sent when a customer saves or clicks "Verify" on a Webhooks
URL. Your endpoint must reply HTTP 200 with the lowercase hex HMAC-SHA256 of the nonce, keyed by your
signing secret: hex(HMAC-SHA256(signing_secret, nonce)). Synup accepts the URL only if the returned
digest matches. This request carries no location_id and no data object.'
- event: idea.generated
summary: AI post idea generated
scope: brand
description: 'A new AI post idea was generated. Scope: local or social (see the top-level scope field).
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: idea.scheduled_as_post
summary: AI idea scheduled as post
scope: brand
description: 'An idea was linked to a published social post (social only). Scope: social (see the top-level
scope field). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: idea_image.generation_job_completed
summary: AI idea image generated
scope: brand
description: 'An AI image for an idea finished generating. Scope: local or social (see the top-level
scope field). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: idea_image.generation_job_failed
summary: AI idea image generation failed
scope: brand
description: 'An AI image for an idea failed generating. Scope: local or social (see the top-level scope
field). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: idea_pipeline.scrape_completed
summary: AI idea scrape completed
scope: brand
description: 'A website-analysis scrape job for idea generation completed. Scope: local or social (see
the top-level scope field). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: idea_pipeline.scrape_failed
summary: AI idea scrape failed
scope: brand
description: 'A website-analysis scrape job for idea generation failed terminally. Scope: local or social
(see the top-level scope field). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: idea_series.all_posts_generated
summary: AI idea series completed
scope: brand
description: 'All slots in a content series finished generating. Scope: local or social (see the top-level
scope field). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: interaction.response
summary: New response to a review received
scope: location
description: Sent when Synup detects a new response to an existing review — including responses posted
through Synup and responses detected directly on the platform. Responses arrive asynchronously, often
well after the original review. Delivered to your Webhooks URL (Reviews webhook). Location-scoped.
Use data.interaction.parent_id to link the response to the review it answers.
- event: interaction.review
summary: New review received for a location
scope: location
description: Sent when Synup detects a new review for one of your locations on any monitored platform
(Google, Yelp, TripAdvisor, etc.). Delivered to your Webhooks URL (Reviews webhook — requires the
reviews webhook permission). Location-scoped. Social-category interactions are not delivered.
- event: listing.submission
summary: Directory listing synced (success/incomplete)
scope: location
description: 'Sent when Synup finishes attempting to sync a business listing to a directory (Google,
Facebook, etc.), triggered by profile updates or new directory submissions. Delivered to your Webhooks
URL (Listings webhook). One delivery per status change — a move from incomplete to success sends two
separate calls. Note the compact envelope: there is no top-level timestamp or account_id, and the
location is'
- event: profile.created
summary: Location created
scope: location
description: 'A new business location was created (customer-initiated only). Scope: location-scoped.
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: profile.deleted
summary: Location deleted
scope: location
description: 'A location was archived (soft delete; there is no hard delete). Scope: location-scoped.
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: profile.updated
summary: Location updated
scope: location
description: 'An existing location''s details were edited. Debounced to at most one delivery per location
per 60 seconds. Scope: location-scoped. Delivered as a signed HTTP POST to your Webhooks URL.'
- event: rankings.gridrank_report_ready
summary: Grid rank report ready
scope: location
description: 'A Grid (local-rank map) report finished generating. Scope: location-scoped. Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: rankings.sov_snapshot_completed
summary: Share-of-Voice snapshot completed
scope: location
description: 'A Share-of-Voice snapshot was stored for a keyword (one event per keyword). Scope: location-scoped.
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: review_analytics.daily_snapshot
summary: Daily review analytics snapshot
scope: location
description: 'The daily review-analytics roll-up for a location. Scope: location-scoped. Delivered as
a signed HTTP POST to your Webhooks URL.'
- event: review_analytics.weekly_snapshot
summary: Weekly review analytics snapshot
scope: location
description: 'The weekly review-analytics roll-up for a location. Scope: location-scoped. Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: social_connection.ad_account_status_changed
summary: Ad account status changed
scope: brand
description: 'A connected ad account''s status changed. Scope: brand-scoped (location_id is null). Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: social_connection.archived
summary: Social channel archived
scope: brand
description: 'A social channel connection was archived. Scope: brand-scoped (location_id is null). Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: social_connection.connected
summary: Social channel connected
scope: brand
description: 'A social channel was connected (or reconnected) to a brand. Scope: brand-scoped (location_id
is null). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_connection.disconnected
summary: Social channel disconnected
scope: brand
description: 'A social channel was disconnected from a brand. Scope: brand-scoped (location_id is null).
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_post.boost_active
summary: Boost active
scope: brand
description: 'A boost went live and is actively spending. Scope: brand-scoped (location_id is null).
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_post.boost_created
summary: Boost created
scope: brand
description: 'A boost (paid promotion) was created for a social post. Scope: brand-scoped (location_id
is null). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_post.boost_rejected
summary: Boost rejected
scope: brand
description: 'A boost was rejected by the ad platform. Scope: brand-scoped (location_id is null). Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: social_post.boost_stopped
summary: Boost stopped
scope: brand
description: 'A boost was stopped / completed. Scope: brand-scoped (location_id is null). Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: social_post.created
summary: Social post created
scope: brand
description: 'A social post was created (draft or scheduled) in Synup. Scope: brand-scoped (location_id
is null). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_post.deleted
summary: Social post deleted
scope: brand
description: 'A social post was archived/removed. Scope: brand-scoped (location_id is null). Delivered
as a signed HTTP POST to your Webhooks URL.'
- event: social_post.failed
summary: Social post failed
scope: brand
description: 'A social post failed to publish on one or more platforms. Scope: brand-scoped (location_id
is null). Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_post.published
summary: Social post published
scope: brand
description: 'A social post was published to its platforms. Scope: brand-scoped (location_id is null).
Delivered as a signed HTTP POST to your Webhooks URL.'
- event: social_post.rejected
summary: Social post rejected
scope: brand
description: 'A social post was rejected in an approval workflow. Scope: brand-scoped (location_id is
null). Delivered as a signed HTTP POST to your Webhooks URL.'
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/synup-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.