openapi: 3.1.0
info:
  title: Listings API
  version: 2026-07-29
  description: "REST API for managing business locations: sync listings across
    Google, Facebook, Bing and other publishers, respond to reviews, publish
    posts, and pull local search analytics. Authenticate with an API key from
    the developer dashboard."
  contact:
    name: Listings API support
    email: support@listingsapi.com
    url: https://www.listingsapi.com/contact
  termsOfService: https://www.listingsapi.com/terms
  license:
    name: Proprietary (Listings API Terms of Service)
    url: https://www.listingsapi.com/terms
  x-logo:
    url: https://www.listingsapi.com/favicon.svg
externalDocs:
  description: Developer documentation
  url: https://docs.listingsapi.com
servers:
  - url: https://listingsapi.com
    description: Production
security:
  - apiKey: []
  - rapidApiKey: []
    rapidApiHost: []
tags:
  - name: Locations
    description: Create, update, archive, and inspect business locations.
  - name: Listings
    description: Premium and additional directory listings, duplicates, and AI evaluation.
  - name: Connected Accounts
    description: Bulk Google / Facebook / Yelp / TripAdvisor account connection flows.
  - name: Reviews
    description: Reviews and review-response endpoints, including analytics.
  - name: Posts
    description: Create and manage Google Business Profile posts — announcements,
      events, and offers — across locations.
  - name: Analytics
    description: Per-publisher insights (Google / Facebook / Bing) and indexing rate.
  - name: Supporting APIs
    description: Supporting reference data — countries, sub-categories, and
      publisher site categories — plus the publisher sites included in your
      plan.
