Google Maps Scraper - Most Comprehensive avatar

Google Maps Scraper - Most Comprehensive

Pricing

from $0.06 / 1,000 places

Go to Apify Store
Google Maps Scraper - Most Comprehensive

Google Maps Scraper - Most Comprehensive

πŸ”₯ ~$0.06/1K places πŸ”₯ The most comprehensive Google Maps scraper available. Extract 76+ fields per place including photos, review breakdowns, owner info, contacts, coordinates, and 30+ service options. Just type a keyword and location.

Pricing

from $0.06 / 1,000 places

Rating

5.0

(2)

Developer

Kai

Kai

Maintained by Community

Actor stats

16

Bookmarked

1.4K

Total users

250

Monthly active users

1.1 days

Issues response

10 hours ago

Last modified

Share

The most comprehensive Google Maps scraper available. Extract up to ~120 fields per place, plus emails and social profiles from each business's own website. Get structured menus, Google AI summaries, photos with author and location data, videos, reviews with owner replies, popular times, and 30+ service options.

Collect public Google Maps place records from a search, company name, Place ID, or Google Maps URL. Just type what you're looking for and where. Starting at $0.06 per 1,000 places.

Use cases

  • Lead generation - build prospect lists with business names, phone numbers, websites, emails, and social profiles for any area
  • Competitive analysis - compare ratings, review counts, pricing, and service options across competitors
  • Market research - map business density, popular times, and pricing patterns across regions
  • Location intelligence - analyze neighborhoods, foot traffic patterns, and accessibility options
  • Review monitoring - track review topics, sentiment, and rating breakdowns over time
  • Menu and pricing data - extract structured menus, popular dishes, and price ranges from restaurants

Why this scraper?

This scraperGoogle Places APIOther Apify scrapers
Price per 1,000 places$0.06-0.08$20-40$0.40-5, before add-ons
Fields per placeUp to ~12050+ (paid tiers)About 10-100
Emails and social profilesFrom each business's own website, with no add-on fee (includeContacts)Not availablePaid add-on (about $0.40-4 per 1,000 places) or not available
Structured menuSections, items, and pricesNot availableMenu URL only
Google AI summariesPlace, review, neighborhood, and EV amenity summariesSame summaries, at the $25 per 1,000 tierNot available
Third-party ratingsTripAdvisor and Trip.com ratings and review countsNot availableNot available
VideosStream URLs (MP4, DASH, HLS) with author infoNot availableNot available
PhotosAll available photos with author, upload date, captions, and photo coordinates. $0.01 per 1,000 photos$7 per 1,000 photosPhotos with author and upload date. Up to $0.50 per 1,000 images
Popular timesHourly busyness with wait timesNot availableHourly and live busyness, often as a paid add-on
ReviewsUp to 5 featured reviews per place, with owner replies and aspect ratingsUp to 5 reviews, at the $25 per 1,000 tierAll reviews at some scrapers, charged per review
Company lookupName and city targets. Each result links to its input row (inputIndex)Text searchSearch text only, with no link to the input row

The most-used Google Maps scrapers in the Apify Store do not return these (checked in September 2026):

  • Structured menus with sections, items, and prices (rich). Other scrapers return only a menu URL.
  • Wait times for each hour of popular times (rich).
  • TripAdvisor and Trip.com ratings and review counts for hotels (rich).
  • Videos with MP4, DASH, and HLS stream URLs (includePhotos).
  • Google AI summaries: place, review, neighborhood, and EV amenity summaries (every mode).
  • Address descriptors: nearby landmarks and areas, and where the place is relative to them (every mode).
  • Company lookup that links each result to its input row (every mode).

Also:

  • Emails and social profiles at no add-on fee. Other scrapers charge about $0.40-4 per 1,000 places for them.
  • Photos at $0.01 per 1,000, with author, upload date, captions, and photo coordinates.
  • One place price for every detail level. Only photos have a separate charge. Other scrapers charge extra for place details, reviews, and images.

Choose how to find places

Starting pointInput sourceUse it for
A category, product, or place descriptionquery or searchTermsDiscover places in an area
A name or address near one pointquery with searchType: "nearby"Find the closest matching businesses
Known Google Place IDs or Maps URLsplaceIdsEnrich specific places in the supplied order
Company names and locationscompaniesMatch each company target and return its inputIndex

