List subscribable events

Overview

Get the full catalog of events the caller's partner can subscribe to, plus the allowed batch_interval_hours choices. The catalog is partner-scoped: hipages-only events (flagging / rating-gate / moderation family) are included only for hipages partners.

Prerequisites

  • A bearer token. Callable with Partner tokens.

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

GET /api/v1/partner/webhooks/events

Authentication

  • Requires a bearer token in the Authorization: Bearer <bearer-token> header.
  • Who can call it: Partner tokens.
  • requirePartnerCompanyId enforces bundle_id === 1.
  • The resolved partner_company_id is passed to decide whether hipages events are included.

Rate limit

  • No rate limit.

Request

  • No path/query/body params.

Response

  • data.data[].value (string) — event name (e.g. review_ingested, review_pull_connected)
  • data.data[].category (string) — e.g. ingest, response, connection, usage, billing
  • data.data[].description (string)
  • data.data[].default_kind (string) — immediate | batch; the slot the event belongs to
  • data.meta.batch_interval_hours_options (array) — [1, 2, 4, 6, 12]

200 — events catalog (full: ingest / hipages / response / connection / usage / billing) · 200

{
  "data": {
    "data": [
      {
        "value": "review_ingested",
        "category": "ingest",
        "description": "A new review was ingested via partner submission or seed import.",
        "default_kind": "batch"
      },
      {
        "value": "review_pulled_from_platform",
        "category": "ingest",
        "description": "A new review was pulled from a connected platform (Google / Facebook / Caring).",
        "default_kind": "batch"
      },
      {
        "value": "review_campaign_collected",
        "category": "ingest",
        "description": "A review was collected through a solicitation campaign flow.",
        "default_kind": "batch"
      },
      {
        "value": "review_updated",
        "category": "ingest",
        "description": "An existing review’s content was overwritten via re-submission.",
        "default_kind": "batch"
      },
      {
        "value": "review_hard_deleted",
        "category": "ingest",
        "description": "A review was permanently removed (typically OAuth disconnect cleanup).",
        "default_kind": "immediate"
      },
      {
        "value": "platform_removal_detected",
        "category": "ingest",
        "description": "A backward scrape detected the review is no longer present on the source platform.",
        "default_kind": "immediate"
      },
      {
        "value": "profanity_detected",
        "category": "ingest",
        "description": "A profanity scan matched the review body (logged only on hit, content auto-redacted).",
        "default_kind": "immediate"
      },
      {
        "value": "tradie_flagged",
        "category": "hipages",
        "description": "A tradie flagged a review for moderation review.",
        "default_kind": "immediate"
      },
      {
        "value": "flag_denied",
        "category": "hipages",
        "description": "The service team rejected a tradie flag; the review stays visible.",
        "default_kind": "immediate"
      },
      {
        "value": "flag_approved",
        "category": "hipages",
        "description": "The service team approved a flag and excluded the review from ratings.",
        "default_kind": "immediate"
      },
      {
        "value": "flag_approved_removed",
        "category": "hipages",
        "description": "The service team approved a flag and removed the review entirely.",
        "default_kind": "immediate"
      },
      {
        "value": "suppressed",
        "category": "hipages",
        "description": "A partner-admin hid the review from the public profile and ratings.",
        "default_kind": "immediate"
      },
      {
        "value": "restored",
        "category": "hipages",
        "description": "A previously suppressed review was brought back into the public profile and ratings.",
        "default_kind": "immediate"
      },
      {
        "value": "excluded_from_rating",
        "category": "hipages",
        "description": "The review was excluded from rating calculations but remains publicly visible.",
        "default_kind": "immediate"
      },
      {
        "value": "included_in_rating",
        "category": "hipages",
        "description": "The review is once again counted in rating calculations.",
        "default_kind": "immediate"
      },
      {
        "value": "hidden_from_public",
        "category": "hipages",
        "description": "The review was hidden from the public profile but still counts toward ratings.",
        "default_kind": "immediate"
      },
      {
        "value": "shown_to_public",
        "category": "hipages",
        "description": "The review was made visible on the public profile again.",
        "default_kind": "immediate"
      },
      {
        "value": "released_to_public",
        "category": "hipages",
        "description": "The review was released early from the 7-day hold and is now publicly visible.",
        "default_kind": "immediate"
      },
      {
        "value": "qualified_toggled",
        "category": "hipages",
        "description": "The review’s qualifying category (A ↔ B) was reclassified.",
        "default_kind": "immediate"
      },
      {
        "value": "soft_deleted",
        "category": "hipages",
        "description": "A partner-admin soft-deleted the review; it can be restored later.",
        "default_kind": "immediate"
      },
      {
        "value": "profanity_approved",
        "category": "hipages",
        "description": "A partner-admin cleared a false-positive profanity flag; the original wording was restored and the review re-shown to the public feed.",
        "default_kind": "batch"
      },
      {
        "value": "profanity_confirmed",
        "category": "hipages",
        "description": "A partner-admin confirmed a profanity-flagged review; the redaction stays in place, the review is hidden from the public profile, and it returns to the All Reviews list.",
        "default_kind": "batch"
      },
      {
        "value": "response_drafted",
        "category": "response",
        "description": "A response draft was created on a review.",
        "default_kind": "immediate"
      },
      {
        "value": "response_updated",
        "category": "response",
        "description": "A response draft’s content was edited.",
        "default_kind": "immediate"
      },
      {
        "value": "response_deleted",
        "category": "response",
        "description": "A response was removed (soft or hard delete).",
        "default_kind": "immediate"
      },
      {
        "value": "ai_response_generated",
        "category": "response",
        "description": "An AI-suggested response was drafted for the review.",
        "default_kind": "immediate"
      },
      {
        "value": "response_submitted_to_platform",
        "category": "response",
        "description": "A response was dispatched to the source platform (Google / Facebook / Caring).",
        "default_kind": "immediate"
      },
      {
        "value": "response_post_succeeded",
        "category": "response",
        "description": "The source platform accepted and published the response.",
        "default_kind": "immediate"
      },
      {
        "value": "response_post_failed",
        "category": "response",
        "description": "The source platform rejected the response (reason in metadata).",
        "default_kind": "immediate"
      },
      {
        "value": "response_status_changed",
        "category": "response",
        "description": "A response moved between lifecycle statuses (draft → submitted → posted / failed).",
        "default_kind": "immediate"
      },
      {
        "value": "response_resubmitted",
        "category": "response",
        "description": "A previously failed response was re-fired to the source platform.",
        "default_kind": "immediate"
      },
      {
        "value": "homeowner_notified_of_response",
        "category": "hipages",
        "description": "A homeowner notification email was sent informing them of the response.",
        "default_kind": "immediate"
      },
      {
        "value": "review_pull_connected",
        "category": "connection",
        "description": "Review pulling (scraping) for a location's review site started or resumed.",
        "default_kind": "immediate"
      },
      {
        "value": "review_pull_disconnected",
        "category": "connection",
        "description": "Review pulling (scraping) for a location's review site is unavailable — connection lost, no URL configured, or paused (reason + error_code carry which).",
        "default_kind": "immediate"
      },
      {
        "value": "response_post_connected",
        "category": "connection",
        "description": "Response posting for a location's review site became active.",
        "default_kind": "immediate"
      },
      {
        "value": "response_post_disconnected",
        "category": "connection",
        "description": "Response posting for a location's review site is unavailable — disconnected, awaiting approval, or no URL configured.",
        "default_kind": "immediate"
      },
      {
        "value": "usage.threshold_warning",
        "category": "usage",
        "description": "A location crossed a usage warning threshold (75% / 80%) for a metered plan feature this period.",
        "default_kind": "immediate"
      },
      {
        "value": "usage.limit_reached",
        "category": "usage",
        "description": "A location reached 100% of its included units for a metered plan feature this period.",
        "default_kind": "immediate"
      },
      {
        "value": "plan.cancelled",
        "category": "billing",
        "description": "A location cancelled its subscription and will no longer be billed.",
        "default_kind": "immediate"
      },
      {
        "value": "brand_plan.cancelled",
        "category": "billing",
        "description": "A brand (or partner) cancelled its subscription across its locations.",
        "default_kind": "immediate"
      },
      {
        "value": "plan.changed",
        "category": "billing",
        "description": "A location or brand subscription plan was changed (upgrade, downgrade or proration).",
        "default_kind": "immediate"
      }
    ],
    "meta": {
      "batch_interval_hours_options": [
        1,
        2,
        4,
        6,
        12
      ]
    }
  }
}

Errors

StatusMeaning
401The bearer token is missing, expired or invalid
500Unexpected server error

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/partner/webhooks/events" \
  --header 'Authorization: Bearer {{bearerToken}}' \
  --header 'Accept: application/json'

Did this page help you?