Vendasta Listing Source Service API
The ListingSourceService API from Vendasta — 2 operation(s) for listingsourceservice.
The ListingSourceService API from Vendasta — 2 operation(s) for listingsourceservice.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/vendasta-listingsourceservice-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
openapi: 3.2.0
info:
title: Listing Products Listing Source Service API
version: 1.210.0
servers:
- description: Production
url: https://prod.apigateway.co/grpc
tags:
- name: ListingSourceService
paths:
/v1/listings/get-listing-source-by-id:
post:
operationId: ListingSourceService_GetListingSourceById
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/v1GetListingSourceByIdRequest'
description: Request to retrieve detailed configuration for a specific listing directory by its numeric ID.
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/v1GetListingSourceByIdResponse'
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/rpcStatus'
description: An unexpected error response.
security:
- OAuth2:
- admin
summary: Get Listing Source By Id
tags:
- ListingSourceService
/v1/listings/get-listing-sources:
post:
operationId: ListingSourceService_GetListingSources
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/v1GetListingSourcesRequest'
description: Request to fetch all listing sources, optionally filtered by provider.
required: true
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/v1GetListingSourcesResponse'
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/rpcStatus'
description: An unexpected error response.
security:
- OAuth2:
- admin
summary: Get Listing Sources
tags:
- ListingSourceService
components:
schemas:
rpcStatus:
properties:
code:
format: int32
type: integer
details:
items:
$ref: '#/components/schemas/protobufAny'
type: array
message:
type: string
type: object
v1LocationOverride:
properties:
ignoredAnchorDataMatches:
items:
type: string
type: array
submitListingValidationRegex:
type: string
title: Location specific source overrides
type: object
v1Source:
description: 'Source contains comprehensive configuration and constraints for a listing directory.
This is the definitive reference for understanding what''s required to sync to a directory,
whether a business is eligible, and what features the directory supports.'
properties:
adminNotes:
title: admin_notes contains internal notes about this directory (for Vendasta admins)
type: string
availableForServiceAreaBusiness:
title: 'available_for_service_area_business indicates this directory supports service area businesses (no physical location)
False means only businesses with a physical storefront can list here'
type: boolean
claimListingHtml:
title: claim_listing_html contains HTML instructions for claiming an existing listing
type: string
createListingHtml:
title: create_listing_html contains HTML instructions for manually creating a listing on this directory
type: string
createListingUrl:
title: create_listing_url is the URL where users can manually create a listing
type: string
created:
description: Output only. When this directory was added to the system.
format: date-time
readOnly: true
type: string
deleted:
description: Output only. Indicates this directory has been removed/deprecated.
format: date-time
readOnly: true
type: string
descriptionHtml:
title: description_html is a human-readable description of this directory for display
type: string
domains:
items:
type: string
title: domains lists the web domains associated with this directory (for matching/scraping)
type: array
editListingHtml:
title: edit_listing_html contains HTML instructions for manually editing a listing
type: string
editListingUrl:
title: edit_listing_url is the URL where users can manually edit their listing
type: string
enabledFlag:
description: 'enabled_flag controls whether this directory is visible in user-facing applications (RepMan, Snapshot, Business App).
When false, the directory is hidden from the UI but existing listings may still sync.
Do not interpret false as "deprecated" - it means the source is not available for new manual submissions
but may still be actively synced via LSP providers.'
type: boolean
hasListingReporting:
title: 'has_listing_reporting indicates we can scrape/check this directory for accuracy data
If false, accuracy will always be ACCURACY_STATUS_UNAVAILABLE'
type: boolean
hasListingsFlag:
title: has_listings_flag indicates this directory displays business listings (vs. just aggregating data)
type: boolean
hasNoRatingsReviewsFlag:
title: has_no_ratings_reviews_flag indicates this directory does not support ratings/reviews
type: boolean
hasReviewsFlag:
title: has_reviews_flag indicates this directory supports customer reviews
type: boolean
iconClass16px:
title: icon_class_16px is the CSS class for 16px icon
type: string
iconClass32px:
title: icon_class_32px is the CSS class for 32px icon
type: string
iconClass50px:
title: icon_class_50px is the CSS class for 50px icon
type: string
iconUrl16px:
title: icon_url_16px is the URL for 16px icon
type: string
iconUrl32px:
title: icon_url_32px is the URL for 32px icon
type: string
iconUrl50px:
title: icon_url_50px is the URL for 50px icon
type: string
ignoredAnchorDataMatches:
items:
type: string
title: 'ignored_anchor_data_matches lists NAP fields to ignore when calculating accuracy
Example: ["phone"] means don''t flag phone number mismatches as inaccurate'
type: array
isDirectlySubmittedSource:
title: 'is_directly_submitted_source indicates this is a direct OAuth source (Google, Facebook, Apple, Bing)
True means businesses can connect their account directly without LSP'
type: boolean
isLdSource:
title: is_ld_source indicates this directory is part of Listing Distribution (Data Axle, Neustar, Foursquare ecosystem)
type: boolean
isLocationWhitelistedByDefaultFlag:
title: is_location_whitelisted_by_default_flag affects location-based eligibility
type: boolean
isPartnerWhitelistedByDefaultFlag:
title: is_partner_whitelisted_by_default_flag affects partner-based eligibility
type: boolean
isTaxonomyWhitelistedByDefaultFlag:
title: is_taxonomy_whitelisted_by_default_flag affects category-based eligibility
type: boolean
locationBlacklist:
items:
type: string
title: location_blacklist lists country codes where this directory is not available
type: array
locationSpecificOverrides:
additionalProperties:
$ref: '#/components/schemas/v1LocationOverride'
title: location_specific_overrides provides country-specific configuration overrides
type: object
locationWhitelist:
items:
type: string
title: location_whitelist lists country codes where this directory is available (if specified, only these countries)
type: array
lspIcon:
title: lsp_icon is the icon URL used in LSP-specific UI
type: string
name:
title: name is the human-readable directory name (e.g., "Google", "Yelp", "Facebook")
type: string
partnerBlacklist:
items:
type: string
title: partner_blacklist lists partner IDs that cannot use this directory
type: array
partnerSpecificOverrides:
additionalProperties:
$ref: '#/components/schemas/v1PartnerOverride'
title: partner_specific_overrides provides partner-specific configuration (custom branding, names, etc.)
type: object
partnerWhitelist:
items:
type: string
title: partner_whitelist lists partner IDs that can use this directory (if specified, only these partners)
type: array
popularity:
format: int64
title: popularity is a ranking score (higher = more important directory)
type: string
sourceId:
description: Output only. The unique numeric identifier for this directory.
format: int64
readOnly: true
type: string
sourceTypeId:
title: source_type_id is the category identifier (e.g., "search_engine", "social_network")
type: string
sourceTypeName:
title: source_type_name is the human-readable category name
type: string
submitListingHelpText:
title: submit_listing_help_text provides guidance for manual listing submission
type: string
submitListingValidationRegex:
title: submit_listing_validation_regex validates listing URLs for manual submission
type: string
supportsSubmittedListing:
title: supports_submitted_listing indicates manual submission via RM is supported
type: boolean
syncRequirement:
$ref: '#/components/schemas/v1SyncRequirement'
taxonomyBlacklist:
items:
type: string
title: 'taxonomy_blacklist lists business category IDs that are not eligible for this directory
Use this to explain "Your business type is not supported on [directory]"'
type: array
taxonomyWhitelist:
items:
type: string
title: taxonomy_whitelist lists business category IDs that are eligible (if specified, only these categories)
type: array
uberallId:
title: uberall_id is the directory's identifier in the Uberall system (if synced via Uberall)
type: string
updated:
description: Output only. When this directory configuration was last modified.
format: date-time
readOnly: true
type: string
yextId:
title: yext_id is the directory's identifier in the Yext system (if synced via Yext)
type: string
type: object
v1SyncRequirement:
default: SYNC_REQUIREMENT_UNSET
description: "SyncRequirement specifies what product activation is needed to automatically sync to a directory.\nThis explains why a directory might not be available for a particular business.\n\n - SYNC_REQUIREMENT_UNSET: SYNC_REQUIREMENT_UNSET means no specific requirement (e.g., manual submission via RM, or direct OAuth)\n - SYNC_REQUIREMENT_LSP: SYNC_REQUIREMENT_LSP requires an active Listing Sync Pro subscription (either Yext or Uberall)\n - SYNC_REQUIREMENT_PRO_EDITION: SYNC_REQUIREMENT_PRO_EDITION requires Local SEO Pro edition\n - SYNC_REQUIREMENT_YEXT_LSP: SYNC_REQUIREMENT_YEXT_LSP specifically requires Yext-based Listing Sync Pro\nThis directory is only available through Yext, not Uberall\n - SYNC_REQUIREMENT_UBERALL_LSP: SYNC_REQUIREMENT_UBERALL_LSP specifically requires Uberall-based Listing Sync Pro\nThis directory is only available through Uberall, not Yext\n - SYNC_REQUIREMENT_LSP_OR_PRO_EDITION: SYNC_REQUIREMENT_LSP_OR_PRO_EDITION requires either Listing Sync Pro OR Local SEO Pro"
enum:
- SYNC_REQUIREMENT_UNSET
- SYNC_REQUIREMENT_LSP
- SYNC_REQUIREMENT_PRO_EDITION
- SYNC_REQUIREMENT_YEXT_LSP
- SYNC_REQUIREMENT_UBERALL_LSP
- SYNC_REQUIREMENT_LSP_OR_PRO_EDITION
type: string
v1GetListingSourceByIdResponse:
description: Contains comprehensive directory configuration and constraints for a single listing source.
properties:
source:
$ref: '#/components/schemas/v1Source'
title: GetListingSourceByIdResponse
type: object
v1PartnerOverride:
properties:
adminNotes:
type: string
claimListingHtml:
type: string
createListingHtml:
type: string
descriptionHtml:
type: string
editListingHtml:
type: string
editListingUrl:
type: string
iconClass16px:
type: string
iconClass32px:
type: string
iconClass50px:
type: string
iconUrl16px:
type: string
iconUrl32px:
type: string
iconUrl50px:
type: string
name:
type: string
title: Partner specific source overrides
type: object
v1GetListingSourceByIdRequest:
description: Request to retrieve detailed configuration for a specific listing directory by its numeric ID.
properties:
fieldMask:
$ref: '#/components/schemas/vendastatypesFieldMask'
sourceId:
description: 'Required. The numeric ID of the directory (e.g., 1 = Google, 2 = Facebook, etc.).
You can get this ID from the source_id field in GetSyncDataResponse.'
format: int64
type: string
required:
- sourceId
title: GetListingSourceByIdRequest
type: object
vendastatypesFieldMask:
description: "paths: \"f.a\"\n paths: \"f.b.d\"\n\nHere `f` represents a field in some root message, `a` and `b`\nfields in the message found in `f`, and `d` a field found in the\nmessage in `f.b`.\n\nField masks are used to specify a subset of fields that should be\nreturned by a get operation or modified by an update operation.\nField masks also have a custom JSON encoding (see below).\n\n# Field Masks in Projections\n\nWhen used in the context of a projection, a response message or\nsub-message is filtered by the API to only contain those fields as\nspecified in the mask. For example, if the mask in the previous\nexample is applied to a response message as follows:\n\n f {\n a : 22\n b {\n d : 1\n x : 2\n }\n y : 13\n }\n z: 8\n\nThe result will not contain specific values for fields x,y and z\n(their value will be set to the default, and omitted in proto text\noutput):\n\n\n f {\n a : 22\n b {\n d : 1\n }\n }\n\nA repeated field is not allowed except at the last position of a\npaths string.\n\nIf a FieldMask object is not present in a get operation, the\noperation applies to all fields (as if a FieldMask of all fields\nhad been specified).\n\nNote that a field mask does not necessarily apply to the\ntop-level response message. In case of a REST get operation, the\nfield mask applies directly to the response, but in case of a REST\nlist operation, the mask instead applies to each individual message\nin the returned resource list. In case of a REST custom method,\nother definitions may be used. Where the mask applies will be\nclearly documented together with its declaration in the API. In\nany case, the effect on the returned resource/resources is required\nbehavior for APIs.\n\n# Field Masks in Update Operations\n\nA field mask in update operations specifies which fields of the\ntargeted resource are going to be updated. The API is required\nto only change the values of the fields as specified in the mask\nand leave the others untouched. If a resource is passed in to\ndescribe the updated values, the API ignores the values of all\nfields not covered by the mask.\n\nIf a repeated field is specified for an update operation, the existing\nrepeated values in the target resource will be overwritten by the new values.\nNote that a repeated field is only allowed in the last position of a `paths`\nstring.\n\nIf a sub-message is specified in the last position of the field mask for an\nupdate operation, then the existing sub-message in the target resource is\noverwritten. Given the target message:\n\n f {\n b {\n d : 1\n x : 2\n }\n c : 1\n }\n\nAnd an update message:\n\n f {\n b {\n d : 10\n }\n }\n\nthen if the field mask is:\n\n paths: \"f.b\"\n\nthen the result will be:\n\n f {\n b {\n d : 10\n }\n c : 1\n }\n\nHowever, if the update mask was:\n\n paths: \"f.b.d\"\n\nthen the result would be:\n\n f {\n b {\n d : 10\n x : 2\n }\n c : 1\n }\n\nIn order to reset a field's value to the default, the field must\nbe in the mask and set to the default value in the provided resource.\nHence, in order to reset all fields of a resource, provide a default\ninstance of the resource and set all fields in the mask, or do\nnot provide a mask as described below.\n\nIf a field mask is not present on update, the operation applies to\nall fields (as if a field mask of all fields has been specified).\nNote that in the presence of schema evolution, this may mean that\nfields the client does not know and has therefore not filled into\nthe request will be reset to their default. If this is unwanted\nbehavior, a specific service may require a client to always specify\na field mask, producing an error if not.\n\nAs with get operations, the location of the resource which\ndescribes the updated values in the request message depends on the\noperation kind. In any case, the effect of the field mask is\nrequired to be honored by the API.\n\n## Considerations for HTTP REST\n\nThe HTTP kind of an update operation which uses a field mask must\nbe set to PATCH instead of PUT in order to satisfy HTTP semantics\n(PUT must only be used for full updates).\n\n# JSON Encoding of Field Masks\n\nIn JSON, a field mask is encoded as a single string where paths are\nseparated by a comma. Fields name in each path are converted\nto/from lower-camel naming conventions.\n\nAs an example, consider the following message declarations:\n\n message Profile {\n User user = 1;\n Photo photo = 2;\n }\n message User {\n string display_name = 1;\n string address = 2;\n }\n\nIn proto a field mask for `Profile` may look as such:\n\n mask {\n paths: \"user.display_name\"\n paths: \"photo\"\n }\n\nIn JSON, the same mask is represented as below:\n\n {\n mask: \"user.displayName,photo\"\n }\n\n# Field Masks and Oneof Fields\n\nField masks treat fields in oneofs just as regular fields. Consider the\nfollowing message:\n\n message SampleMessage {\n oneof test_oneof {\n string name = 4;\n SubMessage sub_message = 9;\n }\n }\n\nThe field mask can be:\n\n mask {\n paths: \"name\"\n }\n\nOr:\n\n mask {\n paths: \"sub_message\"\n }\n\nNote that oneof type names (\"test_oneof\" in this case) cannot be used in\npaths."
properties:
paths:
description: The set of field mask paths.
items:
type: string
type: array
title: '`FieldMask` represents a set of symbolic field paths, for example:'
type: object
v1GetListingSourcesResponse:
description: Contains a map of all listing sources keyed by source ID.
properties:
fieldMask:
$ref: '#/components/schemas/vendastatypesFieldMask'
sources:
additionalProperties:
$ref: '#/components/schemas/v1Source'
description: Output only. Map of source_id to directory configuration.
readOnly: true
type: object
title: GetListingSourcesResponse
type: object
v1Provider:
default: PROVIDER_UNSPECIFIED
description: "Provider indicates how listing data is synced to a directory.\nThis is critical for understanding the difference between managed (LSP) and manual (RM) listings.\n\n - PROVIDER_UNSPECIFIED: PROVIDER_UNSPECIFIED means manual submission via Reputation Management (RM).\nThese listings must be manually created and updated by the user.\nThey do NOT automatically sync when the business profile changes.\n - PROVIDER_UBERALL: PROVIDER_UBERALL means synced automatically via Uberall (LSP provider for European/international directories).\nRequires active Listing Sync Pro subscription with Uberall.\n - PROVIDER_YEXT: PROVIDER_YEXT means synced automatically via Yext (LSP provider for North American directories).\nRequires active Listing Sync Pro subscription with Yext.\n - PROVIDER_DIRECT: PROVIDER_DIRECT means synced directly via OAuth (Google, Facebook, Apple, Bing).\nNo LSP subscription required - user just needs to connect their account."
enum:
- PROVIDER_UNSPECIFIED
- PROVIDER_UBERALL
- PROVIDER_YEXT
- PROVIDER_DIRECT
type: string
protobufAny:
additionalProperties: {}
properties:
'@type':
type: string
type: object
v1GetListingSourcesRequest:
description: Request to fetch all listing sources, optionally filtered by provider.
properties:
fieldMask:
$ref: '#/components/schemas/vendastatypesFieldMask'
provider:
$ref: '#/components/schemas/v1Provider'
title: GetListingSourcesRequest
type: object
securitySchemes:
OAuth2:
flows:
authorizationCode:
authorizationUrl: https://sso-api-prod.apigateway.co/oauth2/auth
scopes:
admin: Allows the application to perform administrative tasks that you have access to across the platform
business-app: Allows the application to manage all features of Business App
tokenUrl: https://sso-api-prod.apigateway.co/oauth2/token
type: oauth2