If you provide more than one source, the Actor uses companies first, then placeIds, then searchTerms, and then query.

Choose a detail level

ModeFieldsBest for
basic (default)~50Core data, fastest. Names, addresses, ratings, hours, coordinates, service options, and AI summaries
detailed~80Everything in basic, plus a fuller property record. Finds more places per area
rich~120Everything in detailed, plus popular times, photos, videos, full reviews, review breakdowns, menus, and owner info

Full photo listings are controlled separately by includePhotos and maxPhotos. They can be enabled in any mode.

Every place includes (basic):

  • Basic info: name, categories, rating, review count, description, business type, price range (with currency, e.g. "USD 10–20"), business status, primary type display name
  • Contact: phone (local + international), second phone number, website, website domain
  • Address: full + short address, structured fields (street, city, state, postal code, country code), plus code, structured address components (with sublocality, county, country)
  • Location: latitude, longitude, timezone, UTC offset minutes, viewport
  • Hours: business hours by day, open/closed status, secondary hours (breakfast, delivery, takeout, kitchen), holiday warnings, hours confirmation timestamp
  • Reviews: featured reviews with full text and owner replies, review link, AI review summary
  • Services: dine-in, takeout, delivery, drive-through, outdoor seating, and 30+ service option flags
  • AI summaries: generative summary, review summary, neighborhood summary, EV amenity summary
  • Options: parking, payment, accessibility options, EV charge options (with live connector availability), fuel options (with real-time prices)
  • Links: Google Maps link, directions, reviews, photos URLs
  • Places inside: sub-destinations (e.g. stores inside a mall)
  • Identifiers: place ID, data ID, knowledge graph ID, Google category ID (GCID)

Detailed adds:

  • More location data: neighborhood, area, entrance coordinates, floor, short description
  • Business details: claimed status, verified status, chain/franchise flag, hotel stars, amenities, reservation links, menu link, price label
  • Descriptions: subtitle, owner description, third-party description
  • Local info: local name and language
  • Profile image: place profile image URL
  • Reviews: review highlights, review summary
  • Search metadata: rank position, advertisement flag, place attributes
  • Order online: links to ordering platforms
  • Related places: related place names

Rich mode adds:

  • Popular times: hourly busyness and wait times for each day of the week, typical time spent (text + structured minutes)
  • Photos: all available photos with unique ID, full URLs, dimensions, author info, geo-coordinates, captions, upload dates, upload source, owner upload detection
  • Videos: unique ID, thumbnails, streams (MP4/DASH/HLS) with correct dimensions, duration, author info
  • Reviews breakdown: rating per star (1-5), full review text, author profile URLs, owner replies, aspect ratings (Food, Service, etc.), review topics with mention counts
  • Owner info: owner name, owner profile link, owner avatar, owner posts with CTA links
  • Street View: thumbnail image URL and panorama ID
  • Third-party reviews: TripAdvisor and Trip.com ratings, review counts, and URLs (hotels)
  • Structured menu: menu sections, items with prices, popular dishes
  • Related: people also search, region hierarchy, image categories with counts

Website contacts (any mode, with includeContacts):

  • Emails: addresses from the business's own website, best match first
  • Social profiles: Facebook, Instagram, LinkedIn, X, YouTube, TikTok, Pinterest, and WhatsApp
  • Visit result: whether the website was read, skipped, blocked, or unavailable

Search an area

Start with a query and a location:

{
"query": "coffee shops",
"location": "San Francisco, CA"
}

For searchType: "area", the location sets the center of a rectangle. It does not select a city boundary. The rectangle extends approximately radius north, south, east, and west of that center. Its corners can be farther from the center than radius. For example, a 40 km area search covers a rectangle approximately 80 km wide and 80 km high.

Area search returns only places with valid coordinates inside that rectangle. The Actor tries to obtain coordinates for places whose position is unknown. It excludes places if their position remains unknown, including service-area businesses with no known position. The run log reports the excluded counts.

The Actor selects coordinates and address fields from one source. Valid Places API detail data takes priority, followed by Places API search data, then map search data. Missing address fields remain empty in the selected source. The Actor retains other available business details from the combined sources.

Set maxResults to set an upper limit on search results. The Actor can return fewer valid places. Use 0 to remove the Actor limit:

