POST/api/v4/locations

Create a location

Creates a new business location in your account and queues it for listing submission.

Requires an API key. See Authentication for header format and key rotation.

Parameters

Body

A nested field marked required applies only when you send its parent. If the parent is optional and you omit it, its required children do not apply.

NameTypeRequiredDescription
input.namestringrequiredName of the business.
input.descriptionstringrequiredBusiness description, minimum 200 characters (`SY10005` when missing or shorter). Publishers use it as the primary listing copy.
input.storeIdstringoptionalUnique store code. Must be unique across the account.
input.streetstringrequiredStreet address, 5 to 100 characters (`SY10011`).
input.citystringrequiredCity. Required where the country's `hasCity` is `true` (`SY10126`). Where it is `false`, a city you send is dropped.
input.stateIsostringrequiredState ISO code. Required where the country's `stateRequired` is `true`, and must be one of that country's `states` (`SY10010`). Leave it out where `stateRequired` is `false`. See the countries and states endpoint for valid values.
input.postalCodestringoptionalPostal code. Optional, but send it wherever the country's `hasPostalCode` is `true`. A value you send must match the country's format (`SY10014`).
input.countryIsostringrequiredCountry ISO code. Must be a supported country (`SY10036`). See the countries and states endpoint for valid values.
input.phonestringrequiredPrimary phone number, validated for the country (`SY10015`).
input.subCategoryIdintegerrequiredPrimary subcategory ID. Pick a valid ID from the subcategories list endpoint.
input.bizUrlstringrequiredBusiness website URL. Published to directories as the location's website. Some publishers refuse a listing without one.
input.primaryGbpSiteCategoryIdstringoptionalPrimary Google Business Profile category, as a GCID (e.g. `gcid:restaurant`). Resolved against `countryIso`, so send the two together.
input.additionalGbpSiteCategoryIdsarray of stringsoptionalAdditional Google Business Profile categories, as GCIDs. Also resolved against `countryIso`.
input.offeringsUrlstringoptionalURL of the menu, catalogue, or service list.
input.bookingUrlstringoptionalURL customers use to book an appointment.
input.reservationUrlstringoptionalURL customers use to make a reservation.
input.street1stringoptionalSecond address line (suite, unit, floor).
input.latitudestringoptionalLatitude of the location, as a string. Send with `longitude`; publishers use it when the address alone is ambiguous.
input.longitudestringoptionalLongitude of the location, as a string. Send with `latitude`.
input.ownerEmailstringoptionalEmail of the location owner. Used for listing claims and verification, not for login.
input.ownerNamestringoptionalName of the location owner.
input.facebookUrlstringoptionalURL of the location's Facebook page.
input.twitterUrlstringoptionalURL of the location's X (Twitter) profile.
input.linkedinUrlstringoptionalURL of the location's LinkedIn page.
input.instagramUrlstringoptionalURL of the location's Instagram profile.
input.youtubeUrlstringoptionalURL of the location's YouTube channel.
input.tiktokUrlstringoptionalURL of the location's TikTok profile.
input.pinterestUrlstringoptionalURL of the location's Pinterest profile.
input.taglinestringoptionalShort tagline for the business.
input.yearOfIncorporationstringoptionalYear the business was incorporated, e.g. `2014`.
input.googleAdsPhonestringoptionalAlternate phone shown on Google Ads location extensions instead of `phone`.
input.additionalPhonesarray of stringsoptionalSecondary phone numbers submitted to Google Business Profile.
input.videosarray of stringsoptionalVideo URLs for the location.
input.additionalCategoryIdsarray of integersoptionalSecondary Listings API subcategory IDs, from the subcategories endpoint. Distinct from `additionalGbpSiteCategoryIds`, which takes Google GCIDs.
input.submissionDisabledSiteIdsarray of integersoptionalSite IDs to exclude from submission. The inverse of `enabledSiteIds`, useful when you want every site in your plan except a few.
input.hideAddressbooleanoptionalSet `true` for a service-area business. ListingsAPI stores the address you send but does not submit it to publishers.
input.temporarilyClosedbooleanoptionalSet `true` to stop publishing business hours while the location is temporarily closed.
input.serviceItemsarray of objectsoptionalServices offered, published to Google Business Profile.
input.customAttributesarray of objectsoptionalPublisher-specific attributes for the location.
input.paymentMethodsarray of stringsoptionalPayment methods accepted. One or more of `VISA`, `MASTERCARD`, `AMEX`, `CASH`, `CHEQUE`, `CRYPTO`, `DINERS_CLUB`, `DISCOVER`, `FINANCING`, `INVOICE`, `TRAVELERS_CHECK`, `APPLE_PAY`, `SAMSUNG_PAY`, `PAYPAL`, `ANDROID_PAY`.
input.businessHoursarray of objectsoptionalOpening hours. Each entry is `{ day, type, slots }`, plus `specialDate` for a `SPECIAL` entry: `day` is an uppercase weekday enum (MONDAY–SUNDAY) or `SPECIAL`, `type` is `OPEN` or `CLOSED`, and `slots` is an array of `{ start, end }` time strings (e.g. `09:00am`, `05:00pm`). For a closed day use `type: "CLOSED"` with an empty `slots` array.
input.businessHours[].daystringrequiredMONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY, or SPECIAL (a one-off override for the date in `specialDate`).
input.businessHours[].typestringrequired`OPEN` or `CLOSED`.
input.businessHours[].specialDatestringoptionalDate of a one-off override, as `YYYY-MM-DD`. Set this only when `day` is `SPECIAL`.
input.businessHours[].slotsarray of objectsoptionalOpen intervals for the day, each `{ start, end }`. Omit or leave empty when `type` is `CLOSED`.
input.businessHours[].slots[].startstringrequiredOpening time, e.g. `09:00am`.
input.businessHours[].slots[].endstringrequiredClosing time, e.g. `05:00pm`.
input.serviceAreaobjectoptionalService-area definition for service-area businesses: `{ businessType, regionCode, placeInfos: [{ placeId, placeName }] }`.
input.placeActionLinksarray of objectsoptionalGoogle action links (ordering, delivery, takeout, reservation, appointment). Each item: `placeActionType` (enum), `uri` (string), optional `isPreferred` (boolean). On create every link is new, so no `action` is needed. See the Place Action Links guide.
input.enabledSiteIdsarray of integersoptionalSite IDs to publish this location to, when you want a subset of your plan's sites. See the plan-sites endpoint for valid IDs. Omit to publish to every site in your plan.
input.clientMutationIdstringoptionalOptional correlation token returned unchanged in the response. It does not prevent duplicate writes: the server does not detect repeated calls that reuse the same value.

