List plans visible to an account

Overview

Get the plans an account can see, for display in an account-facing UI.

Use this when you're building the plan page a business owner sees. Partners should use List your plans instead.

With a token, you'll need the account's company_id (or leave it out for your own account). Without a token, you'll need the partner's referral_code.

Returns the plans visible to that account: the plans set up for its partner, cheapest first.

Prerequisites

  • With a token: a bearer token (see Authentication) and, optionally, the account's company_id.
  • Without a token: the partner's referral_code, for example from a sign-up link.

Base URL

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

Endpoint

GET /api/v1/plans/list

Authentication

Public (no token)

  • A bearer token is optional.
  • With a token: company_id must be inside your own account tree, otherwise 422. Leave it out to get the plans for the token's own company.
  • Without a token: send referral_code to get that partner's plans. company_id on its own is rejected with 422. With neither, you get the default plans.

Rate limit

100 requests per minute, counted per client IP address. See Rate limits.

Request parameters

ParameterInTypeRequiredDescription
company_idqueryintegerNoWith a token only: the account to list plans for. Must be inside your account tree. Leave it out to use the company of the user behind the token. Without a token it's rejected unless you also send referral_code (then it's ignored).
referral_codequerystringNoWithout a token: the partner's referral code, to list that partner's plans. Must be an existing code. Up to 255 characters.

Request body

None.

Request payload

None.

Response body

The payload is inside data.

FieldTypeDescription
dataarrayThe plans, sorted by price (lowest first).
data[].idintegerThe plan's id.
data[].plan_namestringThe plan's name.
data[].pricenumberThe plan's price.
data[].original_pricenumber or nullThe original price, or null.
data[].statusstringactive or inactive.
data[].plan_typestringplan-based or usage-based.
data[].enforcement_modestringper-location or aggregate-pool.
data[].is_admin_managedbooleantrue for plans set up by Shout About Us (plan-based partners), false for plans your partner creates (usage-based partners).
data[].descriptionstring or nullThe plan's description.
data[].plan_end_datestring or nullThe date the plan ends, or null.
data[].short_infostring or nullA one-line summary of the plan.
data[].created_atstringWhen the plan was created.
data[].updated_atstringWhen the plan was last changed.
data[].deleted_atstring or nullAlways null here.
data[].featuresarrayThe plan's features, one entry per feature.
data[].features[].idintegerThe feature row's id.
data[].features[].plan_idintegerThe plan's id.
data[].features[].feature_namestringThe feature, e.g. ai_response or review_solicitation_email.
data[].features[].enabledbooleanWhether the feature is on in this plan.
data[].features[].limit_typestring or nullmonthly or quantity, or null.
data[].features[].included_unitsinteger or nullPlan-based plans: the units included. null means unlimited.
data[].features[].hard_stopbooleantrue: the feature stops at its limit. false: usage over the limit is billed at overage_rate.
data[].features[].optionsarrayThe feature's display options, each with id, plan_feature_id, feature_key and feature_value. Usually [].
data[].plan_review_sitesarrayThe review sites on the plan, with how often reviews are collected from each.
data[].plan_review_sites[].idintegerThe row's id.
data[].plan_review_sites[].plan_idintegerThe plan's id.
data[].plan_review_sites[].review_site_idintegerThe review site's id.
data[].plan_review_sites[].pull_frequencystringHow often reviews are collected: hourly, daily, weekly or monthly.
data[].plan_review_sites[].pull_intervalintegerCollect every this many hours, days, weeks or months (1 to 30).
data[].plan_review_sites[].review_siteobjectThe review site: id and name.
data[].plan_review_sites[].review_site.idintegerThe review site's id.
data[].plan_review_sites[].review_site.namestringThe review site's name.

Response payload

{
  "data": {
    "data": [
      {
        "id": 36,
        "plan_name": "Growth — Unlimited",
        "price": 2,
        "original_price": null,
        "status": "active",
        "plan_type": "plan-based",
        "enforcement_mode": "per-location",
        "is_admin_managed": true,
        "description": null,
        "plan_end_date": null,
        "short_info": null,
        "created_at": "2026-09-21T13:53:10.000000Z",
        "updated_at": "2026-09-21T13:53:10.000000Z",
        "deleted_at": null,
        "features": [
          {
            "id": 1116,
            "plan_id": 36,
            "feature_name": "ai_response",
            "enabled": true,
            "included_units": 100,
            "limit_type": null,
            "hard_stop": false,
            "options": []
          },
          {
            "id": 1117,
            "plan_id": 36,
            "feature_name": "review_flag",
            "enabled": true,
            "included_units": 121,
            "limit_type": null,
            "hard_stop": false,
            "options": []
          },
          {
            "id": 1118,
            "plan_id": 36,
            "feature_name": "response_to_past_reviews",
            "enabled": true,
            "included_units": 12,
            "limit_type": "monthly",
            "hard_stop": false,
            "options": []
          }
        ],
        "plan_review_sites": [
          {
            "id": 218,
            "plan_id": 36,
            "review_site_id": 1,
            "pull_frequency": "daily",
            "pull_interval": 1,
            "review_site": {
              "id": 1,
              "name": "Yelp"
            }
          },
          {
            "id": 219,
            "plan_id": 36,
            "review_site_id": 3,
            "pull_frequency": "daily",
            "pull_interval": 1,
            "review_site": {
              "id": 3,
              "name": "Facebook"
            }
          }
        ]
      }
    ]
  }
}

The example shows one plan, with three of its features and two of its review sites.

Examples

Success payload

See Response payload.

Error payload

404 Company not found

{
  "message": "Not Found",
  "status": "error",
  "errors": "Company not found."
}

422 Unknown company_id

{
  "message": "The selected company id is invalid.",
  "errors": {
    "company_id": ["The selected company id is invalid."]
  }
}

422 company_id outside your tree

{
  "message": "The selected company id does not belong to your company hierarchy.",
  "errors": {
    "company_id": ["The selected company id does not belong to your company hierarchy."]
  }
}

422 company_id without a token

{
  "message": "Without a token, send referral_code instead of company_id.",
  "errors": {
    "company_id": ["Without a token, send referral_code instead of company_id."]
  }
}

422 Unknown referral_code

{
  "message": "The selected referral code is invalid.",
  "errors": {
    "referral_code": ["The selected referral code is invalid."]
  }
}

429 Too many requests

{
  "message": "Too Many Attempts."
}
StatusMeaning
200The plans.
404The company can't be found.
422company_id doesn't exist or is outside your tree, company_id was sent without a token, or referral_code doesn't exist.
429Rate limit exceeded.
500Unexpected server error.

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/plans/list?company_id=5994" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?