{
"query": "restaurants",
"location": "Tokyo, Japan",
"maxResults": 500
}

Cover a larger or dense area

Increase radius to cover a wider area. Add several searchTerms when one broad category can appear under different names. For a dense city centre, set exhaustive to true.

{
"searchTerms": ["gas station", "petrol station"],
"location": "Denver, CO",
"radius": 50,
"radiusUnit": "mi",
"maxResults": 1000,
"exhaustive": true
}

Include rich place details

Use mode: "rich" for structured menus, popular times with wait times, TripAdvisor and Trip.com ratings, review details, and owner information:

{
"query": "restaurants",
"location": "New York, NY",
"mode": "rich"
}

Find emails and social profiles

Google Maps does not publish business emails. Set includeContacts to read them from each place's own website:

{
"query": "dentists",
"location": "Austin, TX",
"includeContacts": true
}

See Website contacts for how the Actor finds and ranks them.

Search near exact coordinates

If you have specific coordinates, use latitude and longitude instead of location:

{
"query": "dentists",
"latitude": 40.7128,
"longitude": -74.0060,
"zoom": 12,
"maxResults": 200
}

Request another result language

{
"query": "hotels",
"location": "Paris, France",
"language": "fr"
}

Find a specific business near a point

Use searchType: "nearby" with a narrow radius. Include the full address in query when you have it.

{
"query": "Aegis Health and Rehabilitation 1441 Charic Dr, Wildwood, MO 63021",
"location": "Wildwood, MO",
"searchType": "nearby",
"radius": 1
}

Nearby search returns the basic field set and can return about 60 results at most.

Look up known places or companies

Use a Place ID or full Google Maps URL when you already know the place:

{
"placeIds": ["ChIJR3WssQNZwokRLG6SQTtwaI0"],
"mode": "rich",
"includePhotos": true,
"maxPhotos": 3
}

Use a company target when you need to link each result to an input row:

{
"companies": [
{
"name": "Google",
"city": "Mountain View",
"state": "CA",
"country": "US"
}
],
"maxResultsPerCompany": 2
}

Company results contain inputIndex. The value is the zero-based position in the companies array.

Input

Provide one of query, searchTerms, placeIds, or companies. Searches also need location or both latitude and longitude. If you give more than one source, companies has first priority, then placeIds, then searchTerms, then query.

The complete examples below cover area search, nearby search, direct lookup, company lookup, and every input field.

Input reference

ParameterTypeDefaultEffect
querystringnoneOne search term. searchTerms replaces it when that array is not empty.
searchTermsstring[]noneSeveral terms to search and merge.
locationstringnoneCity, address, or area used to find the search center. It does not select a city boundary. You can use both coordinates instead.
maxResultsinteger, 0 or more20Upper limit on search results; fewer valid places can be available. Place-ID lookup uses the number of submitted IDs. Company lookup uses maxResultsPerCompany. 0 removes this search limit.
modebasic, detailed, or richbasicControls result coverage and fields. detailed can find more places per area. rich returns the same place set as detailed and adds videos, featured reviews, owner posts, and other optional fields.
openNowbooleannoneKeeps places that Google reports as open now.
minRatingnumbernoneKeeps ratings 2, 2.5, 3, 3.5, 4, or 4.5 and higher.
priceLevelsstring[]noneKeeps Google price levels "1", "2", "3", and/or "4".
includePhotosbooleanfalseAdds full photo listings. maxPhotos sets the per-place limit.
maxPhotosinteger, 0 or more200Maximum photos for each place. 0 requests all available photos.
includeContactsbooleanfalseVisits each place's own website to find emails and social profiles. Works with any mode.
placeIdsstring[]nonePlace IDs or full Google Maps URLs. The Actor keeps the input order and repeated IDs.
companiesobject[]noneCompany targets with required name and city, and optional state and country.
maxResultsPerCompanyinteger, 1 to 201Maximum places for each company target.
languagestringenGoogle language code for names, descriptions, and reviews.
searchTypearea or nearbyareaarea returns places with valid coordinates inside the search rectangle. It excludes unknown positions and reports their count in the log. nearby uses one point and has a Google limit of about 60 results.
exhaustivebooleanfalseSearches more parts of a dense area.
radiusnumber, 1 or more50In area search, the approximate distance from the center to each north, south, east, and west edge. In nearby search, the radius used to prefer nearby results. The Actor limits the converted value to 5,000 km.
radiusUnitkm or mikmUnit for radius.
zoominteger, 5 to 2013Map zoom for area search. A larger number selects a smaller map area.
latitudenumbernoneExact centre latitude. You must also give longitude.
longitudenumbernoneExact centre longitude. You must also give latitude.
proxyConfigurationobject{"useApifyProxy":true}Optional connection settings for the run.