Sample request

Ready-to-paste body. Replace placeholder IDs and values with yours.

Request body
{  "input": {    "name": "Acme Kitchen",    "description": "Acme Kitchen is a family-owned neighborhood restaurant in downtown New York serving wood-fired pizza, hand-rolled pasta, and a short seasonal menu built around produce from nearby growers. Our dining room seats forty, takeout and delivery run until close, and the bar pours regional wine and beer on tap.",    "storeId": "ACME01",    "street": "123 Jump Street",    "city": "New York",    "stateIso": "NY",    "postalCode": "10013",    "countryIso": "US",    "phone": "6443859313",    "bizUrl": "https://acmekitchen.example.com",    "subCategoryId": 1432,    "primaryGbpSiteCategoryId": "gcid:restaurant",    "additionalGbpSiteCategoryIds": ["gcid:pizza_restaurant"],    "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": "FOOD_ORDERING", "uri": "https://order.acmekitchen.example.com", "isPreferred": true },      { "placeActionType": "FOOD_TAKEOUT", "uri": "https://takeout.acmekitchen.example.com" }    ]  }}

Responses

200Location created successfully. Returns the new location as a summary object.
Response
{  "data": {    "createLocation": {      "clientMutationId": null,      "success": true,      "errors": null,      "location": {        "id": "TG9jYXRpb246MTgwMDI5MA==",        "databaseId": 1800290,        "storeId": "ACME01",        "name": "Acme Kitchen",        "street": "123 Jump Street",        "city": "New York",        "stateIso": "NY",        "postalCode": "10013",        "countryIso": "US",        "phone": "6443859313",        "status": "PENDING",        "primaryGbpSiteCategoryId": null,        "placeActionLinks": [          { "placeActionType": "FOOD_ORDERING", "uri": "https://order.acmekitchen.example.com", "isPreferred": true, "name": null, "submissionStatus": null },          { "placeActionType": "FOOD_TAKEOUT", "uri": "https://takeout.acmekitchen.example.com", "isPreferred": false, "name": null, "submissionStatus": null }        ],        "discoveredPlaceActionLinks": []      }    }  }}
400Bad request, validation failure (see `errors[]`).
401Unauthenticated, missing or invalid API key.
429Rate limit exceeded. Retry after the `Retry-After` header value.

