Place Photos
Get photos and videos for a place by place_id. Returns photo URLs (standard and high-resolution), capture coordinates, and timestamps.
Endpoint
GET /v1/places/photos
Price: $0.003 per page Free tier: 50 requests/month
Parameters
| Parameter | Required | Description |
|---|---|---|
place_id |
Yes | Google place_id, as returned by the Places Search endpoint |
pages |
No | Number of pages to fetch, 1-10 (default: 1). Each page returns up to 100 items and is billed as one request |
country |
No | 2-letter ISO 3166-1 alpha-2 region code (default: us) |
language |
No | 2-letter ISO 639-1 language code (default: en) |
Response Fields
| Field | Type | Description |
|---|---|---|
photos |
array | Mixed array of photos and videos, aggregated across all fetched pages. Filter on the type field if you only want one |
photos[].photo_id |
string | Stable photo identifier |
photos[].type |
string | photo or video |
photos[].photo_url |
string | Standard-resolution image URL |
photos[].photo_url_large |
string | null | High-resolution image URL (typically 3000–4000px wide). null for items where no large variant exists (some videos and older photos) |
photos[].video_thumbnail_url |
string | null | Video thumbnail URL (set only when type is video) |
photos[].latitude |
number | null | Capture latitude |
photos[].longitude |
number | null | Capture longitude |
photos[].photo_datetime_utc |
string | ISO 8601 capture datetime (UTC) |
photos[].photo_timestamp |
integer | Unix timestamp (seconds) |
count |
integer | Total photos returned across all pages |
pages |
integer | Number of pages actually fetched (may be less than requested if photos ran out) |
Example Request
cURL
curl "https://apidirect.io/v1/places/photos?place_id=ChIJifIePKtZwokRVZ-UdRGkZzs&pages=2" \
-H "X-API-Key: YOUR_API_KEY"
Python
import requests
response = requests.get(
"https://apidirect.io/v1/places/photos",
headers={"X-API-Key": "YOUR_API_KEY"},
params={
"place_id": "ChIJifIePKtZwokRVZ-UdRGkZzs",
"pages": 2,
}
)
data = response.json()
print(f"Got {data['count']} photos across {data['pages']} pages")
Example Response
{
"photos": [
{
"photo_id": "CIABIhAViB6GuQB0Czq6u1UIyD60",
"type": "photo",
"photo_url": "https://lh3.googleusercontent.com/gps-cs-s/APNQkAH...",
"photo_url_large": "https://lh3.googleusercontent.com/gps-cs-s/APNQkAH...=w4280-h3407-k-no",
"video_thumbnail_url": null,
"latitude": 40.7546469,
"longitude": -73.9868158,
"photo_datetime_utc": "2026-05-30T00:00:00.000Z",
"photo_timestamp": 1780099200
},
{
"photo_id": "CIHM0ogKEICAgICGgNfJ4wE",
"type": "video",
"photo_url": "https://lh3.googleusercontent.com/gps-cs-s/...",
"photo_url_large": null,
"video_thumbnail_url": "https://lh3.googleusercontent.com/gps-cs-s/...=w640-h360-k-no",
"latitude": 40.7546795,
"longitude": -73.9870291,
"photo_datetime_utc": "2021-11-16T00:00:00.000Z",
"photo_timestamp": 1637020800
}
],
"count": 200,
"pages": 2
}
Notes
photo_url_largeis the full-resolution version of the photo. Some videos and older photos don’t have a large variant — the field isnullin that case.- The
typefield is"photo"or"video". Filter client-side if you only want one. - Photos are typically returned newest-first based on upload date.
- If a place has fewer photos than
pages * 100, the response stops early. Billing is based on the requestedpagesvalue, so set it to the smallest count that fits your needs.