Output

Each Dataset item is one place. Company results also contain inputIndex, which links the record to its companies[] item. Documented root fields remain present when Google supplies null, [], or {}.

Long arrays below keep one item. Square brackets mark values removed from the documentation, not values returned by the Actor. These selected examples are not saved Dataset items.

Field groups

GroupRoot fields
Search contextinputIndex, matchedQuery, rank, isAdvertisement, meta
Identity and typeplaceId, dataId, title, categories, businessType, primaryType, primaryTypeDisplayName, googleMapsTypeLabel, googleCategoryId, knowledgeGraphId, cid, placeTypes, placeAttributes, businessStatus, isChain, isClaimed, isVerified
Address and positionformattedAddress, shortAddress, adrFormatAddress, street, city, postalCode, state, countryCode, area, neighborhood, latitude, longitude, entranceLatitude, entranceLongitude, timezone, plusCode, floor, viewport, addressComponents, addressDescriptor, containingPlaceId, relatedPlaces, subDestinations, movedPlaceId, pureServiceAreaBusiness
Contact and descriptionswebsite, websiteDomain, phone, phoneIntl, phone2, phoneIntl2, description, subtitle, shortDescription, ownerDescription, thirdPartyDescription, localName, localLanguage, googleMapsUri, googleMapsLinks
Hours and visit datahours, hoursStatus, holidayHoursNote, hoursConfirmation, popularTimes, typicalTimeSpent, typicalTimeSpentMinutes, openingDate, currentSecondaryOpeningHours, regularSecondaryOpeningHours, utcOffsetMinutes
Ratings and reviewsrating, reviewCount, reviewsLink, reviewsSummary, reviewsPerRating, reviewHighlights, featuredReviews, reviewTopics, thirdPartyReviews, generativeSummary, reviewSummaryApi
MediaprofileImageUrl, coverPhotoUrl, streetViewUrl, streetViewPanoId, photos, videos, photoTier, imagesCount, imageCategories, imageCategoryCounts, iconBackgroundColor, iconMaskBaseUri
Owner, menu, and bookingownerId, ownerName, ownerLink, ownerAvatarUrl, ownerPosts, reservationLinks, orderOnline, menuLink, menuStructured, popularDishes, priceRange, priceLabel, hotelStars
Amenities and contextamenities, serviceOptions, accessibilityOptions, parkingOptions, paymentOptions, peopleAlsoSearch, regionHierarchy
Special Google dataevChargeOptions, fuelOptions, evChargeAmenitySummary, neighborhoodSummary, consumerAlert
Website contactsemails, socialProfiles, contactsStatus

Root field types

JSON typeRoot fields
optional numberinputIndex
stringtitle
string or nullmatchedQuery, placeId, dataId, formattedAddress, shortAddress, street, city, postalCode, state, countryCode, website, timezone, description, subtitle, ownerDescription, phone, phoneIntl, phone2, phoneIntl2, hoursStatus, neighborhood, googleMapsUri, profileImageUrl, ownerId, cid, knowledgeGraphId, businessType, localName, localLanguage, area, primaryType, primaryTypeDisplayName, thirdPartyDescription, floor, plusCode, priceRange, priceLabel, reviewsLink, reviewsSummary, menuLink, businessStatus, typicalTimeSpent, shortDescription, holidayHoursNote, hoursConfirmation, websiteDomain, containingPlaceId, ownerName, ownerLink, coverPhotoUrl, streetViewUrl, streetViewPanoId, ownerAvatarUrl, googleCategoryId, generativeSummary, reviewSummaryApi, googleMapsTypeLabel, adrFormatAddress, iconBackgroundColor, iconMaskBaseUri, evChargeAmenitySummary, neighborhoodSummary, movedPlaceId, contactsStatus
numberimagesCount
number or nullrating, latitude, longitude, hotelStars, entranceLatitude, entranceLongitude, reviewCount, photoTier, rank, utcOffsetMinutes
booleanisClaimed, isAdvertisement, isVerified
boolean or nullisChain, pureServiceAreaBusiness
string[]categories, placeAttributes, relatedPlaces, reservationLinks, placeTypes, reviewHighlights, imageCategories, popularDishes
number[] or nullreviewsPerRating
string[] or nullemails
object[]amenities, subDestinations, photos, videos, featuredReviews, reviewTopics, peopleAlsoSearch, imageCategoryCounts, regionHierarchy, thirdPartyReviews, ownerPosts
object[] or nullhours, popularTimes, orderOnline, menuStructured, addressComponents
JSON value[] or nullcurrentSecondaryOpeningHours, regularSecondaryOpeningHours
objectserviceOptions, accessibilityOptions, parkingOptions, paymentOptions, meta
object or nulltypicalTimeSpentMinutes, googleMapsLinks, viewport, addressDescriptor, openingDate, socialProfiles
any JSON value or nullevChargeOptions, fuelOptions, consumerAlert