Creates a new business location. On success the location is queued for submission to every publisher in its plan (or, when enabledSiteIds is supplied, just those sites). Required fields: name, a description of at least 200 characters, subCategoryId, countryIso, and, for countries with city-level addressing, city. A location also needs a valid street address and phone before it can actually publish, supply them at create time to avoid a follow-up update.

The returned id is base64-encoded (e.g. TG9jYXRpb246MTgwMDI5MA==); decode it to reveal the internal Location:<databaseId> form. Every subsequent call references this base64 id.

Use case: onboard a single storefront with hours. Send the address, phone, subCategoryId, and a businessHours array, one entry per weekday with type: "OPEN" and { start, end } slots, or type: "CLOSED" with an empty slots array for closed days. Store your own key in storeId so you can later resolve the location via get by store codes without tracking Listings API's ID.

Special hours require regular hours. Special hours (holiday or event overrides, sent as businessHours entries with day: "SPECIAL", type: "OPEN" or "CLOSED", and a specialDate in YYYY-MM-DD form) only publish when the location also carries its regular MONDAY–SUNDAY schedule, Google rejects a location submitted with special hours but no regular hours. Always include the full seven-day businessHours week whenever you set SPECIAL entries; see the update endpoint's hours rules for the full model.

Use case: publishing to a site subset. Pass enabledSiteIds (site IDs from the plan-sites endpoint) to publish the location to a curated subset of directories rather than the full plan, the pattern agencies use to sell tiered site coverage.

Seed Google action buttons at create time. Pass placeActionLinks to set the location's Google action buttons (book an appointment, order online, and so on) in the same call. Valid placeActionType values are APPOINTMENT, ONLINE_APPOINTMENT, DINING_RESERVATION, FOOD_ORDERING, FOOD_DELIVERY, FOOD_TAKEOUT, and SHOP_ONLINE, with at most one preferred link per type. Right after create, each link's name and submissionStatus are null until it syncs to Google. To add, edit, or remove links later, use update a location; see the Place Action Links guide for the full model.

Common errors (returned as 400 with detail in errors[]): description must be at least 200 characters (SY10005), countryIso must be a supported country (SY10036), city is mandatory for countries with city-level addressing (SY10126), state must be a valid ISO code, postal code and phone must be valid for the country, subCategoryId must exist, and storeId must be unique across the account. Every request costs the same against your rate limit regardless of endpoint, so high-volume onboarding trips a 429 on request count alone, honor the Retry-After header and create sequentially rather than in a burst.

Request
curl -X POST 'https://listingsapi.com/api/v4/locations' \  -H "Authorization: API $LISTINGSAPI_KEY" \  -H 'Content-Type: application/json' \  -d '{    "input": {      "name": "Acme Kitchen",      "description": "Acme Kitchen is a family-owned neighborhood restaurant in downtown New York serving wood-fired pizza, hand-rolled pasta, and a short seasonal menu built around produce from nearby growers. Our dining room seats forty, takeout and delivery run until close, and the bar pours regional wine and beer on tap.",      "storeId": "ACME01",      "street": "123 Jump Street",      "city": "New York",      "stateIso": "NY",      "postalCode": "10013",      "countryIso": "US",      "phone": "6443859313",      "bizUrl": "https://acmekitchen.example.com",      "subCategoryId": 1432,      "primaryGbpSiteCategoryId": "gcid:restaurant",      "additionalGbpSiteCategoryIds": [        "gcid:pizza_restaurant"      ],      "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": "FOOD_ORDERING",          "uri": "https://order.acmekitchen.example.com",          "isPreferred": true        },        {          "placeActionType": "FOOD_TAKEOUT",          "uri": "https://takeout.acmekitchen.example.com"        }      ]    }  }'