paths:
  /api/v4/countries:
    get:
      operationId: supportedCountries
      summary: List of supported countries.
      tags:
        - Supporting APIs
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CountryType"
              example:
                data:
                  supportedCountries:
                    - databaseId: 13
                      hasCity: true
                      id: Q291bnRyeToxMw==
                      iso: AU
                      name: Australia
                      states:
                        - countryId: 13
                          id: "139"
                          iso: VIC
                          name: Victoria
                        - countryId: 13
                          id: "142"
                          iso: NSW
                          name: New South Wales
                        - countryId: 13
                          id: "141"
                          iso: QLD
                          name: Queensland
                    - databaseId: 17
                      hasCity: true
                      id: Q291bnRyeToxNw==
                      iso: BE
                      name: Belgium
                      states: []
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns every country Listings API supports along with its
        states/provinces and the ISO codes used when creating or updating
        locations.
  /api/v4/sub-categories:
    get:
      operationId: subcategories
      summary: List of sub-categories.
      tags:
        - Supporting APIs
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/SubCategoryType"
              example:
                data:
                  subcategories:
                    - databaseId: 639
                      id: U3ViQ2F0ZWdvcnk6NjM5
                      key: 3d-printing
                      name: 3D Printing
                      primary: true
                    - databaseId: 4589
                      id: U3ViQ2F0ZWdvcnk6NDU4OQ==
                      key: 3d-printing-service
                      name: 3D printing service
                      primary: true
                    - databaseId: 3268
                      id: U3ViQ2F0ZWdvcnk6MzI2OA==
                      key: aadhaar-center
                      name: Aadhaar center
                      primary: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the full catalog of subcategories used to classify
        locations when creating or updating them.
  /api/v4/locations-by-store-codes:
    get:
      operationId: getLocationsByStoreCodes
      summary: Get locations by the Store Codes.
      tags:
        - Locations
      parameters:
        - name: storeCodes
          in: query
          required: true
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of store code strings, e.g.
            `["ACME01","jio678"]`. URL-encode the value.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/LocationSummaryType"
              example:
                data:
                  getLocationsByStoreCodes:
                    - id: TG9jYXRpb246MTgwMDI4OQ==
                      databaseId: 1800289
                      accountId: 62670
                      storeId: ACME01
                      name: Jenny Home
                      archived: false
                      street: 600 Congress Ave, Suite 200
                      city: Austin
                      stateIso: TX
                      postalCode: "78701"
                      countryIso: US
                      phone: "5125550142"
                      categoryId: 15
                      subCategoryId: 1432
                      subCategoryName: Restaurants
                      package: PREMIUM
                      planId: 3797
                      planName: Launch
                      folderId: d90630a7-7af0-450f-bdfe-6457eb438b1f
                      folderName: root
                      tags:
                        - all
                      placeActionLinks:
                        - placeActionType: FOOD_ORDERING
                          uri: https://order.example.com
                          isPreferred: true
                          name: locations/1944.../placeActionLinks/54ada85bc246058a
                          submissionStatus: success
                      discoveredPlaceActionLinks: []
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns full location details for one or more locations identified
        by their store codes.
  /api/v4/locations:
    get:
      operationId: allLocations
      summary: All locations that belong to an account.
      tags:
        - Locations
      parameters:
        - name: first
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting forward from the start of the
            result set.
        - name: after
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page forward from. Pass `pageInfo.endCursor`, or
            equivalently the `cursor` of the last edge in the previous page.
            Stop paging when `pageInfo.hasNextPage` is false, or when a page
            returns an empty `edges` array.
        - name: last
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting backward from the end of the
            result set.
        - name: before
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page backward from, used with `last`. Pass the `cursor`
            of the first edge of the page you are moving back from — the
            gateway's shared `PageInfo` type exposes no `startCursor` field.
        - name: filter
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded filter object to narrow the result set (e.g. by tag,
            folder, or approval status).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                required:
                  - edges
                  - pageInfo
                properties:
                  edges:
                    type: array
                    items:
                      type: object
                      required:
                        - node
                        - cursor
                      properties:
                        node:
                          $ref: "#/components/schemas/LocationSummaryConnectionType"
                        cursor:
                          type: string
                  pageInfo:
                    type: object
                    required:
                      - hasNextPage
                      - hasPreviousPage
                    properties:
                      hasNextPage:
                        type: boolean
                      hasPreviousPage:
                        type: boolean
                      endCursor:
                        type:
                          - string
                          - "null"
                      total:
                        type:
                          - integer
                          - "null"
                  totalCount:
                    type: integer
              example:
                data:
                  allLocations:
                    edges:
                      - cursor: TG9jYXRpb246MTgwMDI4OQ==
                        node:
                          id: TG9jYXRpb246MTgwMDI4OQ==
                          databaseId: 1800289
                          accountId: 62670
                          accountName: owner@brightsmile-dental.com
                          name: Jenny Home
                          approved: APPROVED
                          archived: false
                          archivalScheduledAt: null
                          archivedAt: null
                          street: 600 Congress Ave, Suite 200
                          city: Austin
                          stateIso: TX
                          stateName: Texas
                          postalCode: "78701"
                          countryIso: US
                          countryCode: "1"
                          latitude: "30.2711286"
                          longitude: "-97.7436995"
                          phone: "5125550142"
                          additionalPhones: []
                          bizUrl: null
                          hideAddress: false
                          storeId: null
                          categoryId: 15
                          subCategoryId: 1432
                          subCategoryName: Restaurants
                          additionalCategoryIds: []
                          additionalCategoryNames: []
                          description: This is a standalone duplex house. A comfortable, private residence
                            located in the Bouldin Creek neighborhood of Austin,
                            offering spacious duplex living with easy access to
                            the surrounding South Congress area and downtown
                            Austin.
                          businessHours: []
                          package: PREMIUM
                          planId: 3797
                          planName: Launch
                          folderId: d90630a7-7af0-450f-bdfe-6457eb438b1f
                          folderName: root
                          tags:
                            - all
                          temporarilyClosed: false
                          ownerEmail: null
                          ownerName: null
                          googleVerificationStatus:
                            status: NOT_CONNECTED
                            message: null
                          voiceStatus: 3
                          uid: 3c92283c-6145-4a43-8a62-0c15fd712021
                          createdDate: July 06, 2026
                          lastUpdatedDate: July 06, 2026
                          updatedAt: 2026-07-06T18:33:29.664Z
                          placeActionLinks:
                            - placeActionType: FOOD_ORDERING
                              uri: https://order.example.com
                              isPreferred: true
                              name: locations/1944.../placeActionLinks/54ada85bc246058a
                              submissionStatus: success
                              submissionMessage: Already up to date on Google.
                              lastSubmittedAt: 2026-07-08T12:14:36Z
                          discoveredPlaceActionLinks:
                            - placeActionType: APPOINTMENT
                              uri: https://book.example.com
                              isPreferred: false
                              name: locations/1944.../placeActionLinks/abc123
                              providerType: MERCHANT
                              isEditable: true
                    pageInfo:
                      hasNextPage: false
                      hasPreviousPage: false
                      endCursor: TG9jYXRpb246MTgwMDI4OQ==
                      total: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a cursor-paginated list of locations in your account.
    post:
      operationId: createLocation
      summary: Create a new location.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CreateLocationPayload"
              example:
                data:
                  createLocation:
                    clientMutationId: null
                    success: true
                    errors: null
                    location:
                      id: TG9jYXRpb246MTgwMDI5MA==
                      databaseId: 1800290
                      storeId: ACME01
                      name: Acme Dental
                      street: 123 Jump Street
                      city: New York
                      stateIso: NY
                      postalCode: "10013"
                      countryIso: US
                      phone: "6443859313"
                      status: PENDING
                      primaryGbpSiteCategoryId: null
                      tags: []
                      folders:
                        - id: d90630a7-7af0-450f-bdfe-6457eb438b1f
                          name: root
                          root: true
                      placeActionLinks:
                        - placeActionType: APPOINTMENT
                          uri: https://book.acmedental.example.com
                          isPreferred: true
                          name: null
                          submissionStatus: null
                        - placeActionType: ONLINE_APPOINTMENT
                          uri: https://virtual.acmedental.example.com
                          isPreferred: false
                          name: null
                          submissionStatus: null
                      discoveredPlaceActionLinks: []
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/CreateLocationInput"
              required:
                - input
            example:
              input:
                name: Acme Dental
                description: Acme Dental is a family-owned dental practice in downtown New York
                  offering preventive care, cosmetic dentistry, orthodontics,
                  and emergency appointments. Our board-certified team combines
                  modern equipment with a gentle, patient-first approach, and
                  same-week appointments are available for new patients.
                storeId: ACME01
                street: 123 Jump Street
                city: New York
                stateIso: NY
                postalCode: "10013"
                countryIso: US
                phone: "6443859313"
                subCategoryId: 1432
                folderIds:
                  - d90630a7-7af0-450f-bdfe-6457eb438b1f
                businessHours:
                  - day: MONDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: TUESDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: WEDNESDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: THURSDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: FRIDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: SATURDAY
                    type: OPEN
                    slots:
                      - start: 10:00am
                        end: 02:00pm
                  - day: SUNDAY
                    type: CLOSED
                    slots: []
                placeActionLinks:
                  - placeActionType: APPOINTMENT
                    uri: https://book.acmedental.example.com
                    isPreferred: true
                  - placeActionType: ONLINE_APPOINTMENT
                    uri: https://virtual.acmedental.example.com
      description: Creates a new business location in your account and queues it for
        listing submission.
  /api/v4/locations/search:
    get:
      operationId: searchLocations
      summary: Search for locations.
      tags:
        - Locations
      parameters:
        - name: query
          in: query
          required: false
          schema:
            type: string
          description: Search keyword matched against location name, street address, city,
            and store ID. Omit to page through every location.
        - name: filter
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded filter object to narrow results (for example by folder
            or approval status).
        - name: first
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting forward from the start of the
            result set.
        - name: after
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page forward from. Pass `pageInfo.endCursor`, or
            equivalently the `cursor` of the last edge in the previous page.
            Stop paging when `pageInfo.hasNextPage` is false, or when a page
            returns an empty `edges` array.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                required:
                  - edges
                  - pageInfo
                properties:
                  edges:
                    type: array
                    items:
                      type: object
                      required:
                        - node
                        - cursor
                      properties:
                        node:
                          $ref: "#/components/schemas/LocationSummaryConnectionType"
                        cursor:
                          type: string
                  pageInfo:
                    type: object
                    required:
                      - hasNextPage
                      - hasPreviousPage
                    properties:
                      hasNextPage:
                        type: boolean
                      hasPreviousPage:
                        type: boolean
                      endCursor:
                        type:
                          - string
                          - "null"
                      total:
                        type:
                          - integer
                          - "null"
                  totalCount:
                    type: integer
              example:
                data:
                  searchLocations:
                    edges:
                      - cursor: TG9jYXRpb246MTgwMDI4OQ==
                        node:
                          accountId: 62670
                          accountName: owner@brightsmile-dental.com
                          addOns: []
                          additionalCategoryIds: []
                          additionalCategoryNames: []
                          additionalGbpSiteCategoryIds: []
                          additionalGbpSiteCategoryNames: []
                          additionalInfo: null
                          additionalPhones: []
                          aiAnalyticsEnabled: false
                          approved: APPROVED
                          archivalScheduledAt: null
                          archived: false
                          archivedAt: null
                          bizUrl: null
                          bizUrlUtm: false
                          bookingUrl: null
                          businessHours: []
                          cancellationScheduledAt: null
                          categoryId: 15
                          city: Austin
                          clientName: owner@brightsmile-dental.com
                          contentPreferredLanguage: ENGLISH
                          countryCode: "1"
                          countryIso: US
                          createErrors: []
                          createdDate: July 06, 2026
                          customAttributes: []
                          databaseId: 1800289
                          defaultAgencyTag: ownerbrightsmiledentalcom
                          description: This is a standalone duplex house. A comfortable, private residence
                            located in the Bouldin Creek neighborhood of Austin.
                          discoveredPlaceActionLinks: []
                          enabledSiteIds: []
                          facebookUrl: null
                          folderId: d90630a7-7af0-450f-bdfe-6457eb438b1f
                          folderName: root
                          franchise: false
                          googleAdsPhone: null
                          googleVerificationStatus:
                            message: null
                            status: NOT_CONNECTED
                          googleplusUrl: null
                          hideAddress: false
                          id: TG9jYXRpb246MTgwMDI4OQ==
                          instagramUrl: null
                          isRestaurant: true
                          lastUpdatedDate: July 06, 2026
                          latitude: "30.2711286"
                          linkedinUrl: null
                          locationPhotos: []
                          longitude: "-97.7436995"
                          managedServiceSiteBuckets: []
                          managedServiceSites: []
                          moreHours: []
                          name: Jenny Home
                          offeringsUrl: null
                          ownerEmail: null
                          ownerName: null
                          package: PREMIUM
                          paymentMethods: []
                          phone: "5125550142"
                          pinterestUrl: null
                          placeActionLinks: []
                          planId: 3797
                          planName: Launch
                          postalCode: "78701"
                          primaryGbpSiteCategoryId: null
                          primaryGbpSiteCategoryName: null
                          publisherAttributes: []
                          reservationUrl: null
                          serviceArea: null
                          serviceItems: []
                          stateIso: TX
                          stateName: Texas
                          storeId: null
                          street: 600 Congress Ave, Suite 200
                          street1: null
                          subCategoryId: 1432
                          subCategoryName: Restaurants
                          tagline: null
                          tags:
                            - all
                          temporarilyClosed: false
                          tiktokUrl: null
                          toplineMessage: null
                          twitterUrl: null
                          uid: 3c92283c-6145-4a43-8a62-0c15fd712021
                          updatedAt: 2026-07-06T18:33:29.664Z
                          videos: []
                          voiceStatus: 3
                          yearOfIncorporation: null
                          youtubeUrl: null
                    pageInfo:
                      endCursor: TG9jYXRpb246MTgwMDI4OQ==
                      hasNextPage: false
                      hasPreviousPage: false
                      total: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a cursor-paginated list of locations matching a keyword,
        searchable by name, address, or store ID.
  /api/v4/locations-by-ids:
    get:
      operationId: getLocationsByIds
      summary: Fetch location info via cursor ids.
      tags:
        - Locations
      parameters:
        - name: locationIds
          in: query
          required: true
          schema:
            type: string
            description: JSON-encoded filter object
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/LocationSummaryType"
              example:
                data:
                  getLocationsByIds:
                    - id: TG9jYXRpb246MTgwMDI4OQ==
                      databaseId: 1800289
                      accountId: 62670
                      storeId: null
                      name: Jenny Home
                      archived: false
                      archivedAt: null
                      street: 600 Congress Ave, Suite 200
                      city: Austin
                      stateIso: TX
                      postalCode: "78701"
                      countryIso: US
                      countryCode: "1"
                      latitude: "30.2711286"
                      longitude: "-97.7436995"
                      phone: "5125550142"
                      additionalPhones: []
                      bizUrl: null
                      hideAddress: false
                      categoryId: 15
                      subCategoryId: 1432
                      subCategoryName: Restaurants
                      additionalCategoryIds: []
                      description: This is a standalone duplex house. A comfortable, private residence
                        located in the Bouldin Creek neighborhood of Austin,
                        offering spacious duplex living with easy access to the
                        surrounding South Congress area and downtown Austin.
                      contentPreferredLanguage: ENGLISH
                      businessHours: []
                      moreHours: []
                      package: PREMIUM
                      planId: 3797
                      planName: Launch
                      folderId: d90630a7-7af0-450f-bdfe-6457eb438b1f
                      folderName: root
                      tags:
                        - all
                      temporarilyClosed: false
                      ownerName: null
                      ownerEmail: null
                      paymentMethods: []
                      locationPhotos: []
                      isRestaurant: true
                      voiceStatus: 3
                      yearOfIncorporation: null
                      placeActionLinks:
                        - placeActionType: FOOD_ORDERING
                          uri: https://order.example.com
                          isPreferred: true
                          name: locations/1944.../placeActionLinks/54ada85bc246058a
                          submissionStatus: success
                          submissionMessage: Already up to date on Google.
                          lastSubmittedAt: 2026-07-08T12:14:36Z
                      discoveredPlaceActionLinks:
                        - placeActionType: APPOINTMENT
                          uri: https://book.example.com
                          isPreferred: false
                          name: locations/1944.../placeActionLinks/abc123
                          providerType: MERCHANT
                          isEditable: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns full location information for a specified set of location
        IDs in one request.
  /api/v4/locations/update:
    post:
      operationId: updateLocation
      summary: Update information on a location.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/UpdateLocationPayload"
              example:
                data:
                  updateLocation:
                    clientMutationId: null
                    success: true
                    errors: null
                    location:
                      id: TG9jYXRpb246MTgwMDI4OQ==
                      databaseId: 1800289
                      name: Jenny Home
                      street: 600 Congress Ave, Suite 200
                      city: Austin
                      stateIso: TX
                      countryIso: US
                      postalCode: "78701"
                      phone: "5125550199"
                      storeId: null
                      status: APPROVED
                      placeActionLinks:
                        - placeActionType: FOOD_ORDERING
                          uri: https://order.example.com
                          isPreferred: true
                          name: null
                          submissionStatus: null
                      discoveredPlaceActionLinks: []
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/UpdateLocationInput"
              required:
                - input
            example:
              input:
                id: TG9jYXRpb246MTgwMDI4OQ==
                phone: "5125550199"
                businessHours:
                  - day: MONDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: TUESDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: WEDNESDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: THURSDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: FRIDAY
                    type: OPEN
                    slots:
                      - start: 09:00am
                        end: 05:00pm
                  - day: SATURDAY
                    type: OPEN
                    slots:
                      - start: 10:00am
                        end: 02:00pm
                  - day: SUNDAY
                    type: CLOSED
                    slots: []
      description: Updates writable fields on an existing location. Only the fields
        you send are changed.
  /api/v4/locations/photos:
    post:
      operationId: addLocationPhotos
      summary: Add photos for a location.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/AddLocationPhotosPayload"
              example:
                data:
                  addLocationPhotos:
                    clientMutationId: null
                    photos:
                      - id: TWVkaWFGaWxlOjU4Nzg5MzE=
                        url: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/f47d62a6.png
                        caption: null
                        starred: false
                      - id: TWVkaWFGaWxlOjU4Nzg5MzI=
                        url: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/ef4ffb12.jpg
                        caption: null
                        starred: false
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/AddLocationPhotosInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                photos:
                  - photo: https://cdn.example.com/jenny-home/logo.png
                  - photo: https://cdn.example.com/jenny-home/storefront.jpg
      description: Attaches media to a location, either by public image URL or by
        referencing files already in your media library.
  /api/v4/locations/photos/remove:
    post:
      operationId: removeLocationPhotos
      summary: Remove photos from a location.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RemoveLocationPhotosPayload"
              example:
                data:
                  removeLocationPhotos:
                    clientMutationId: null
                    removedCount: 1
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/RemoveLocationPhotosInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                photoIds:
                  - TWVkaWFGaWxlOjU4Nzg5MzI=
      description: Detaches one or more media files from a location by their media IDs.
  /api/v4/locations/photos/star:
    post:
      operationId: starLocationPhotos
      summary: Mark photos as favourite.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/StarLocationPhotosPayload"
              example:
                data:
                  starLocationPhotos:
                    clientMutationId: null
                    photos:
                      - id: TWVkaWFGaWxlOjU4Nzg5MzI=
                        url: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/ef4ffb12.jpg
                        caption: null
                        starred: true
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/StarLocationPhotosInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                photoIds:
                  - TWVkaWFGaWxlOjU4Nzg5MzI=
                starred: true
      description: Marks one or more of a location's additional photos as favourites
        for priority placement on supported publishers.
  /api/v4/locations/archive:
    post:
      operationId: archiveLocations
      summary: Archive locations.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ArchiveLocationsPayload"
              example:
                data:
                  archiveLocations:
                    clientMutationId: null
                    bulkEditTaskId: null
                    errors: null
                    success: null
                    result:
                      - locationId: TG9jYXRpb246MTgwMDI4OQ==
                        status: ARCHIVE_SCHEDULED
                        success: true
                        errors: null
                      - locationId: TG9jYXRpb246MTgwMDI5MA==
                        status: ARCHIVE_SCHEDULED
                        success: true
                        errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/ArchiveLocationsInput"
              required:
                - input
            example:
              input:
                locationIds:
                  - TG9jYXRpb246MTgwMDI4OQ==
                  - TG9jYXRpb246MTgwMDI5MA==
      description: Schedules one or more locations for archival at the end of the
        current billing cycle.
  /api/v4/locations/cancel_archive:
    post:
      operationId: cancelLocationsArchive
      summary: Cancel archival of locations.
      tags:
        - Locations
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/CancelLocationsArchivePayload"
              example:
                data:
                  cancelLocationsArchive:
                    clientMutationId: null
                    bulkEditTaskId: null
                    errors: null
                    success: null
                    result:
                      - locationId: TG9jYXRpb246MTgwMDI4OQ==
                        status: ACTIVE
                        success: true
                        errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/CancelLocationsArchiveInput"
              required:
                - input
            example:
              input:
                locationIds:
                  - TG9jYXRpb246MTgwMDI4OQ==
      description: Cancels a pending archival for locations in ARCHIVE_SCHEDULED
        status, restoring them to active.
  /api/v4/posts/{postId}:
    get:
      operationId: socialPostView
      summary: Individual social post view page.
      tags:
        - Posts
      parameters:
        - name: postId
          in: path
          required: true
          schema:
            type: string
          description: Base64-encoded social post ID (e.g. from the `id` field of a posts
            list, or the `socialPost.id` returned by POST /posts).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SocialPostView"
              example:
                data:
                  socialPostView:
                    socialPostId: U29jaWFsUG9zdDo0NDEyMg==
                    socialPostInfo:
                      id: U29jaWFsUG9zdDo0NDEyMg==
                      name: Summer Hours Update
                      status: SUCCESS
                      type: ANNOUNCEMENT
                      createdAt: 2026-06-28
                      scheduledStartDate: 2026-06-28
                      scheduledEndDate: 2026-07-28
                      views: 128
                      clicks: 14
                      shares: 0
                      reactions: 3
                      comments: 1
                      sites:
                        - GOOGLE
                      message:
                        - site: GOOGLE
                          message: We have extended our summer hours! Open until 9pm on weekdays.
                      cta:
                        - type:
                            value: LEARN_MORE
                            label: Learn more
                          url: https://jennyhome.example/hours
                          site: GOOGLE
                          tinyUrl: https://tiny.cc/jh-hours
                      contextInfo: null
                      mediaUrl:
                        - url: https://cdn.listingsapi.com/posts/44122/summer.jpg
                          site: GOOGLE
                          type: IMAGE
                      publishDetails:
                        - site: GOOGLE
                          status: PUBLISHED
                          createdDate: 2026-06-28
                          publishedDate: 2026-06-28
                          submissionError: null
                      postLinks:
                        - site: GOOGLE
                          link: https://www.google.com/maps/place/?post=44122
                      locationIds:
                        - 1800289
                    publishedLocationsCount: 1
                    socialPostAnalyticsBySite:
                      - site: GOOGLE
                        views: 128
                        clicks: 14
                        reactions: 3
                        shares: 0
                        comments: 1
                    socialPostAnalyticsByLocationId:
                      - locationId: 1800289
                        siteStats:
                          - site: GOOGLE
                            status: PUBLISHED
                            views: 128
                            clicks: 14
                            reactions: 3
                            shares: 0
                            comments: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a single social post campaign with its content, per-site
        publish status, and engagement analytics.
    delete:
      operationId: deleteSocialPost
      summary: Delete a social post.
      tags:
        - Posts
      parameters:
        - name: postId
          in: path
          required: true
          schema:
            type: string
          description: Base64-encoded social post ID to delete (the `id` from a posts list
            or the create response).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteSocialPostMutation"
              example:
                data:
                  deleteSocialPost:
                    success: true
                    socialPostId: U29jaWFsUG9zdDo0NDEyMg==
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                clientMutationId:
                  type: string
            example:
              clientMutationId: delete-44122-req-1
      description: Permanently deletes a social post campaign and removes it from
        every site it was published to.
  /api/v4/posts:
    post:
      operationId: createSocialPost
      summary: Create social posts for multiple locations.
      tags:
        - Posts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SocialPostMutation"
              example:
                data:
                  createSocialPost:
                    clientMutationId: null
                    success: true
                    errors: []
                    socialPost:
                      id: U29jaWFsUG9zdDo0NDEyMg==
                      name: Grand Opening Announcement
                      status: INPROGRESS
                      type: ANNOUNCEMENT
                      createdAt: 2026-06-28
                      sites:
                        - GOOGLE
                      message:
                        - site: GOOGLE
                          message: We are now open! Visit Jenny Home this week for our grand opening.
                      cta:
                        - type:
                            value: LEARN_MORE
                            label: Learn more
                          url: https://jennyhome.example/opening
                          site: GOOGLE
                          tinyUrl: null
                      contextInfo: null
                      mediaUrl:
                        - url: https://cdn.example.com/opening.jpg
                          site: GOOGLE
                          type: IMAGE
                      publishDetails:
                        - site: GOOGLE
                          status: PUBLISHING
                          createdDate: 2026-06-28
                          submissionError: null
                      postLinks: []
                      locationIds:
                        - 1800289
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/CreateSocialPostMutationInput"
              required:
                - input
            example:
              input:
                postName: Grand Opening Announcement
                locationIds:
                  - TG9jYXRpb246MTgwMDI4OQ==
                postType: ANNOUNCEMENT
                postSites:
                  - GOOGLE
                postMessage:
                  - site: GOOGLE
                    message: We are now open! Visit Jenny Home this week for our grand opening.
                postCta:
                  - site: GOOGLE
                    type: LEARN_MORE
                    url: https://jennyhome.example/opening
                postMediaUrl:
                  - site: GOOGLE
                    url: https://cdn.example.com/opening.jpg
                    type: IMAGE
      description: Creates an ANNOUNCEMENT social post and publishes it to the chosen
        sites for one or more locations.
  /api/v4/locations/{locationId}/reviews:
    get:
      operationId: interactions
      summary: Paginated list of interactions (reviews / Q&A / social) for a single
        location, with filters.
      tags:
        - Reviews
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Location ID, a raw numeric database ID (e.g. `1800289`) or its
            Base64-encoded Relay ID (e.g. `TG9jYXRpb246MTgwMDI4OQ==`).
        - name: tag
          in: query
          required: false
          schema:
            type: string
          description: Filter by a location tag.
        - name: siteUrls
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of publisher hostnames to include, e.g.
            `["maps.google.com","yelp.com"]`.
        - name: startDate
          in: query
          required: false
          schema:
            type: string
          description: Start of the date-range filter (YYYY-MM-DD).
        - name: searchString
          in: query
          required: false
          schema:
            type: string
          description: Full-text search across interaction content.
        - name: endDate
          in: query
          required: false
          schema:
            type: string
          description: End of the date-range filter (YYYY-MM-DD).
        - name: category
          in: query
          required: false
          schema:
            type: string
          description: Single interaction category, e.g. `REVIEW`.
        - name: categories
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of interaction categories.
        - name: ratingFilters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of star ratings to include, e.g. `[3,4]`.
        - name: ratingFilter
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Single star rating to filter by.
        - name: responseStatus
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: "JSON-encoded response-status filter. Values: `RESPONDED`,
            `PENDING`."
        - name: sortOrder
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: "JSON-encoded sort order. Values: `NEWEST_FIRST`, `OLDEST_FIRST`,
            `LAST_RESPONDED`."
        - name: first
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting forward from the start of the
            result set.
        - name: after
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page forward from. Pass `pageInfo.endCursor`, or
            equivalently the `cursor` of the last edge in the previous page.
            Stop paging when `pageInfo.hasNextPage` is false, or when a page
            returns an empty `edges` array.
        - name: last
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting backward from the end of the
            result set.
        - name: before
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page backward from, used with `last`. Pass the `cursor`
            of the first edge of the page you are moving back from — the
            gateway's shared `PageInfo` type exposes no `startCursor` field.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                required:
                  - edges
                  - pageInfo
                properties:
                  edges:
                    type: array
                    items:
                      type: object
                      required:
                        - node
                        - cursor
                      properties:
                        node:
                          $ref: "#/components/schemas/InteractionConnection"
                        cursor:
                          type: string
                  pageInfo:
                    type: object
                    required:
                      - hasNextPage
                      - hasPreviousPage
                    properties:
                      hasNextPage:
                        type: boolean
                      hasPreviousPage:
                        type: boolean
                      endCursor:
                        type:
                          - string
                          - "null"
                      total:
                        type:
                          - integer
                          - "null"
                  totalCount:
                    type: integer
              example:
                data:
                  interactions:
                    pageInfo:
                      hasNextPage: true
                      hasPreviousPage: false
                      endCursor: SW50ZXJhY3Rpb246MV8xNTU0MjQzMDczMDM2LTllMjZkMmE4LWE2ZWQtNDJlYS04NDU0LTQ3ZDFjOTJlYTg0MQ==
                    edges:
                      - node:
                          id: 9e26d2a8-a6ed-42ea-8454-47d1c92ea841
                          source: maps.google.com
                          content: nice place for family together
                          authorName: vaibhav nakate
                          rating: 5
                          date: 2019-04-02T22:11:13.036997+00:00
                          category: Review
                          type: Review
                          responded: false
                          responseCount: 0
                          canRespond: true
                          permalink: https://maps.google.com/maps?cid=...
                        cursor: SW50ZXJhY3Rpb246MV8xNTU0MjQzMDczMDM2LTllMjZkMmE4LWE2ZWQtNDJlYS04NDU0LTQ3ZDFjOTJlYTg0MQ==
                    totalCount: 425
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a cursor-paginated list of reviews and social interactions
        for a single location, with filters.
  /api/v4/rollup_interactions:
    get:
      operationId: rollupInteractions
      summary: Paginated list of interactions across many locations (rollup scope).
      tags:
        - Reviews
      parameters:
        - name: tag
          in: query
          required: false
          schema:
            type: string
          description: Location tag defining the rollup scope. Required, the request
            returns 400 without it. Use `all` to span every location.
        - name: locationFilters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of location IDs to restrict the rollup to.
        - name: siteUrls
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of publisher hostnames to include.
        - name: startDate
          in: query
          required: false
          schema:
            type: string
          description: Start of the date-range filter (YYYY-MM-DD).
        - name: endDate
          in: query
          required: false
          schema:
            type: string
          description: End of the date-range filter (YYYY-MM-DD).
        - name: searchString
          in: query
          required: false
          schema:
            type: string
          description: Full-text search across interaction content.
        - name: category
          in: query
          required: false
          schema:
            type: string
          description: Single interaction category, e.g. `REVIEW`.
        - name: categories
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of interaction categories.
        - name: ratingFilters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of star ratings to include, e.g. `[3,4]`.
        - name: ratingFilter
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Single star rating to filter by.
        - name: responseStatus
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: "JSON-encoded response-status filter. Values: `RESPONDED`,
            `PENDING`."
        - name: sortOrder
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: "JSON-encoded sort order. Values: `NEWEST_FIRST`, `OLDEST_FIRST`,
            `LAST_RESPONDED`."
        - name: first
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting forward from the start of the
            result set.
        - name: after
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page forward from. Pass `pageInfo.endCursor`, or
            equivalently the `cursor` of the last edge in the previous page.
            Stop paging when `pageInfo.hasNextPage` is false, or when a page
            returns an empty `edges` array.
        - name: last
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records to return, counting backward from the end of the
            result set.
        - name: before
          in: query
          required: false
          schema:
            type: string
          description: Cursor to page backward from, used with `last`. Pass the `cursor`
            of the first edge of the page you are moving back from — the
            gateway's shared `PageInfo` type exposes no `startCursor` field.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: object
                required:
                  - edges
                  - pageInfo
                properties:
                  edges:
                    type: array
                    items:
                      type: object
                      required:
                        - node
                        - cursor
                      properties:
                        node:
                          $ref: "#/components/schemas/InteractionConnection"
                        cursor:
                          type: string
                  pageInfo:
                    type: object
                    required:
                      - hasNextPage
                      - hasPreviousPage
                    properties:
                      hasNextPage:
                        type: boolean
                      hasPreviousPage:
                        type: boolean
                      endCursor:
                        type:
                          - string
                          - "null"
                      total:
                        type:
                          - integer
                          - "null"
                  totalCount:
                    type: integer
              example:
                data:
                  rollupInteractions:
                    pageInfo:
                      hasNextPage: true
                      hasPreviousPage: false
                    edges:
                      - node:
                          id: 9e26d2a8-a6ed-42ea-8454-47d1c92ea841
                          source: maps.google.com
                          content: Excellent service, highly recommend.
                          authorName: Priya S.
                          rating: 5
                          date: 2026-06-30T12:04:11+00:00
                          category: Review
                          type: Review
                          responded: false
                          responseCount: 0
                          canRespond: true
                          locationId: 1800289
                        cursor: SW50ZXJhY3Rpb246OWUyNmQyYTg=
                    totalCount: 1284
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a cursor-paginated list of interactions across many
        locations in the account, with filtering and sorting.
  /api/v4/reviewDetails:
    get:
      operationId: interactionDetails
      summary: Fetch full interaction records by ID.
      tags:
        - Reviews
      parameters:
        - name: interactionIds
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of interaction IDs to fetch, e.g.
            `["b2fa765e-c62b-4e0b-b1d6-1c67c855f5e0"]`. Passed as a URL-encoded
            JSON string.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InteractionsDetail"
              example:
                data:
                  interactionDetails:
                    interactions:
                      - id: b2fa765e-c62b-4e0b-b1d6-1c67c855f5e0
                        source: maps.google.com
                        content: Great place for dessert!
                        authorName: Jordan M.
                        category: Review
                        type: Review
                        rating: 5
                        date: 2026-05-12T09:22:41+00:00
                        responded: true
                        responseCount: 1
                        canRespond: true
                        responses:
                          - id: 2090753a-ece6-4837-8336-8494ad308523
                            content: Thank you so much for the kind words!
                            authorName: Jenny Home
                            date: 2026-05-13T14:02:00+00:00
                            interactionStatus: CONFIRMED
                            editedResponse: false
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns full interaction objects for a specific set of interaction IDs.
  /api/v4/locations/{locationId}/reviews/settings:
    get:
      operationId: interactionsSetting
      summary: Per-location interactions settings (connected sites, thresholds).
      tags:
        - Reviews
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Location to read. Accepts a base64-encoded Relay ID (e.g.
            `TG9jYXRpb246MTgwMDI4OQ==`) or a raw numeric location ID.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InteractionsSetting"
              example:
                data:
                  interactionsSetting:
                    siteSettings:
                      - name: maps.google.com
                        url: null
                      - name: facebook.com
                        url: null
                      - name: yelp.com
                        url: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the review sources configured for a single location, with
        their connection URLs.
  /api/v4/locations/{locationId}/review-analytics-overview:
    get:
      operationId: interactionsAnalyticsStats
      summary: Analytics KPIs for a single location over a date range.
      tags:
        - Reviews
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Location ID, a raw numeric database ID (e.g. `1800289`) or its
            Base64-encoded Relay ID (e.g. `TG9jYXRpb246MTgwMDI4OQ==`).
        - name: startDate
          in: query
          required: false
          schema:
            type: string
            format: date
          description: Start of the analytics period (YYYY-MM-DD). Required for the
            `review-analytics-timeline` route.
        - name: endDate
          in: query
          required: false
          schema:
            type: string
            format: date
          description: End of the analytics period (YYYY-MM-DD). Required for the
            `review-analytics-timeline` route.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/InteractionsAnalyticsStats"
              example:
                data:
                  interactionsAnalyticsStats:
                    stats:
                      - name: total-reviews
                        value: 9705423
                        delta: 100
                      - name: new-reviews
                        value: 9705423
                        delta: 100
                      - name: overall-rating
                        value: 4.432533457738633
                        delta: 100
                      - name: review-response-rate
                        value: 47.39994331004429
                        delta: 100
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns overview review analytics (KPIs) for a location. Two
        sibling routes return a time-series timeline and a per-site breakdown.
  /api/v4/reviews/site-config:
    get:
      operationId: interactionSiteConfig
      summary: Per-site metadata (colors, icons, plan support).
      tags:
        - Reviews
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/InteractionSiteConfig"
              example:
                data:
                  interactionSiteConfig:
                    - site: Google
                      siteUrl: maps.google.com
                    - site: Facebook
                      siteUrl: facebook.com
                    - site: Yelp
                      siteUrl: yelp.com
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the review platforms available to the account. Google Maps
        and Facebook are available on every plan, Yelp on Growth and Enterprise.
  /api/v4/locations/reviews/respond:
    post:
      operationId: respondToInteraction
      summary: Post a response to a review / Q&A / social interaction on the source
        site.
      tags:
        - Reviews
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/RespondToInteractionPayload"
              example:
                data:
                  respondToInteraction:
                    interaction:
                      id: 2090753a-ece6-4837-8336-8494ad308523
                      interactionId: 9e26d2a8-a6ed-42ea-8454-47d1c92ea841
                      content: "Thank you for visiting Jenny Home: we're glad you enjoyed your
                        experience!"
                      interactionStatus: CREATED
                      editedResponse: false
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                responseContent:
                  type: string
                interactionId:
                  oneOf:
                    - type: integer
                      description: Raw numeric ID
                    - type: string
                      description: Base64-encoded Relay ID
                  format: base64-or-int
                respondedWith:
                  type: string
              required:
                - responseContent
                - interactionId
            example:
              interactionId: 9e26d2a8-a6ed-42ea-8454-47d1c92ea841
              responseContent: "Thank you for visiting Jenny Home: we're glad you enjoyed your
                experience!"
      description: >-
        Posts a public response to a review or interaction on its source
        platform.


        **Common errors**

        - SY50121: Google Reviews accept only a single owner reply per review; a
        second response is rejected.
  /api/v4/locations/{locationId}/facebook-analytics:
    get:
      operationId: facebookInsights
      summary: Facebook v4 metrics for a single location over a date range.
      tags:
        - Analytics
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Base64-encoded location ID (Relay id, e.g.
            TG9jYXRpb246MTgwMDI4OQ==). The raw numeric id is not accepted here.
        - name: fromDate
          in: query
          required: false
          schema:
            type: string
          description: Start of the range (YYYY-MM-DD). Defaults to a recent window when
            omitted.
        - name: toDate
          in: query
          required: false
          schema:
            type: string
          description: End of the range (YYYY-MM-DD).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/FacebookMetricV4"
              example:
                data:
                  facebookInsights:
                    views:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 120
                    ctaAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 5
                    directionsAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 3
                    phoneAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 2
                    websiteAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 9
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns daily Facebook Page interaction metrics for a location over
        a date range.
  /api/v4/locations/{locationId}/google-analytics:
    get:
      operationId: googleInsights
      summary: Google My Business v4 metrics for a single location over a date range.
      tags:
        - Analytics
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Base64-encoded location ID (Relay id, e.g.
            TG9jYXRpb246MTgwMDI4OQ==). The raw numeric id is not accepted here.
        - name: fromDate
          in: query
          required: false
          schema:
            type: string
          description: Start of the range (YYYY-MM-DD). Defaults to a recent window when
            omitted.
        - name: toDate
          in: query
          required: false
          schema:
            type: string
          description: End of the range (YYYY-MM-DD).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/GoogleMetricV4"
              example:
                data:
                  googleInsights:
                    total:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 412
                      - startTime: 2025-06-02T00:00:00+00:00
                        value: 388
                    search:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 300
                    maps:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 112
                    directionsAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 24
                    phoneAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 8
                    websiteAction:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 41
                    businessBookings:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 0
                    businessFoodOrders:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 0
                    businessFoodMenuClicks:
                      - startTime: 2025-06-01T00:00:00+00:00
                        value: 0
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns daily Google Business Profile interaction metrics for a
        location over a date range.
  /api/v4/locations/{locationId}/bing-analytics:
    get:
      operationId: bingInsights
      summary: Bing Places v4 metrics for a single location over a date range.
      tags:
        - Analytics
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Base64-encoded location ID (Relay id, e.g.
            TG9jYXRpb246MTgwMDI4OQ==). The raw numeric id is not accepted here.
        - name: fromDate
          in: query
          required: false
          schema:
            type: string
          description: Start of the range (YYYY-MM-DD). Defaults to a recent window when
            omitted.
        - name: toDate
          in: query
          required: false
          schema:
            type: string
          description: End of the range (YYYY-MM-DD).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BingMetricV4"
              example:
                data:
                  bingInsights:
                    views:
                      - startTime: 2025-06-02T00:00:00+00:00
                        value: 73
                      - startTime: 2025-06-09T00:00:00+00:00
                        value: 58
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns weekly Bing Places profile view metrics for a location over
        a date range.
  /api/v4/connected-accounts:
    get:
      operationId: connectedAccountsInfo
      summary: connectedAccountsInfo
      tags:
        - Connected Accounts
      parameters:
        - name: accountId
          in: query
          required: false
          schema:
            type: string
          description: Listings API account ID to scope results to. Defaults to the
            account that owns the API key.
        - name: filters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded object used to narrow the result set (for example by
            connection status or account type).
        - name: sort
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded object describing the sort order to apply to the
            records.
        - name: pageInfo
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded pagination object, e.g. `{"page":1,"perPage":20}`.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectedAccountsPaginated"
              example:
                data:
                  connectedAccountsInfo:
                    pageInfo:
                      hasNextPage: false
                      hasPreviousPage: false
                      totalPages: 1
                      totalRecords: 1
                    records:
                      - accountId: "62670"
                        clientName: owner@brightsmile-dental.com
                        connectedAccountId: 4f712c17-4f95-42dd-90f4-97171a2e67b5
                        connectedAccountType: GoogleAccount
                        connectedLocationsCount: 0
                        connectivityIssue: null
                        email: owner@brightsmile-dental.com
                        lastFetchMatchesRequestedAt: 2026-07-06 21:43:07 UTC
                        remarks: null
                        requestMatches: false
                        requestMatchesStatus: MATCH_COMPLETED
                        status: CONNECTED
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the Google and Facebook accounts connected to your Listings
        API account, with connection health and linked-location counts.
  /api/v4/connected-accounts/{connectedAccountId}/details:
    get:
      operationId: connectedAccountDetails
      summary: connectedAccountDetails
      tags:
        - Connected Accounts
      parameters:
        - name: connectedAccountId
          in: path
          required: true
          schema:
            type: string
          description: UUID of the connected account (from the list connected accounts
            endpoint).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectedAccountDetails"
              example:
                data:
                  connectedAccountDetails:
                    details:
                      accountId: "62670"
                      clientName: owner@brightsmile-dental.com
                      connectedAccountId: 4f712c17-4f95-42dd-90f4-97171a2e67b5
                      connectedAccountType: GoogleAccount
                      connectedLocationsCount: 0
                      connectivityIssue: null
                      email: owner@brightsmile-dental.com
                      lastFetchMatchesRequestedAt: 2026-07-06 21:43:07 UTC
                      remarks: null
                      requestMatches: false
                      requestMatchesStatus: MATCH_COMPLETED
                      status: CONNECTED
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the details of a single connected Google or Facebook
        account by its ID.
  /api/v4/connected-accounts/connected-account-listings:
    post:
      operationId: connectedAccountListings
      summary: Listings belonging to a connected account.
      tags:
        - Connected Accounts
      parameters:
        - name: connectedAccountId
          in: query
          required: true
          schema:
            type: string
          description: UUID of the connected account whose listings to fetch.
        - name: filters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded object used to search within listings (for example by
            business name, address, phone, or postal code).
        - name: pageInfo
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded pagination object, e.g. `{"page":1,"perPage":20}`. Up
            to 500 records per page.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectedAccountListingsPaginated"
              example:
                data:
                  connectedAccountListings:
                    pageInfo:
                      hasNextPage: false
                      hasPreviousPage: false
                      totalPages: 1
                      totalRecords: 60
                    records:
                      - accountTypeName: Google
                        address: 123 William St, NY 10038, Manhattan, US
                        id: R21iQnVsa0RhdGFMYWtlOjA2MDQ4NmExLTA0NzQtNDc4NS1iMjNhLTBkOGM4MzhmNGQ5OA==
                        liveLink: null
                        locationName: Trial
                        phone: (718) 667-7787
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the Google Business Profile or Facebook listings accessible
        to a connected account, with optional filtering and pagination.
  /api/v4/connected-accounts/{connectedAccountId}/connection-suggestions:
    get:
      operationId: connectionSuggestionsForAccount
      summary: connectionSuggestionsForAccount
      tags:
        - Connected Accounts
      parameters:
        - name: connectedAccountId
          in: path
          required: true
          schema:
            type: string
          description: UUID of the connected account to list suggestions for.
        - name: accountId
          in: query
          required: false
          schema:
            type: string
          description: Listings API account ID to scope suggestions to. Defaults to the
            account the API key belongs to.
        - name: filters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded filter object to narrow the suggestions.
        - name: sortBy
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded sort object.
        - name: pageInfo
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded pagination object (page / perPage).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectionSuggestionsForAccount"
              example:
                data:
                  connectionSuggestionsForAccount:
                    pageInfo:
                      hasNextPage: false
                      hasPreviousPage: false
                      totalPages: 1
                      totalRecords: 2
                    records:
                      - accountEmail: contact@brightsmile-dental.com
                        accountType: GMB
                        connectedAccountId: 4f712c17-4f95-42dd-90f4-97171a2e67b5
                        locationId: "73415"
                        matchedDataDatabaseId: 0d5e306f-0da0-46e3-929f-fd3c67ccd8cc
                        locationInfo:
                          name: My Business
                          city: Lincoln
                          stateIso: NE
                        suggestedLocationInfo:
                          locationInfo:
                            name: My Business
                            city: Lincoln
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns suggested matches between Listings API locations and Google
        Business Profile or Facebook listings for a connected account.
  /api/v4/plan-sites:
    get:
      operationId: planSites
      summary: planSites
      tags:
        - Supporting APIs
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/PlanSite"
              example:
                data:
                  planSites:
                    - hideAddressSupportedCountries:
                        - US
                        - CA
                        - AU
                        - IN
                        - GB
                      id: 1
                      name: Google Maps
                      supportedCountries:
                        - US
                        - CA
                        - IN
                        - GB
                        - DE
                      url: maps.google.com
                    - hideAddressSupportedCountries:
                        - US
                        - CA
                        - AU
                        - IN
                        - GB
                      id: 184
                      name: Facebook
                      supportedCountries:
                        - US
                        - CA
                        - IN
                        - GB
                        - DE
                      url: facebook.com
                    - hideAddressSupportedCountries:
                        - US
                        - CA
                        - AU
                        - GB
                      id: 2
                      name: Yelp
                      supportedCountries:
                        - US
                        - CA
                        - GB
                        - DE
                        - FR
                      url: yelp.com
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns every publisher directory site included in the account's
        plan, with each site's ID, URL, and supported countries.
  /api/v4/connected-accounts/{connectedAccountId}/folders:
    get:
      operationId: getFoldersUnderGoogleAccount
      summary: getFoldersUnderGoogleAccount
      tags:
        - Connected Accounts
      parameters:
        - name: connectedAccountId
          in: path
          required: true
          schema:
            type: string
          description: UUID of the connected Google account (from the list connected
            accounts endpoint).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/GmbFolder"
              example:
                data:
                  getFoldersUnderGoogleAccount:
                    - folderId: accounts/104890024806530350198
                      folderName: Aniruddha Basu
                      locationCount: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the Google Business Profile folders (groups) accessible to
        a connected Google account.
  /api/v4/connected-accounts/connect-google:
    post:
      operationId: bulkConnectLinkForGoogle
      summary: bulkConnectLinkForGoogle
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectUrl"
              example:
                data:
                  bulkConnectLinkForGoogle:
                    errors: null
                    success: true
                    url: https://claim.verifymybiz.com/locations/redirect_oauth_bulk/google_oauth2?onboarding=false&platform=local&token=9009dc92-2b18-421f-b856-d157f3f06d6b
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/GoogleOauthBulkInput"
              required:
                - input
            example:
              input:
                successUrl: https://docs.listingsapi.com/docs/api/connected-accounts-trigger-matches
                errorUrl: https://docs.listingsapi.com/docs/api/connected-accounts-connect
      description: Returns an OAuth URL to link a Google Business Profile account to
        your Listings API account.
  /api/v4/connected-accounts/connect-facebook:
    post:
      operationId: bulkConnectLinkForFacebook
      summary: bulkConnectLinkForFacebook
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectUrl"
              example:
                data:
                  bulkConnectLinkForFacebook:
                    errors: null
                    success: true
                    url: https://claim.verifymybiz.com/locations/redirect_oauth_bulk/facebook?onboarding=false&platform=local&token=bfac8e06-8d72-4810-9c50-ae7ee12a7b52
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/FacebookOauthBulkInput"
              required:
                - input
            example:
              input:
                successUrl: https://docs.listingsapi.com/docs/api/connected-accounts-trigger-matches
                errorUrl: https://docs.listingsapi.com/docs/api/connected-accounts-connect-facebook
      description: Returns an OAuth URL to link a Facebook Pages account to your
        Listings API account.
  /api/v4/connected-accounts/trigger-matches:
    post:
      operationId: connectedAccountsTriggerMatches
      summary: connectedAccountsTriggerMatches
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectedAccountsTriggerMatchesResult"
              example:
                data:
                  connectedAccountsTriggerMatches:
                    failedIds: null
                    success: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/ConnectedAccountsTriggerMatchesInput"
              required:
                - input
            example:
              input:
                connectedAccountIds:
                  - 4f712c17-4f95-42dd-90f4-97171a2e67b5
      description: Fetches the Google and Facebook profiles for connected accounts and
        matches them against your Listings API locations.
  /api/v4/connected-accounts/confirm-matches:
    post:
      operationId: confirmConnectMatches
      summary: confirmConnectMatches
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConfirmConnectMatchesResult"
              example:
                data:
                  confirmConnectMatches:
                    failedIds: null
                    success: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/ConfirmConnectMatchesInput"
              required:
                - input
            example:
              input:
                matchRecordIds:
                  - 0d5e306f-0da0-46e3-929f-fd3c67ccd8cc
      description: Confirms suggested location-to-listing matches returned by the
        connection suggestions endpoint.
  /api/v4/connected-accounts/disconnect-google:
    post:
      operationId: gmbBulkDisconnect
      summary: gmbBulkDisconnect
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BulkDisconnectResult"
              example:
                data:
                  gmbBulkDisconnect:
                    success: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/BulkDisconnectLocationsInput"
              required:
                - input
            example:
              input:
                connectedAccountId: d2397854-52c2-41d7-95f1-b90cba16498d
      description: Disconnects a connected Google Business Profile account (or
        specific locations under it) from your Listings API account.
  /api/v4/connected-accounts/disconnect-facebook:
    post:
      operationId: fbBulkDisconnect
      summary: fbBulkDisconnect
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/BulkDisconnectResult"
              example:
                data:
                  fbBulkDisconnect:
                    success: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/FbBulkDisconnectLocationsInput"
              required:
                - input
            example:
              input:
                connectedAccountId: d2397854-52c2-41d7-95f1-b90cba16498d
      description: Disconnects a previously connected Facebook Pages account from your
        Listings API account.
  /api/v4/connected-accounts/connect-listing:
    post:
      operationId: connectListing
      summary: connectListing
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ConnectListingResult"
              example:
                data:
                  connectListing:
                    message: null
                    success: true
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/ConnectListingInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                connectedAccountId: 4f712c17-4f95-42dd-90f4-97171a2e67b5
                connectedAccountListingId: R29vZ2xlTG9jYXRpb246ODc3NTkzNGItNTA5OC00ZDBhLThiNDQ=
      description: Links a specific Google Business Profile or Facebook listing to a
        Listings API location.
  /api/v4/connected-accounts/create-location-from-listing:
    post:
      operationId: createLocationFromConnectedAccountListing
      summary: createLocationFromConnectedAccountListing
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LocationResult"
              example:
                data:
                  createLocationFromConnectedAccountListing:
                    success: true
                    locationId: 88277
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/CreateLocationFromListingInput"
              required:
                - input
            example:
              input:
                connectedAccountId: 4f712c17-4f95-42dd-90f4-97171a2e67b5
                connectedAccountListingId: R21iQnVsa0RhdGFMYWtlOjU3NzU5MzRiLTUwOTgtNGQwYS04YjQ0LTNjY2ZlZmZkZmUzNw==
      description: Creates a new Listings API location from an existing Google
        Business Profile or Facebook listing in a connected account.
  /api/v4/locations/create/gmb-listing:
    post:
      operationId: createGmbListingForLocation
      summary: createGmbListingForLocation
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MutationResult"
              example:
                data:
                  createGmbListingForLocation:
                    clientMutationId: null
                    success: true
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/CreateGmbListingForLocationInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                connectedAccountId: 4f712c17-4f95-42dd-90f4-97171a2e67b5
      description: Creates a new Google Business Profile listing for an existing
        Listings API location and links it to a connected Google account.
  /api/v4/locations/{locationId}/listings/duplicates:
    get:
      operationId: duplicateListingsForLocation
      summary: Get duplicate listings for the given location.
      tags:
        - Listings
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Location to read. Accepts a base64-encoded Relay ID (e.g.
            `TG9jYXRpb246MTgwMDI4OQ==`) or a raw numeric location ID.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/CustomSiteType"
              example:
                data:
                  duplicateListingsForLocation:
                    - id: U2l0ZToxNTA=
                      name: City Squares
                      url: citysquares.com
                      listings:
                        - id: RHVwbGljYXRlOjIzNTk4NDUw
                          listingItemId: TGlzdGluZ0l0ZW06MjM1OTg0NTA=
                          name: Woodbury Train Station
                          liveLink: http://citysquares.com/b/woodbury-train-station-23598450
                          status: POTENTIAL
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns duplicate listing entries detected for a single location,
        grouped by publisher site.
  /api/v4/locations/{locationId}/voice-assistants:
    get:
      operationId: voiceAssistantsForLocation
      summary: Get voice assistants for a location.
      tags:
        - Listings
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Location ID. Accepts either the base64-encoded node ID (e.g.
            `TG9jYXRpb246MTgwMDI4OQ==`) or the raw numeric database ID (e.g.
            `1800289`).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/VoiceAssistantType"
              example:
                data:
                  voiceAssistantsForLocation:
                    - databaseId: "104468723"
                      voiceIdentifier: GOOGLE_ASSISTANT
                      name: Google Assistant
                      connectedAccountId: null
                      syncStatus: REQUIRING_ACTION
                      actionRequired: true
                      syncIssue: null
                      errors: []
                    - databaseId: "104468711"
                      voiceIdentifier: SIRI
                      name: Siri
                      connectedAccountId: null
                      syncStatus: IN_PROGRESS
                      actionRequired: false
                      syncIssue: Google connection is required.
                      errors: []
                    - databaseId: "104468714"
                      voiceIdentifier: ALEXA
                      name: Alexa
                      connectedAccountId: null
                      syncStatus: IN_PROGRESS
                      actionRequired: false
                      syncIssue: null
                      errors: []
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the voice assistant listing sync status for a location
        across Google Assistant, Alexa, Siri, Cortana, and Bixby.
  /api/v4/locations/listings/duplicates:
    get:
      operationId: duplicateListingsRollup
      summary: Duplicate listing rollup for tag.
      tags:
        - Listings
      parameters:
        - name: tag
          in: query
          required: true
          schema:
            type: string
          description: Location tag to scope the rollup to. Use `all` to span every
            location in the account.
        - name: filters
          in: query
          required: true
          schema:
            type: string
            description: JSON-encoded filter object
          description: 'URL-encoded JSON filter object. Requires a `status`, one of
            `POTENTIAL`, `PROCESSING`, `FIXED`, `FAILED`. Optional `siteId`
            narrows to a single publisher. Example: `{"status":"POTENTIAL"}`.'
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: 1-based page number.
        - name: perPage
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Records per page.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DuplicateListingRollupType"
              example:
                data:
                  duplicateListingsRollup:
                    pageInfo:
                      hasNextPage: true
                      hasPreviousPage: false
                      totalPages: 34
                      totalRecords: 1673
                    records:
                      - id: "3329229"
                        name: Woodbury Train Station
                        nameValid: false
                        duplicateProcessingState: POTENTIAL
                        liveLink: http://citysquares.com/b/woodbury-train-station-23598450
                        locationId: "73451"
                        siteName: City Squares
                        siteUrl: citysquares.com
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a paginated, account-wide rollup of potential duplicate
        listings across every location under a tag.
  /api/v4/locations/listings/mark-as-duplicate:
    post:
      operationId: markAsDuplicate
      summary: Marking the duplicate listing item.
      tags:
        - Listings
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MutationResultType"
              example:
                data:
                  markAsDuplicate:
                    success: true
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/MarkAsDuplicateInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                listingItemIds:
                  - TGlzdGluZ0l0ZW06MjM1OTg0NTA=
      description: Flags one or more detected listing items as confirmed duplicates so
        Listings API can suppress them.
  /api/v4/locations/listings/mark-as-not-duplicate:
    post:
      operationId: markAsNotDuplicate
      summary: Marking the non duplicate listing item.
      tags:
        - Listings
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/MutationResultType"
              example:
                data:
                  markAsNotDuplicate:
                    success: true
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/MarkAsNotDuplicateInput"
              required:
                - input
            example:
              input:
                locationId: TG9jYXRpb246MTgwMDI4OQ==
                listingItemIds:
                  - TGlzdGluZ0l0ZW06MjM1OTg0NTA=
      description: Dismisses one or more potential duplicates as false positives so
        they stop appearing in the duplicates list.
  /api/v4/locations/{locationId}/photos:
    get:
      operationId: mediaFilesOfLocation
      summary: List media files attached to a single location (starred + unstarred).
      tags:
        - Locations
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: "The location's raw Base64-encoded Relay ID (for example
            `TG9jYXRpb246MTgwMDI4OQ==`). Send it un-encoded, a numeric database
            ID or a URL-encoded value returns `SY90002: Invalid Id`."
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/MediaFileOfLocationType"
              example:
                data:
                  mediaFilesOfLocation:
                    - id: TWVkaWFGaWxlOjU4Nzg5MzE=
                      url: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/f47d62a6.jpg
                      thumbnailUrl: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/thumbnail_f47d62a6.jpg
                      categoryName: Logo
                      categoryId: "4"
                      fileType: image
                      starred: false
                      viewsCount: 0
                    - id: TWVkaWFGaWxlOjU4Nzg5MzI=
                      url: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/ef4ffb12.jpg
                      thumbnailUrl: https://sy-media-store.s3-us-west-2.amazonaws.com/f868bb3f/59c670a3/thumbnail_ef4ffb12.jpg
                      categoryName: Additional
                      categoryId: "12"
                      fileType: image
                      starred: true
                      viewsCount: 143
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns all media files attached to a single location, including
        starred and unstarred photos.
  /api/v4/locations/photos/requests/{requestId}:
    get:
      operationId: getLocationPhotosUploadStatus
      summary: Return the status of a bulk add-media-to-location request.
      tags:
        - Locations
      parameters:
        - name: requestId
          in: path
          required: true
          schema:
            type: string
          description: UUID request ID returned in the `request` object by the add-photos
            endpoint when a batch exceeds 30 photos.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/LocationPhotosUploadStatusType"
              example:
                data:
                  getLocationPhotosUploadStatus:
                    requestId: e6c2d9d9-9a18-4015-88cf-9a4e19a6f49a
                    status: SUCCESS
                    photos:
                      - mediaId: TWVkaWFGaWxlOjkxODI3
                        locationId: TG9jYXRpb246MTgwMDI4OQ==
                        status: SUCCESS
                        errorMessage: null
                      - mediaId: null
                        locationId: TG9jYXRpb246MTgwMDI4OQ==
                        status: ERROR
                        errorMessage: Image dimensions below the minimum 250x250.
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the current processing status for a bulk photo upload request.
  /api/v4/bulk-posts:
    post:
      operationId: createBulkSocialPost
      summary: Create social posts for multiple locations.
      tags:
        - Posts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SocialPostMutation"
              example:
                data:
                  createSocialPost:
                    clientMutationId: null
                    success: true
                    errors: null
                    socialPost:
                      id: U29jaWFsUG9zdDo5OTIwMQ==
                      name: July Reopening Announcement
                      status: SCHEDULED
                      type: ANNOUNCEMENT
                      createdAt: 2026-07-08
                      scheduledStartDate: 2026-07-10
                      scheduledEndDate: 2026-07-24
                      sites:
                        - GOOGLE
                        - FACEBOOK
                      locationIds:
                        - 1800289
                        - 1800290
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                input:
                  $ref: "#/components/schemas/CreateSocialPostMutationInput"
              required:
                - input
            example:
              input:
                postName: July Reopening Announcement
                locationIds:
                  - TG9jYXRpb246MTgwMDI4OQ==
                  - TG9jYXRpb246MTgwMDI5MA==
                postType: ANNOUNCEMENT
                postSites:
                  - GOOGLE
                  - FACEBOOK
                postMessage:
                  - site: GOOGLE
                    message: We're back! Visit us this week for our summer menu.
                  - site: FACEBOOK
                    message: We're back! Swing by for the new summer menu.
                postMediaUrl:
                  - site: GOOGLE
                    url: https://cdn.example.com/summer.jpg
                    type: IMAGE
                postScheduledDates:
                  startDatetime: 2026-07-10T09:00:00Z
                  endDatetime: 2026-07-24T23:59:00Z
      description: Creates one social post and publishes it across many locations in a
        single request.
  /api/v4/bulk-posts/{postId}:
    get:
      operationId: socialPostViewBulk
      summary: Individual social post view page.
      tags:
        - Posts
      parameters:
        - name: postId
          in: path
          required: true
          schema:
            type: string
          description: Base64-encoded bulk post ID (the `id` returned by POST /bulk-posts
            or listed by GET /locations/{locationId}/bulk-posts).
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SocialPostView"
              example:
                data:
                  socialPostViewBulk:
                    socialPostId: U29jaWFsUG9zdDo1MTA4OA==
                    socialPostInfo:
                      id: U29jaWFsUG9zdDo1MTA4OA==
                      name: Diwali Offer - All Stores
                      status: SUCCESS
                      type: OFFER
                      createdAt: 2026-06-20
                      scheduledStartDate: 2026-06-22
                      scheduledEndDate: 2026-07-06
                      views: 4210
                      clicks: 318
                      shares: 12
                      reactions: 87
                      comments: 4
                      sites:
                        - GOOGLE
                        - FACEBOOK
                      message:
                        - site: GOOGLE
                          message: Festive savings across all our stores this week.
                        - site: FACEBOOK
                          message: Festive savings across all our stores this week!
                      cta:
                        - type:
                            value: GET_OFFER
                            label: Get offer
                          url: https://jennyhome.example/diwali
                          site: GOOGLE
                          tinyUrl: https://tiny.cc/jh-diwali
                      contextInfo:
                        couponCode: DIWALI25
                        redeemUrl: https://jennyhome.example/diwali
                        termsConditions: Valid in-store only. Cannot be combined with other offers.
                        title: 25% off storewide
                        discount: 25%
                        startDay: 2026-06-22
                        endDay: 2026-07-06
                      mediaUrl:
                        - url: https://cdn.listingsapi.com/posts/51088/diwali.jpg
                          site: GOOGLE
                          type: IMAGE
                      publishDetails:
                        - site: GOOGLE
                          status: PUBLISHED
                          createdDate: 2026-06-20
                          publishedDate: 2026-06-22
                          submissionError: null
                        - site: FACEBOOK
                          status: PUBLISHED
                          createdDate: 2026-06-20
                          publishedDate: 2026-06-22
                          submissionError: null
                      postLinks:
                        - site: GOOGLE
                          link: https://www.google.com/maps/place/?post=51088
                      locationIds:
                        - 1800289
                        - 1800290
                        - 1800291
                    publishedLocationsCount: 3
                    socialPostAnalyticsBySite:
                      - site: GOOGLE
                        views: 3120
                        clicks: 240
                        reactions: 61
                        shares: 0
                        comments: 0
                      - site: FACEBOOK
                        views: 1090
                        clicks: 78
                        reactions: 26
                        shares: 12
                        comments: 4
                    socialPostAnalyticsByLocationId:
                      - locationId: 1800289
                        siteStats:
                          - site: GOOGLE
                            status: PUBLISHED
                            views: 1040
                            clicks: 80
                            reactions: 20
                            shares: 0
                            comments: 0
                          - site: FACEBOOK
                            status: PUBLISHED
                            views: 360
                            clicks: 26
                            reactions: 9
                            shares: 4
                            comments: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a single bulk (multi-location) post campaign with its
        content, per-location publish status, and engagement analytics.
  /api/v4/locations/{locationId}/posts:
    get:
      operationId: rollupSocialPostsByLocation
      summary: List of post campaigns for tags/locations.
      tags:
        - Posts
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            type: string
          description: Base64-encoded location cursor / global ID (e.g.
            `TG9jYXRpb246MTgwMDI4OQ==`). Pass it verbatim, do not URL-encode it.
            The base64 cursor always resolves; the raw numeric database ID also
            works on this endpoint, but the base64 form is the portable choice
            across the API.
        - name: locationIds
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of location IDs to include alongside the path
            location.
        - name: tag
          in: query
          required: true
          schema:
            type: string
          description: Segment/tag to pull posts from. Pass `all` to fetch every post for
            the location; omitting it returns an error.
        - name: filters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded SocialPostFiltersInput (e.g. by `type`, `status`,
            `creationDateRange`, `siteUrls`).
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: 1-based page number for offset pagination.
        - name: perPage
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records per page.
        - name: sortFields
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: 'JSON-encoded sort object `{ "field": "created_at", "order":
            "Descending" }`. `field` is one of name, type, status, created_at,
            schedule_start_date, schedule_end_date, client_name, clicks, views,
            shares.'
        - name: componentIdentifier
          in: query
          required: false
          schema:
            type: string
          description: Filter to posts created by a specific component/integration.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SocialPostPaginated"
              example:
                data:
                  rollupSocialPosts:
                    records:
                      - id: U29jaWFsUG9zdDo0NDEyMg==
                        name: Summer Hours Update
                        status: SUCCESS
                        type: ANNOUNCEMENT
                        createdAt: 2026-06-28
                        scheduledStartDate: 2026-06-28
                        scheduledEndDate: 2026-07-28
                        views: 128
                        clicks: 14
                        shares: 0
                        reactions: 3
                        comments: 1
                        sites:
                          - GOOGLE
                        message:
                          - site: GOOGLE
                            message: We have extended our summer hours! Open until 9pm on weekdays.
                        cta:
                          - type:
                              value: LEARN_MORE
                              label: Learn more
                            url: https://jennyhome.example/hours
                            site: GOOGLE
                            tinyUrl: https://tiny.cc/jh-hours
                        contextInfo: null
                        mediaUrl:
                          - url: https://cdn.listingsapi.com/posts/44122/summer.jpg
                            site: GOOGLE
                            type: IMAGE
                        publishDetails:
                          - site: GOOGLE
                            status: PUBLISHED
                            createdDate: 2026-06-28
                            publishedDate: 2026-06-28
                            submissionError: null
                        postLinks:
                          - site: GOOGLE
                            link: https://www.google.com/maps/place/?post=44122
                        locationIds:
                          - 1800289
                        clientName: Jenny Home
                    locationDetails:
                      - id: TG9jYXRpb246MTgwMDI4OQ==
                        name: Jenny Home
                        street: 600 Congress Ave, Suite 200
                        city: Austin
                        postalCode: "78701"
                        countryIso: US
                        stateIso: TX
                        stateName: Texas
                        storeId: null
                    pageInfo:
                      totalPages: 1
                      hasNextPage: false
                      hasPreviousPage: false
                      totalRecords: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a page of social post campaigns (announcements, events,
        offers) that target a single location.
  /api/v4/locations/{locationId}/bulk-posts:
    get:
      operationId: rollupSocialPostsBulk
      summary: List of post campaigns for tags/locations.
      tags:
        - Posts
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            type: string
          description: Base64-encoded location cursor / global ID (e.g.
            `TG9jYXRpb246MTgwMDI4OQ==`). Pass it verbatim, do not URL-encode it.
            The base64 cursor always resolves; the raw numeric database ID also
            works on this endpoint, but the base64 form is the portable choice
            across the API.
        - name: locationIds
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded array of location IDs to include alongside the path
            location.
        - name: tag
          in: query
          required: true
          schema:
            type: string
          description: Segment/tag to pull posts from. Pass `all` to fetch every post for
            the location; omitting it returns an error.
        - name: filters
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: JSON-encoded SocialPostFiltersInput (e.g. by `type`, `status`,
            `creationDateRange`, `siteUrls`).
        - name: page
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: 1-based page number for offset pagination.
        - name: perPage
          in: query
          required: false
          schema:
            type: integer
            format: int32
          description: Number of records per page.
        - name: sortFields
          in: query
          required: false
          schema:
            type: string
            description: JSON-encoded filter object
          description: 'JSON-encoded sort object `{ "field": "created_at", "order":
            "Descending" }`. `field` is one of name, type, status, created_at,
            schedule_start_date, schedule_end_date, client_name, clicks, views,
            shares.'
        - name: componentIdentifier
          in: query
          required: false
          schema:
            type: string
          description: Filter to campaigns created by a specific component/integration.
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/SocialPostPaginated"
              example:
                data:
                  rollupSocialPosts:
                    records:
                      - id: U29jaWFsUG9zdDo1MTA4OA==
                        name: Diwali Offer - All Stores
                        status: SUCCESS
                        type: OFFER
                        createdAt: 2026-06-20
                        scheduledStartDate: 2026-06-22
                        scheduledEndDate: 2026-07-06
                        views: 4210
                        clicks: 318
                        shares: 12
                        reactions: 87
                        comments: 4
                        sites:
                          - GOOGLE
                          - FACEBOOK
                        message:
                          - site: GOOGLE
                            message: Festive savings across all our stores this week.
                          - site: FACEBOOK
                            message: Festive savings across all our stores this week!
                        cta:
                          - type:
                              value: GET_OFFER
                              label: Get offer
                            url: https://jennyhome.example/diwali
                            site: GOOGLE
                            tinyUrl: https://tiny.cc/jh-diwali
                        contextInfo:
                          couponCode: DIWALI25
                          redeemUrl: https://jennyhome.example/diwali
                          termsConditions: Valid in-store only. Cannot be combined with other offers.
                          title: 25% off storewide
                          discount: 25%
                          startDay: 2026-06-22
                          endDay: 2026-07-06
                        mediaUrl:
                          - url: https://cdn.listingsapi.com/posts/51088/diwali.jpg
                            site: GOOGLE
                            type: IMAGE
                        publishDetails:
                          - site: GOOGLE
                            status: PUBLISHED
                            createdDate: 2026-06-20
                            publishedDate: 2026-06-22
                            submissionError: null
                          - site: FACEBOOK
                            status: PUBLISHED
                            createdDate: 2026-06-20
                            publishedDate: 2026-06-22
                            submissionError: null
                        postLinks:
                          - site: GOOGLE
                            link: https://www.google.com/maps/place/?post=51088
                        locationIds:
                          - 1800289
                          - 1800290
                          - 1800291
                        clientName: Jenny Home
                    locationDetails:
                      - id: TG9jYXRpb246MTgwMDI4OQ==
                        name: Jenny Home
                        street: 600 Congress Ave, Suite 200
                        city: Austin
                        postalCode: "78701"
                        countryIso: US
                        stateIso: TX
                        stateName: Texas
                        storeId: null
                    pageInfo:
                      totalPages: 1
                      hasNextPage: false
                      hasPreviousPage: false
                      totalRecords: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns a page of bulk (multi-location) post campaigns that include
        a single location.
  /api/v4/locations/{locationId}/listings/premium:
    get:
      operationId: listingsForLocationPremium
      summary: Get listings for a location.
      tags:
        - Listings
      parameters:
        - name: locationId
          in: path
          required: true
          schema:
            oneOf:
              - type: integer
                description: Raw numeric ID
              - type: string
                description: Base64-encoded Relay ID
            format: base64-or-int
          description: Location to read. Accepts a base64-encoded Relay ID (e.g.
            `TG9jYXRpb246MTgwMDI4OQ==`) or a raw numeric location ID.
        - name: listingType
          in: query
          required: true
          schema:
            type: string
            description: JSON-encoded filter object
          description: "Which listing tier to return: `premium` for the plan's premium
            directory listings, or `additional` for additional/free listings."
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: "#/components/schemas/ListingUnion"
              example:
                data:
                  listingsForLocation:
                    - id: TGlzdGluZzoxMDQ0Njg3MjM=
                      databaseId: "104468723"
                      site:
                        id: U2l0ZTox
                        databaseId: "1"
                        name: Google Maps
                        url: maps.google.com
                        syScore: "100"
                      syncStatus: REQUIRING_ACTION
                      displayStatus: Connect your account to sync the listing
                      actionRequired: true
                      listingUrl: null
                      connectedAccountId: null
                      lastUpdate: 2026-07-06T18:33:28Z
                      indexStatus: false
                      syncIssue: null
                      verified: false
                    - id: TGlzdGluZzoxMDQ0Njg3MTQ=
                      databaseId: "104468714"
                      site:
                        id: U2l0ZToxODA=
                        databaseId: "180"
                        name: Bing
                        url: www.bing.com
                        syScore: "97"
                      syncStatus: IN_PROGRESS
                      displayStatus: Information submitted to partner; awaiting response
                      actionRequired: false
                      listingUrl: null
                      connectedAccountId: null
                      lastUpdate: 2026-07-06T18:33:35Z
                      indexStatus: false
                      syncIssue: null
                      verified: false
                    - id: TGlzdGluZzoxMDQ0Njg3Mjc=
                      databaseId: "104468727"
                      site:
                        id: U2l0ZTozODc=
                        databaseId: "387"
                        name: BeLocalFocussed
                        url: belocalfocussed.com
                        syScore: "80"
                      syncStatus: SYNCED
                      displayStatus: Synced
                      actionRequired: false
                      listingUrl: https://belocalfocussed.com/jenny-home-26x0ffkd0e
                      connectedAccountId: null
                      lastUpdate: 2026-07-06T18:33:30Z
                      indexStatus: false
                      syncIssue: null
                      verified: false
                    - id: TGlzdGluZzoxMDQ0Njg3MDk=
                      databaseId: "104468709"
                      site:
                        id: U2l0ZTozMDE=
                        databaseId: "301"
                        name: Local Mint
                        url: localmint.com
                        syScore: "69"
                      syncStatus: FAILED
                      displayStatus: Partner experiencing issues; awaiting response
                      actionRequired: false
                      listingUrl: null
                      connectedAccountId: null
                      lastUpdate: 2026-07-06T18:34:03Z
                      indexStatus: false
                      syncIssue: Publisher requires website URL
                      verified: false
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      description: Returns the sync status of every publisher directory in a
        location's plan.
  /api/v4/connected-accounts/disconnect-listing:
    post:
      operationId: disconnectConnectedAccountListing
      summary: disconnectConnectedAccountListing
      tags:
        - Connected Accounts
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/DeleteConnectedAccountsLocationsResult"
              example:
                data:
                  disconnectConnectedAccountListing:
                    deleted: 1
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                locationIds:
                  type: array
                  items:
                    type: string
              required:
                - locationIds
      description: Unlinks the connected Google or Facebook listing from one or more
        Listings API locations.
  /api/v4/locations/reviews/respond/edit:
    post:
      operationId: editReviewResponse
      summary: Edit a previously posted response to a review.
      tags:
        - Reviews
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/EditResponsePayload"
              example:
                data:
                  editReviewResponse:
                    status: "true"
                    reviewId: 9e26d2a8-a6ed-42ea-8454-47d1c92ea841
                    responseId: 2090753a-ece6-4837-8336-8494ad308523
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                responseId:
                  type: string
                reviewId:
                  type: string
                responseContent:
                  type: string
                templateId:
                  type: string
              required:
                - responseId
                - reviewId
                - responseContent
            example:
              reviewId: 9e26d2a8-a6ed-42ea-8454-47d1c92ea841
              responseId: 2090753a-ece6-4837-8336-8494ad308523
              responseContent: "Thank you again: we've updated our reply to include our new
                store hours."
      description: Edits a previously posted owner response on a review or interaction.
  /api/v4/locations/reviews/respond/archive:
    post:
      operationId: archiveReviewResponse
      summary: Archive a response item by ID (soft-delete from the local cache).
      tags:
        - Reviews
      parameters: []
      responses:
        "200":
          description: Successful response
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/ArchiveInteractionPayload"
              example:
                data:
                  archiveReviewResponse:
                    status: "true"
                    errors: null
        "400":
          description: Bad request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "401":
          description: Unauthorized
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
        "500":
          description: Server error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                responseId:
                  type: string
              required:
                - responseId
            example:
              responseId: 2090753a-ece6-4837-8336-8494ad308523
      description: Archives an existing owner response, removing it from the active
        responses tracked for an interaction.
components:
  schemas:
    CountryType:
      type: object
      description: A country supported by Listings API.
      properties:
        iso:
          type: string
        name:
          type: string
        dialCode:
          type: string
        states:
          type: array
          items:
            $ref: "#/components/schemas/StateType"
      required:
        - iso
        - name
    Error:
      type: object
      description: Listings API error envelope returned from mutations.
      properties:
        code:
          type: string
        message:
          type: string
        field:
          type: string
    SubCategoryType:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        category:
          type: string
      required:
        - id
        - name
    LocationSummaryType:
      type: object
      description: Summary view of a business location.
      properties:
        id:
          type: string
        databaseId:
          type: integer
          format: int32
        storeId:
          type: string
        name:
          type: string
        street:
          type: string
        city:
          type: string
        stateIso:
          type: string
        countryIso:
          type: string
        postalCode:
          type: string
        latitude:
          type: number
          format: float
        longitude:
          type: number
          format: float
        phone:
          type: string
        website:
          type: string
        status:
          $ref: "#/components/schemas/LocationStatusType"
        primaryGbpSiteCategoryId:
          type: string
        additionalGbpSiteCategoryIds:
          type: array
          items:
            type: string
        serviceArea:
          type: array
          items:
            $ref: "#/components/schemas/ServiceAreaType"
        tags:
          type: array
          items:
            $ref: "#/components/schemas/TagType"
        folders:
          type: array
          items:
            $ref: "#/components/schemas/FolderType"
        placeActionLinks:
          type: array
          items:
            $ref: "#/components/schemas/PlaceActionLinkType"
        discoveredPlaceActionLinks:
          type: array
          items:
            $ref: "#/components/schemas/PlaceActionLinkType"
      required:
        - id
        - name
    LocationSummaryConnectionType:
      type: object
      description: A Relay connection over LocationSummary.
      properties:
        edges:
          type: array
          items:
            $ref: "#/components/schemas/LocationSummaryEdgeType"
        nodes:
          type: array
          items:
            $ref: "#/components/schemas/LocationSummaryType"
        pageInfo:
          $ref: "#/components/schemas/PageInfoType"
        totalCount:
          type: integer
          format: int32
      required:
        - pageInfo
    CreateLocationPayload:
      type: object
      properties:
        clientMutationId:
          type: string
        location:
          $ref: "#/components/schemas/LocationSummaryType"
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
        success:
          type: boolean
    CreateLocationInput:
      type: object
      properties:
        clientMutationId:
          type: string
        name:
          type: string
        description:
          type: string
        storeId:
          type: string
        street:
          type: string
        city:
          type: string
        stateIso:
          type: string
        postalCode:
          type: string
        countryIso:
          type: string
        subCategoryId:
          type: integer
          format: int32
        phone:
          type: string
        folderIds:
          type: array
          items:
            type: string
        businessHours:
          type: array
          items:
            $ref: "#/components/schemas/BusinessHoursDayInput"
        serviceArea:
          $ref: "#/components/schemas/ServiceAreaInput"
        enabledSiteIds:
          type: array
          items:
            type: integer
            format: int32
        placeActionLinks:
          type: array
          items:
            $ref: "#/components/schemas/PlaceActionLinkInputType"
      required:
        - name
        - description
        - countryIso
        - subCategoryId
    UpdateLocationPayload:
      type: object
      properties:
        clientMutationId:
          type: string
        location:
          $ref: "#/components/schemas/LocationSummaryType"
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
        success:
          type: boolean
    UpdateLocationInput:
      type: object
      properties:
        clientMutationId:
          type: string
        id:
          type: string
        name:
          type: string
        street:
          type: string
        city:
          type: string
        stateIso:
          type: string
        postalCode:
          type: string
        countryIso:
          type: string
        phone:
          type: string
        businessHours:
          type: array
          items:
            $ref: "#/components/schemas/BusinessHoursDayInput"
        moreHours:
          type: array
          items:
            $ref: "#/components/schemas/MoreHourInput"
        serviceArea:
          $ref: "#/components/schemas/ServiceAreaInput"
        customAttributes:
          type: array
          items:
            $ref: "#/components/schemas/CustomAttributeInputType"
        placeActionLinks:
          type: array
          items:
            $ref: "#/components/schemas/PlaceActionLinkInputType"
      required:
        - id
    AddLocationPhotosPayload:
      type: object
      description: (also defined by media-manager)
      properties:
        clientMutationId:
          type: string
        photos:
          type: array
          items:
            $ref: "#/components/schemas/PhotoType"
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
    AddLocationPhotosInput:
      type: object
      properties:
        clientMutationId:
          type: string
        locationId:
          type: string
        photos:
          type: array
          items:
            $ref: "#/components/schemas/LocationPhotoInput"
      required:
        - locationId
        - photos
    RemoveLocationPhotosPayload:
      type: object
      description: (also defined by media-manager)
      properties:
        clientMutationId:
          type: string
        removedCount:
          type: integer
          format: int32
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
    RemoveLocationPhotosInput:
      type: object
      properties:
        clientMutationId:
          type: string
        locationId:
          type: string
        photoIds:
          type: array
          items:
            type: string
      required:
        - locationId
        - photoIds
    StarLocationPhotosPayload:
      type: object
      properties:
        clientMutationId:
          type: string
        photos:
          type: array
          items:
            $ref: "#/components/schemas/PhotoType"
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
    StarLocationPhotosInput:
      type: object
      properties:
        clientMutationId:
          type: string
        locationId:
          type: string
        photoIds:
          type: array
          items:
            type: string
        starred:
          type: boolean
      required:
        - locationId
        - photoIds
        - starred
    ArchiveLocationsPayload:
      type: object
      properties:
        clientMutationId:
          type: string
        archivedCount:
          type: integer
          format: int32
        locations:
          type: array
          items:
            $ref: "#/components/schemas/LocationSummaryType"
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
      required:
        - archivedCount
    ArchiveLocationsInput:
      type: object
      properties:
        clientMutationId:
          type: string
        locationIds:
          type: array
          items:
            type: string
      required:
        - locationIds
    CancelLocationsArchivePayload:
      type: object
      properties:
        clientMutationId:
          type: string
        cancelledCount:
          type: integer
          format: int32
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
    CancelLocationsArchiveInput:
      type: object
      properties:
        clientMutationId:
          type: string
        locationIds:
          type: array
          items:
            type: string
      required:
        - locationIds
    SocialPostView:
      type: object
      properties:
        socialPostId:
          type: string
        socialPostInfo:
          $ref: "#/components/schemas/SocialPost"
        publishedLocationsCount:
          type: integer
          format: int32
        socialPostAnalyticsBySite:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostAnalyticsSitewise"
        socialPostAnalyticsByLocationId:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostAnalyticsLocationwise"
    DeleteSocialPostMutation:
      type: object
      properties:
        success:
          type: boolean
        socialPostId:
          type: string
      required:
        - success
        - socialPostId
    SocialPostMutation:
      type: object
      description: Result of a social post create/edit mutation.
      properties:
        clientMutationId:
          type: string
        success:
          type: boolean
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationError"
        socialPost:
          $ref: "#/components/schemas/SocialPost"
      required:
        - success
    CreateSocialPostMutationInput:
      type: object
      properties:
        postName:
          type: string
        locationIds:
          type: array
          items:
            type: string
        postType:
          $ref: "#/components/schemas/SocialPostTypeEnum"
        postSites:
          type: array
          items:
            $ref: "#/components/schemas/SitesType"
        postMessage:
          type: array
          items:
            $ref: "#/components/schemas/PostMessageInput"
        postCta:
          type: array
          items:
            $ref: "#/components/schemas/PostCtaInput"
        postMediaUrl:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostMediaInput"
        postScheduledDates:
          $ref: "#/components/schemas/PostScheduledDatesInput"
        postContextInfo:
          $ref: "#/components/schemas/PostContextInfoInput"
        componentIdentifier:
          type: string
        componentType:
          type: string
        products:
          type: array
          items:
            $ref: "#/components/schemas/ProductInfoInput"
        clientMutationId:
          type: string
      required:
        - postName
        - locationIds
        - postType
        - postSites
    InteractionConnection:
      type: object
      description: Relay-style paginated list of interactions with aggregate stats.
      properties:
        pageInfo:
          $ref: "#/components/schemas/PageInfo"
        edges:
          type: array
          items:
            $ref: "#/components/schemas/InteractionEdge"
        totalCount:
          type: integer
          format: int32
        interactionStats:
          $ref: "#/components/schemas/InteractionsCombinedStats"
      required:
        - pageInfo
    InteractionsDetail:
      type: object
      properties:
        interactions:
          type: array
          items:
            $ref: "#/components/schemas/Interaction"
    InteractionsSetting:
      type: object
      properties:
        id:
          type: string
        positiveInteractionThreshold:
          type: integer
          format: int32
        siteSettings:
          type: array
          items:
            $ref: "#/components/schemas/SiteSetting"
        locationId:
          type: string
    InteractionsAnalyticsStats:
      type: object
      properties:
        stats:
          type: array
          items:
            $ref: "#/components/schemas/InteractionStat"
    InteractionSiteConfig:
      type: object
      properties:
        id:
          type: integer
          format: int32
        site:
          type: string
        color:
          type: string
        opacity:
          type: number
          format: float
        siteUrl:
          type: string
        image:
          type: string
        baseUrl:
          type: string
        supportedInPlan:
          type: boolean
    RespondToInteractionPayload:
      type: object
      properties:
        interaction:
          $ref: "#/components/schemas/InteractionResponse"
        errors:
          type: array
          items:
            $ref: "#/components/schemas/ErrorType"
    FacebookMetricV4:
      type: object
      description: Facebook metrics with views and action breakdowns.
      properties:
        views:
          $ref: "#/components/schemas/MetricDelta"
        ctaAction:
          $ref: "#/components/schemas/MetricDelta"
        websiteAction:
          $ref: "#/components/schemas/MetricDelta"
        directionsAction:
          $ref: "#/components/schemas/MetricDelta"
        phoneAction:
          $ref: "#/components/schemas/MetricDelta"
    GoogleMetricV4:
      type: object
      description: Google My Business metrics including maps, search and actions.
      properties:
        total:
          $ref: "#/components/schemas/MetricDelta"
        maps:
          $ref: "#/components/schemas/MetricDelta"
        search:
          $ref: "#/components/schemas/MetricDelta"
        websiteAction:
          $ref: "#/components/schemas/MetricDelta"
        directionsAction:
          $ref: "#/components/schemas/MetricDelta"
        phoneAction:
          $ref: "#/components/schemas/MetricDelta"
        directSearch:
          $ref: "#/components/schemas/MetricDelta"
        indirectSearch:
          $ref: "#/components/schemas/MetricDelta"
        bookings:
          $ref: "#/components/schemas/MetricDelta"
        foodOrders:
          $ref: "#/components/schemas/MetricDelta"
        foodMenuClicks:
          $ref: "#/components/schemas/MetricDelta"
    BingMetricV4:
      type: object
      description: Bing Places metrics.
      properties:
        views:
          $ref: "#/components/schemas/MetricDelta"
    ConnectedAccountsPaginated:
      type: object
      properties:
        nodes:
          type: array
          items:
            $ref: "#/components/schemas/ConnectedAccountInfo"
        totalCount:
          type: integer
          format: int32
        pageInfo:
          $ref: "#/components/schemas/PageInfo"
    ConnectedAccountDetails:
      type: object
      properties:
        id:
          type: string
        email:
          type: string
        type:
          $ref: "#/components/schemas/ConnectedSite"
        listings:
          type: array
          items:
            $ref: "#/components/schemas/ConnectedAccountListing"
      required:
        - id
    ConnectedAccountListingsPaginated:
      type: object
      properties:
        nodes:
          type: array
          items:
            $ref: "#/components/schemas/ConnectedAccountListing"
        totalCount:
          type: integer
          format: int32
        pageInfo:
          $ref: "#/components/schemas/PageInfo"
    ConnectionSuggestionsForAccount:
      type: object
      properties:
        suggestions:
          type: array
          items:
            $ref: "#/components/schemas/ConnectionSuggestion"
        totalCount:
          type: integer
          format: int32
    PlanSite:
      type: object
      properties:
        site:
          type: string
        enabled:
          type: boolean
    GmbFolder:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    ConnectUrl:
      type: object
      properties:
        url:
          type: string
      required:
        - url
    GoogleOauthBulkInput:
      type: object
      properties:
        successUrl:
          type: string
        errorUrl:
          type: string
      required:
        - successUrl
        - errorUrl
    FacebookOauthBulkInput:
      type: object
      properties:
        successUrl:
          type: string
        errorUrl:
          type: string
      required:
        - successUrl
        - errorUrl
    ConnectedAccountsTriggerMatchesResult:
      type: object
      properties:
        success:
          type: boolean
    ConnectedAccountsTriggerMatchesInput:
      type: object
      properties:
        connectedAccountIds:
          type: array
          items:
            type: string
    ConfirmConnectMatchesResult:
      type: object
      properties:
        confirmed:
          type: integer
          format: int32
    ConfirmConnectMatchesInput:
      type: object
      properties:
        connectedAccountId:
          type: string
        matchRecordIds:
          type: array
          items:
            type: string
      required:
        - matchRecordIds
    BulkDisconnectResult:
      type: object
      properties:
        disconnected:
          type: integer
          format: int32
    BulkDisconnectLocationsInput:
      type: object
      properties:
        connectedAccountId:
          type: string
        locationIds:
          type: array
          items:
            type: string
      required:
        - connectedAccountId
    FbBulkDisconnectLocationsInput:
      type: object
      properties:
        connectedAccountId:
          type: string
        locationIds:
          type: array
          items:
            type: string
      required:
        - connectedAccountId
    ConnectListingResult:
      type: object
      properties:
        success:
          type: boolean
    ConnectListingInput:
      type: object
      properties:
        connectedAccountId:
          type: string
        connectedAccountListingId:
          type: string
      required:
        - connectedAccountId
        - connectedAccountListingId
    LocationResult:
      type: object
      properties:
        clientMutationId:
          type: string
        locationId:
          type: string
        success:
          type: boolean
    CreateLocationFromListingInput:
      type: object
      properties:
        listingId:
          type: string
      required:
        - listingId
    MutationResult:
      type: object
      properties:
        clientMutationId:
          type: string
        success:
          type: boolean
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationError"
    CreateGmbListingForLocationInput:
      type: object
      properties:
        locationId:
          type: string
        connectedAccountId:
          type: string
      required:
        - locationId
        - connectedAccountId
    CustomSiteType:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        url:
          type: string
        listings:
          type: array
          items:
            $ref: "#/components/schemas/DuplicateListingType"
    VoiceAssistantType:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        listings:
          type: array
          items:
            $ref: "#/components/schemas/VoiceListingType"
    DuplicateListingRollupType:
      type: object
      properties:
        total:
          type: integer
          format: int32
        listings:
          type: array
          items:
            $ref: "#/components/schemas/DuplicateListingType"
        pageInfo:
          $ref: "#/components/schemas/OffsetBasedPageInfoType"
    MutationResultType:
      type: object
      description: (also defined by crawler)
      properties:
        success:
          type: boolean
        errors:
          type: array
          items:
            $ref: "#/components/schemas/MutationErrorType"
      required:
        - success
    MarkAsDuplicateInput:
      type: object
      properties:
        listingItemIds:
          type: array
          items:
            type: string
        locationId:
          type: string
      required:
        - listingItemIds
    MarkAsNotDuplicateInput:
      type: object
      properties:
        listingItemIds:
          type: array
          items:
            type: string
        locationId:
          type: string
      required:
        - listingItemIds
    MediaFileOfLocationType:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
        thumbnailUrl:
          type: string
        categoryName:
          type: string
        categoryId:
          type: string
        fileType:
          type: string
        starred:
          type: boolean
        viewsCount:
          type: integer
          format: int32
      required:
        - id
    LocationPhotosUploadStatusType:
      type: object
      properties:
        requestId:
          type: string
        status:
          type: string
        photos:
          type: array
          items:
            $ref: "#/components/schemas/LocationPhotoUploadItem"
    SocialPostPaginated:
      type: object
      properties:
        records:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostEs"
        locationDetails:
          type: array
          items:
            $ref: "#/components/schemas/LocationDetails"
        pageInfo:
          $ref: "#/components/schemas/OffsetBasedPageInfo"
      required:
        - pageInfo
    ListingUnion:
      oneOf:
        - $ref: "#/components/schemas/ListingType"
        - $ref: "#/components/schemas/PremiumListingType"
        - $ref: "#/components/schemas/AdditionalListingType"
    DeleteConnectedAccountsLocationsResult:
      type: object
      properties:
        deleted:
          type: integer
          format: int32
    EditResponsePayload:
      type: object
      properties:
        status:
          type: string
        reviewId:
          type: string
        responseId:
          type: string
    ArchiveInteractionPayload:
      type: object
      properties:
        status:
          type: string
        errors:
          type: array
          items:
            $ref: "#/components/schemas/ErrorType"
    StateType:
      type: object
      properties:
        iso:
          type: string
        name:
          type: string
      required:
        - iso
        - name
    LocationStatusType:
      type: string
      enum:
        - ACTIVE
        - ARCHIVED
        - PENDING
        - TEMPORARILY_CLOSED
        - SCHEDULED_FOR_ARCHIVE
      description: Lifecycle states of a location.
    ServiceAreaType:
      type: object
      properties:
        businessType:
          type: string
        regionCode:
          type: string
        placeInfos:
          type: array
          items:
            $ref: "#/components/schemas/PlaceInfoType"
    TagType:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
      required:
        - id
        - name
    FolderType:
      type: object
      description: A folder used to group locations.
      properties:
        id:
          type: string
        databaseId:
          type: integer
          format: int32
        name:
          type: string
        parentId:
          type: string
        root:
          type: boolean
        path:
          type: string
        depth:
          type: integer
          format: int32
        locationCount:
          type: integer
          format: int32
      required:
        - id
        - name
    PlaceActionLinkType:
      type: object
      description: A Google place action link (ordering, delivery, takeout,
        reservation, appointment, etc.).
      properties:
        placeActionType:
          type: string
        uri:
          type: string
        isPreferred:
          type: boolean
        name:
          type: string
        providerType:
          type: string
        isEditable:
          type: boolean
        submissionStatus:
          type: string
        submissionMessage:
          type: string
        submissionCode:
          type: string
        lastSubmittedAt:
          type: string
      required:
        - placeActionType
        - uri
    LocationSummaryEdgeType:
      type: object
      properties:
        cursor:
          type: string
        node:
          $ref: "#/components/schemas/LocationSummaryType"
      required:
        - cursor
    PageInfoType:
      type: object
      description: (also defined by notifications) (also defined by reviewfunnel)
        (also defined by contests) (also defined by social-media)
      properties:
        hasNextPage:
          type: boolean
        hasPreviousPage:
          type: boolean
        startCursor:
          type: string
        endCursor:
          type: string
      required:
        - hasNextPage
        - hasPreviousPage
    MutationErrorType:
      type: object
      description: (also defined by notifications) (also defined by reviewfunnel)
        (also defined by crawler)
      properties:
        code:
          type: string
        message:
          type: string
        path:
          type: array
          items:
            type: string
      required:
        - message
    BusinessHoursDayInput:
      type: object
      properties:
        day:
          $ref: "#/components/schemas/DayOfTheWeekType"
        slots:
          type: array
          items:
            $ref: "#/components/schemas/BusinessHoursSlotInput"
        type:
          $ref: "#/components/schemas/BusinessHours"
      required:
        - day
        - type
    ServiceAreaInput:
      type: object
      properties:
        businessType:
          type: string
        regionCode:
          type: string
        placeInfos:
          type: array
          items:
            $ref: "#/components/schemas/PlaceInfoInput"
    PlaceActionLinkInputType:
      type: object
      description: Write payload for a Google place action link (append/upsert model).
      properties:
        placeActionType:
          $ref: "#/components/schemas/PlaceActionTypeEnum"
        uri:
          type: string
        isPreferred:
          type: boolean
        name:
          type: string
        providerType:
          type: string
        isEditable:
          type: boolean
        action:
          type: string
      required:
        - placeActionType
        - uri
    MoreHourInput:
      type: object
      properties:
        type:
          type: string
        days:
          type: array
          items:
            $ref: "#/components/schemas/MoreHourDayInput"
      required:
        - type
    CustomAttributeInputType:
      type: object
      properties:
        name:
          type: string
        value:
          type: string
        type:
          $ref: "#/components/schemas/CustomAttributeInputTypeEnum"
        levelType:
          $ref: "#/components/schemas/CustomAttributeLevelTypeEnum"
      required:
        - name
    PhotoType:
      type: object
      properties:
        id:
          type: string
        url:
          type: string
        caption:
          type: string
        starred:
          type: boolean
      required:
        - id
        - url
    LocationPhotoInput:
      type: object
      properties:
        url:
          type: string
        caption:
          type: string
        type:
          type: string
      required:
        - url
    SocialPost:
      type: object
      description: A newer multi-site/multi-location post campaign.
      properties:
        id:
          type: string
        name:
          type: string
        status:
          $ref: "#/components/schemas/SocialPostStatusEnum"
        type:
          $ref: "#/components/schemas/SocialPostTypeEnum"
        createdAt:
          type: string
          format: date
        deletedAt:
          type: string
          format: date
        expiredAt:
          type: string
          format: date
        scheduledStartDate:
          type: string
          format: date
        scheduledEndDate:
          type: string
          format: date
        views:
          type: integer
          format: int32
        clicks:
          type: integer
          format: int32
        shares:
          type: integer
          format: int32
        reactions:
          type: integer
          format: int32
        comments:
          type: integer
          format: int32
        sites:
          type: array
          items:
            $ref: "#/components/schemas/SitesType"
        message:
          type: array
          items:
            $ref: "#/components/schemas/PostMessage"
        cta:
          type: array
          items:
            $ref: "#/components/schemas/PostCta"
        contextInfo:
          $ref: "#/components/schemas/PostContextInfo"
        mediaUrl:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostMedia"
        publishDetails:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostPublishDetail"
        postLinks:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostPublishedLink"
        locationIds:
          type: array
          items:
            type: integer
            format: int32
      required:
        - id
        - name
        - status
        - type
        - createdAt
        - sites
        - locationIds
    SocialPostAnalyticsSitewise:
      type: object
      properties:
        clicks:
          type: integer
          format: int32
        views:
          type: integer
          format: int32
        reactions:
          type: integer
          format: int32
        shares:
          type: integer
          format: int32
        comments:
          type: integer
          format: int32
        site:
          $ref: "#/components/schemas/SitesType"
    SocialPostAnalyticsLocationwise:
      type: object
      properties:
        locationId:
          type: integer
          format: int32
        siteStats:
          type: array
          items:
            $ref: "#/components/schemas/StatsAndStatus"
    MutationError:
      type: object
      description: (also defined by insights) (also defined by v2app)
      properties:
        message:
          type: string
        code:
          type: string
        contextInfo:
          type: array
          items:
            $ref: "#/components/schemas/ContextError"
    SocialPostTypeEnum:
      type: string
      enum:
        - EVENT
        - OFFER
        - ANNOUNCEMENT
        - COVID19
        - PRODUCT
      description: Social Post types.
    SitesType:
      type: string
      enum:
        - GOOGLE
        - FACEBOOK
      description: Sites a post can be published to.
    PostMessageInput:
      type: object
      properties:
        site:
          $ref: "#/components/schemas/SitesType"
        message:
          type: string
      required:
        - site
        - message
    PostCtaInput:
      type: object
      properties:
        site:
          $ref: "#/components/schemas/SitesType"
        type:
          type: string
        url:
          type: string
      required:
        - site
        - type
        - url
    SocialPostMediaInput:
      type: object
      properties:
        site:
          $ref: "#/components/schemas/SitesType"
        url:
          type: string
        type:
          $ref: "#/components/schemas/MediaTypeEnum"
      required:
        - site
        - url
    PostScheduledDatesInput:
      type: object
      properties:
        startDatetime:
          type: string
          description: Custom scalar Datetime
        endDatetime:
          type: string
          description: Custom scalar Datetime
        removalSites:
          type: array
          items:
            $ref: "#/components/schemas/SitesType"
      required:
        - startDatetime
        - endDatetime
    PostContextInfoInput:
      type: object
      description: Additional details for post based on post_type.
      properties:
        couponCode:
          type: string
        redeemUrl:
          type: string
        termsConditions:
          type: string
        title:
          type: string
        discount:
          type: string
        locationType:
          type: string
        startDay:
          type: string
          format: date
        startTime:
          type: string
        endDay:
          type: string
          format: date
        endTime:
          type: string
    ProductInfoInput:
      type: object
      properties:
        productId:
          type: string
        name:
          type: string
        category:
          type: string
        price:
          type: string
        minPrice:
          type: string
        maxPrice:
          type: string
        description:
          type: string
        photo:
          type: string
        cta:
          type: array
          items:
            $ref: "#/components/schemas/PostCtaInput"
        sites:
          type: array
          items:
            $ref: "#/components/schemas/SitesType"
    PageInfo:
      type: object
      description: (also defined by interactions) (also defined by v2app) (also
        defined by scantool) (also defined by thirdeye)
      properties:
        hasNextPage:
          type: boolean
        hasPreviousPage:
          type: boolean
    InteractionEdge:
      type: object
      properties:
        node:
          $ref: "#/components/schemas/Interaction"
        cursor:
          type: string
      required:
        - cursor
    InteractionsCombinedStats:
      type: object
      properties:
        sitesStats:
          type: array
          items:
            $ref: "#/components/schemas/SiteInteractionCount"
        otherStats:
          type: array
          items:
            $ref: "#/components/schemas/InteractionStat"
    Interaction:
      type: object
      description: A single review, Q&A item, or social interaction collected from a
        source site.
      properties:
        id:
          type: string
        interactionId:
          type: string
        source:
          type: string
        title:
          type: string
        content:
          type: string
        authorName:
          type: string
        rating:
          type: integer
          format: int32
        date:
          type: string
        permalink:
          type: string
        category:
          type: string
        type:
          type: string
        responded:
          type: boolean
        notes:
          type: string
        responses:
          type: array
          items:
            $ref: "#/components/schemas/InteractionResponse"
        responseCount:
          type: integer
          format: int32
        canRespond:
          type: boolean
        locationId:
          type: integer
          format: int32
        flaggedReason:
          type: string
    SiteSetting:
      type: object
      properties:
        name:
          type: string
        url:
          type: string
        connected:
          type: boolean
    InteractionStat:
      type: object
      properties:
        name:
          type: string
        value:
          type: number
          format: float
        delta:
          type: number
          format: float
        abs:
          type: number
          format: float
    InteractionResponse:
      type: object
      description: A response to an interaction (review reply, Q&A answer).
      properties:
        id:
          type: string
        interactionId:
          type: string
        content:
          type: string
        authorName:
          type: string
        date:
          type: string
        respondedWith:
          type: string
        respondedBy:
          type: integer
          format: int32
        interactionStatus:
          $ref: "#/components/schemas/InteractionResponseStatus"
        editedResponse:
          type: boolean
        remarks:
          type: string
    ErrorType:
      type: object
      description: (also defined by contests) (also defined by packaging) (also
        defined by task-manager) (also defined by social-media) (also defined by
        messenger) (also defined by crm-integration) (also defined by crawler)
        (also defined by media-manager)
      properties:
        message:
          type: string
        contextInfo:
          type: array
          items:
            $ref: "#/components/schemas/ContextInfoType"
        code:
          type: string
    MetricDelta:
      type: object
      description: Metric value with optional previous-period comparison.
      properties:
        current:
          type: integer
          format: int32
        previous:
          type: integer
          format: int32
        diff:
          type: integer
          format: int32
        diffPercentage:
          type: number
          format: float
        label:
          type: string
    ConnectedAccountInfo:
      type: object
      properties:
        id:
          type: string
        email:
          type: string
        type:
          $ref: "#/components/schemas/ConnectedSite"
        status:
          $ref: "#/components/schemas/ConnectedAccountStatus"
      required:
        - id
    ConnectedSite:
      type: string
      enum:
        - GOOGLE
        - FACEBOOK
        - YELP
        - LINKEDIN
        - APPLE
        - PINTEREST
        - TRIPADVISOR
    ConnectedAccountListing:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        address:
          type: string
        status:
          $ref: "#/components/schemas/ConnectedAccountLocationStatus"
      required:
        - id
    ConnectionSuggestion:
      type: object
      properties:
        id:
          type: string
        location:
          $ref: "#/components/schemas/ConnectionSuggestionLocationInfo"
        listing:
          $ref: "#/components/schemas/ConnectedAccountListing"
      required:
        - id
    DuplicateListingType:
      type: object
      properties:
        id:
          type: string
        listingItemId:
          type: string
        name:
          type: string
        liveLink:
          type: string
        status:
          type: string
    VoiceListingType:
      type: object
      properties:
        id:
          type: string
        voiceIdentifier:
          $ref: "#/components/schemas/VoiceIdentifierType"
    OffsetBasedPageInfoType:
      type: object
      properties:
        page:
          type: integer
          format: int32
        perPage:
          type: integer
          format: int32
        totalPages:
          type: integer
          format: int32
    LocationPhotoUploadItem:
      type: object
      properties:
        mediaId:
          type: string
        locationId:
          type: string
        status:
          type: string
        errorMessage:
          type: string
    SocialPostEs:
      type: object
      description: Elasticsearch-indexed social post record used in rollup listings.
      properties:
        id:
          type: string
        name:
          type: string
        status:
          $ref: "#/components/schemas/SocialPostStatusEnum"
        type:
          $ref: "#/components/schemas/SocialPostTypeEnum"
        createdAt:
          type: string
          format: date
        deletedAt:
          type: string
          format: date
        expiredAt:
          type: string
          format: date
        scheduledStartDate:
          type: string
          format: date
        scheduledEndDate:
          type: string
          format: date
        views:
          type: integer
          format: int32
        clicks:
          type: integer
          format: int32
        shares:
          type: integer
          format: int32
        reactions:
          type: integer
          format: int32
        comments:
          type: integer
          format: int32
        sites:
          type: array
          items:
            $ref: "#/components/schemas/SitesType"
        message:
          type: array
          items:
            $ref: "#/components/schemas/PostMessage"
        cta:
          type: array
          items:
            $ref: "#/components/schemas/PostCta"
        contextInfo:
          $ref: "#/components/schemas/PostContextInfo"
        mediaUrl:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostMedia"
        publishDetails:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostPublishDetail"
        postLinks:
          type: array
          items:
            $ref: "#/components/schemas/SocialPostPublishedLink"
        locationIds:
          type: array
          items:
            type: integer
            format: int32
        clientName:
          type: string
      required:
        - id
        - name
        - status
        - type
        - createdAt
        - sites
        - locationIds
    LocationDetails:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
        street:
          type: string
        street2:
          type: string
        city:
          type: string
        postalCode:
          type: string
        countryIso:
          type: string
        stateIso:
          type: string
        stateName:
          type: string
        storeId:
          type: string
      required:
        - id
    OffsetBasedPageInfo:
      type: object
      properties:
        totalPages:
          type: integer
          format: int32
        hasNextPage:
          type: boolean
        hasPreviousPage:
          type: boolean
        totalRecords:
          type: integer
          format: int32
      required:
        - totalPages
        - totalRecords
    ListingType:
      type: object
      description: A single listing on an external directory site.
      properties:
        id:
          type: string
        databaseId:
          type: string
        listingUrl:
          type: string
        syncStatus:
          $ref: "#/components/schemas/ListingSyncStatusType"
        displayStatus:
          type: string
        syncIssue:
          type: string
        actionRequired:
          type: boolean
        site:
          $ref: "#/components/schemas/SiteType"
        lastUpdate:
          type: string
        verified:
          type: boolean
        errors:
          type: array
          items:
            $ref: "#/components/schemas/ErrorType"
        indexStatus:
          type: boolean
        httpStatus:
          type: integer
          format: int32
        issueType:
          type: string
    PremiumListingType:
      type: object
      properties:
        id:
          type: string
        site:
          $ref: "#/components/schemas/SiteType"
    AdditionalListingType:
      type: object
      properties:
        id:
          type: string
        site:
          $ref: "#/components/schemas/SiteType"
    PlaceInfoType:
      type: object
      properties:
        placeId:
          type: string
        placeName:
          type: string
      required:
        - placeId
    DayOfTheWeekType:
      type: string
      enum:
        - MONDAY
        - TUESDAY
        - WEDNESDAY
        - THURSDAY
        - FRIDAY
        - SATURDAY
        - SUNDAY
    BusinessHoursSlotInput:
      type: object
      properties:
        start:
          type: string
        end:
          type: string
      required:
        - start
        - end
    BusinessHours:
      type: string
      enum:
        - OPEN
        - CLOSED
    PlaceInfoInput:
      type: object
      properties:
        placeId:
          type: string
        placeName:
          type: string
      required:
        - placeId
    PlaceActionTypeEnum:
      type: string
      enum:
        - APPOINTMENT
        - ONLINE_APPOINTMENT
        - DINING_RESERVATION
        - FOOD_ORDERING
        - FOOD_DELIVERY
        - FOOD_TAKEOUT
        - SHOP_ONLINE
      description: Google place action types.
    MoreHourDayInput:
      type: object
      properties:
        day:
          $ref: "#/components/schemas/DayOfTheWeekType"
        openTime:
          type: string
        closeTime:
          type: string
      required:
        - day
    CustomAttributeInputTypeEnum:
      type: string
      enum:
        - STRING
        - NUMBER
        - BOOLEAN
        - DATE
        - ENUM
        - URL
    CustomAttributeLevelTypeEnum:
      type: string
      enum:
        - ACCOUNT
        - LOCATION
    SocialPostStatusEnum:
      type: string
      enum:
        - INPROGRESS
        - SCHEDULED
        - SUCCESS
        - ERROR
        - DELETED
        - EXPIRED
      description: Social Post lifecycle statuses.
    PostMessage:
      type: object
      properties:
        message:
          type: string
        site:
          $ref: "#/components/schemas/SitesType"
    PostCta:
      type: object
      properties:
        type:
          $ref: "#/components/schemas/SiteCtaTypes"
        url:
          type: string
        site:
          $ref: "#/components/schemas/SitesType"
        tinyUrl:
          type: string
    PostContextInfo:
      type: object
      properties:
        couponCode:
          type: string
        redeemUrl:
          type: string
        termsConditions:
          type: string
        title:
          type: string
        discount:
          type: string
        locationType:
          type: string
        startDay:
          type: string
          format: date
        startTime:
          type: string
        endDay:
          type: string
          format: date
        endTime:
          type: string
    SocialPostMedia:
      type: object
      properties:
        url:
          type: string
        site:
          $ref: "#/components/schemas/SitesType"
        type:
          $ref: "#/components/schemas/MediaTypeEnum"
    SocialPostPublishDetail:
      type: object
      properties:
        site:
          $ref: "#/components/schemas/SitesType"
        status:
          $ref: "#/components/schemas/PublishStatusEnum"
        createdDate:
          type: string
          format: date
        publishedDate:
          type: string
          format: date
        deletedDate:
          type: string
          format: date
        expiredDate:
          type: string
          format: date
        submissionError:
          type: string
    SocialPostPublishedLink:
      type: object
      properties:
        site:
          $ref: "#/components/schemas/SitesType"
        link:
          type: string
    StatsAndStatus:
      type: object
      properties:
        clicks:
          type: integer
          format: int32
        views:
          type: integer
          format: int32
        reactions:
          type: integer
          format: int32
        shares:
          type: integer
          format: int32
        comments:
          type: integer
          format: int32
        status:
          type: string
        site:
          $ref: "#/components/schemas/SitesType"
    ContextError:
      type: object
      properties:
        key:
          type: string
        value:
          type: string
    MediaTypeEnum:
      type: string
      enum:
        - IMAGE
        - VIDEO
      description: Media type for social posts.
    SiteInteractionCount:
      type: object
      properties:
        name:
          type: string
        interactionCount:
          type: integer
          format: int32
    InteractionResponseStatus:
      type: string
      enum:
        - CREATED
        - FAILED
        - COMPLETED
        - CONFIRMED
      description: Lifecycle state of a response item as it's posted out to the source site.
    ContextInfoType:
      type: object
      description: (also defined by packaging) (also defined by task-manager)
      properties:
        key:
          type: string
        value:
          type: string
    ConnectedAccountStatus:
      type: string
      enum:
        - ACTIVE
        - DISCONNECTED
        - EXPIRED
        - ERROR
    ConnectedAccountLocationStatus:
      type: string
      enum:
        - CONNECTED
        - DISCONNECTED
        - PENDING
        - ERROR
    ConnectionSuggestionLocationInfo:
      type: object
      properties:
        id:
          type: string
        name:
          type: string
    VoiceIdentifierType:
      type: object
      properties:
        key:
          type: string
        value:
          type: string
    ListingSyncStatusType:
      type: string
      enum:
        - IN_PROGRESS
        - SYNCED
        - FAILED
        - REQUIRING_ACTION
        - AVAILABLE
        - COMPLETED
        - PENDING_APPROVAL
        - CANNOT_SUBMIT
    SiteType:
      type: object
      description: Directory site metadata.
      properties:
        id:
          type: string
        databaseId:
          type: string
        name:
          type: string
        url:
          type: string
        syScore:
          type: string
        addOn:
          type: string
      required:
        - id
        - databaseId
        - url
    SiteCtaTypes:
      type: object
      properties:
        value:
          type: string
        label:
          type: string
    PublishStatusEnum:
      type: string
      enum:
        - PUBLISHING
        - PUBLISHED
        - DELETED
        - EXPIRED
        - ERROR
      description: Publish statuses per site.
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: Authorization
      description: "Authenticate with `Authorization: API <your-key>`."
    rapidApiKey:
      type: apiKey
      in: header
      name: X-RapidAPI-Key
      description: RapidAPI marketplace key. Sent with `X-RapidAPI-Host` when calling
        via the RapidAPI proxy.
    rapidApiHost:
      type: apiKey
      in: header
      name: X-RapidAPI-Host
      description: RapidAPI marketplace host header. Sent with `X-RapidAPI-Key` when
        calling via the RapidAPI proxy.