Nested field types

ObjectField types
hours[]day, hours: string
amenities[]category, name: string; available: boolean
subDestinations[]name: string; dataId, knowledgeGraphId: string or null; categories: string[]; latitude, longitude, rating, reviewCount: number or null
popularTimes[]day: string; hours: object[]. Each hour has numeric hour and busyness, and string label and waitTime.
orderOnline[]label, url: string
typicalTimeSpentMinutesmin, max: number
photos[]id: string or null; url: string; width, height: number; isOwnerUpload: boolean; authorName, authorUrl, authorPhotoUrl, authorId, caption, uploadSource, uploadDate: string or null; photoLatitude, photoLongitude: number or null
videos[]id: string or null; thumbnailUrl: string; width, height, durationMs: number; streams: object[]; isOwnerUpload: boolean; authorName, authorUrl, authorPhotoUrl, authorId, uploadSource, uploadDate: string or null; videoLatitude, videoLongitude: number or null. Each stream has string format and url, and numeric width and height.
featuredReviews[]authorName, text: string; authorAvatarUrl, authorProfileUrl, publishedDate, ownerReply: string or null; rating: number; aspectRatings: object[] or null, with string aspect and numeric rating
reviewTopics[]keyword: string; mentionCount: number
peopleAlsoSearch[]title: string; dataId, placeId: string or null; rating, reviewCount: number or null; categories: string[]
imageCategoryCounts[]category: string; count: number
regionHierarchy[]regionName: string; confidence: number or null
menuStructured[]section: string; items: object[]. Each item has string name, price as string or null, and variants as object[]. Each variant has string label and price as string or null.
thirdPartyReviews[]source: string; url, rating: string or null; reviewCount: number or null
ownerPosts[]date, ctaLabel, ctaUrl: string or null
addressComponents[]longText, shortText: string; types: string[]
googleMapsLinksdirectionsUri, placeUri, writeAReviewUri, reviewsUri, photosUri: string or null
viewportlow and high: objects with numeric latitude and longitude
addressDescriptorlandmarks, areas: JSON value[]
openingDateyear, month, day: number
socialProfilesfacebook, instagram, linkedin, twitter, youtube, tiktok, pinterest, whatsapp: string[] of profile URLs, at most 3 each
metascrapedAt: string

The option maps serviceOptions, accessibilityOptions, parkingOptions, and paymentOptions use boolean values. Other open Google objects can add or omit child keys.

Selected rich place fields

This redacted field example uses values from The Capital Grille. Populated child arrays keep one item. It is not a saved Dataset item.

Selected company-mode fields

Company mode adds inputIndex so that you can match a result to its input company. This selected example is not a saved Dataset item.

{
"inputIndex": 0,
"title": "Googleplex",
"placeId": "ChIJj61dQgK6j4AR4GeTYWZsKWw"
}

Selected hotel, sub-destination, and third-party review fields

These selected fields from Bvlgari Resort Dubai show hotel, sub-destination, and third-party review values. This is not a saved Dataset item.

{
"title": "Bvlgari Resort Dubai",
"hotelStars": 5,
"subDestinations": [
{
"name": "Bulgari Yacht order receiving area.",
"dataId": "0x3e5f436cc33d957d:0x2e3470ae5cbd19d",
"knowledgeGraphId": "/g/11ss7gcjff",
"categories": [
"Park"
],
"latitude": 25.208928999999998,
"longitude": 55.235141299999995,
"rating": 4.9,
"reviewCount": 12
}
],
"thirdPartyReviews": [
{
"source": "Tripadvisor",
"url": "[third-party review URL removed]",
"rating": "4.7",
"reviewCount": 590
}
]
}

Selected fuel fields

These selected fields from EG Ampol show a returned fuel value. This is not a saved Dataset item.

{
"title": "EG Ampol",
"fuelOptions": {
"fuelPrices": [
{
"type": "DIESEL",
"price": {
"currencyCode": "AUD",
"units": "2",
"nanos": 470000000
},
"updateTime": "2026-08-15T04:06:00Z"
}
]
}
}

Selected electric-vehicle charging fields

These selected fields from Tesla Supercharger show returned charging values. This is not a saved Dataset item.

{
"title": "Tesla Supercharger",
"evChargeOptions": {
"connectorCount": 12,
"connectorAggregation": [
{
"type": "EV_CONNECTOR_TYPE_TESLA",
"maxChargeRateKw": 250,
"count": 12
}
]
},
"evChargeAmenitySummary": null
}

Nullable and open fields

These fields can be null or empty. Their child values depend on the place and on data availability:

  • openingDate can contain year, month, and day.
  • imageCategoryCounts[] can contain category and count.
  • menuStructured[].items[].variants[] can contain label and price.
  • featuredReviews[].aspectRatings[] can contain aspect and rating.
  • popularDishes[] can contain strings.
  • evChargeAmenitySummary and neighborhoodSummary can contain generated text.
  • consumerAlert is an open Google object, and movedPlaceId can contain a place ID.

currentSecondaryOpeningHours, regularSecondaryOpeningHours, evChargeOptions, fuelOptions, and consumerAlert have open source-defined children. Do not depend on fixed positions in the secondary-hours arrays.

Search and field limits

How many places can I collect?

maxResults is an upper limit, not a required result count. Google can return fewer places than requested. Area search also excludes places outside the rectangle and places whose position remains unknown. Set maxResults to 0 to remove the Actor result limit.

Language and regional variation

Set language to a supported language code, such as ja for Japanese or de for German. Results and available fields can differ by country and language.

Rich fields and photos

Rich mode adds featured-review text, review breakdowns, and owner posts. For photos, full photo listings can be enabled in any mode with includePhotos; basic mode then uses the detailed field set.

Photo captions, third-party hotel reviews, owner replies, and aspect ratings appear only when Google supplies them. Optional fields can be null or empty.

Website contacts

Google Maps and the Google Places API do not publish business emails. With includeContacts, the Actor reads each place's website and up to 3 pages that it links to: contact, legal notice (for example, an Impressum), and about pages. It finds addresses in mailto: links, Cloudflare-protected addresses, schema.org data, page text, and common forms such as info [at] example [dot] com. It also reads addresses that the business wrote in its Google description and in its replies to reviews. It never reads the review text of customers.

emails puts the most likely business address first. Addresses on the website's own domain rank highest, then free mailboxes such as Gmail, then other domains. The Actor removes placeholders, image file names, tracking-service addresses, and the addresses of platforms such as delivery services. It also removes addresses whose domain cannot receive email, according to DNS. When the business has its own or a free mailbox, the Actor also removes other-domain addresses that appear only in a legal notice, such as those of regulators and hosting providers.

Each website visit has a time limit and a page-size limit. Places with the same website share one visit. The Actor uses the run's proxy configuration for these visits. Some websites show a contact form and no email, so emails can be [].

contactsStatus reports the website visit:

ValueMeaning
scrapedThe Actor read the website. emails can still be [].
no_websiteGoogle lists no website for the place.
skippedThe website is a social network, marketplace, directory, or booking platform page, such as Facebook, Tripadvisor, Yellow Pages, or Booking.com. The Actor does not read these pages, because they show the platform's contacts or other businesses. A social page is added to socialProfiles.
blockedThe website refused automated access.
failedThe website did not answer, returned an error, or is not an HTML page.

When includeContacts is off, emails, socialProfiles, and contactsStatus are null. Emails can be personal data. You are responsible for using them lawfully, for example under the GDPR and anti-spam laws.