Skip to content
Scrappa Get API key
Google Maps API 1 credit/request

Popular Times

GET https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea

Popular times of one Google Maps place: how busy it usually is for every hour of every opening day, the live busyness of the current hour when Google shows it, the typical visit duration and the busiest hours per day. One request costs 3 credits; failed requests and places without popular times are never charged. Pass the business_id (or place_id). The name of the place is read from Google Maps and checked against the result, so you never get the graph of another place. Send q with the exact place name to skip that lookup. Labels are always English. busyness_percent is relative to the busiest hour of the week (100). A value of null marks an hour outside opening time. Closed days are listed in closed_days and are missing from days. peak_hours is derived by Scrappa: the three busiest hours of each day.

Popular Times 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea
Auth header
x-api-key
Cost
1 credit/request
Response preview
200 OK
{
    "place": {
        "business_id": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
        "name": "Katz's Delicatessen",
        "address": "Katz's Delicatessen, 205 E Houston St, New York, NY 10002"
    },
    "current_day": "tuesday",
    "current_hour": 18,
    "live": {
        "day": "tuesday",
        "hour": 18,
        "hour_label": "6 PM",
        "busyness_percent": 51,
        "label": "A little busy",
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

This endpoint has no required query parameters.

3 optional filters available.

business_id string Optional

Google Maps business in google_id (0x...:0x...) or place_id (ChIJ...) format. Send this or place_id. Example: 0x89c2598f7ff4aa09:0x313547e757cb8cea

Example value 0x89c2598f7ff4aa09:0x313547e757cb8cea
place_id string Optional

Google place_id (ChIJ...). Alternative to business_id.

Example value 1234567890
q string Optional

Optional exact name of the place, for example Katz's Delicatessen New York. It replaces the name lookup. The Google result must show the same name, otherwise the request answers 404.

Example value coffee shops

Request Examples

PHP
<?php

$curl = curl_init();

curl_setopt_array($curl, [
    CURLOPT_URL => "https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "GET",
    CURLOPT_HTTPHEADER => [
        "x-api-key: YOUR_API_KEY_HERE"
    ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
    echo "cURL Error #:" . $err;
} else {
    echo $response;
}
PHP
<?php

use Illuminate\Support\Facades\Http;

$response = Http::timeout(30)
    ->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
    ->get('https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea');

if ($response->successful()) {
    echo $response->body();
} else {
    echo "Error: " . $response->status();
}
JavaScript
const options = {
    method: 'GET',
    headers: {
        'x-api-key': 'YOUR_API_KEY_HERE'
    }
};

fetch('https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea', options)
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error! status: ${response.status}`);
        }
        return response.text();
    })
    .then(data => console.log(data))
    .catch(error => console.error('Error:', error));
JavaScript
const axios = require('axios');

const options = {
    method: 'GET',
    url: 'https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea',
    headers: {
        x-api-key: 'YOUR_API_KEY_HERE',
    }
};

try {
    const response = await axios(options);
    console.log(response.data);
} catch (error) {
    console.error('Error:', error.message);
}
Ruby
require 'net/http'
require 'uri'

uri = URI.parse("https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'

request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'

begin
    response = http.request(request)
    puts response.body
rescue => e
    puts "Error: #{e.message}"
end
Python
import http.client
import json

conn = http.client.HTTPSConnection("scrappa.co")

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    conn.request("GET", "/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea", headers=headers)
    res = conn.getresponse()
    data = res.read()
    print(data.decode("utf-8"))
except Exception as e:
    print(f"Error: {e}")
finally:
    conn.close()
Python
import requests

headers = {
    'x-api-key': 'YOUR_API_KEY_HERE',
}

try:
    response = requests.get('https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea', headers=headers)
    response.raise_for_status()
    print(response.text)
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")
Java
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;

public class ApiExample {
    public static void main(String[] args) {
        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
            .url("https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea")
        .addHeader("x-api-key", "YOUR_API_KEY_HERE")
            .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful()) {
                System.out.println(response.body().string());
            } else {
                System.out.println("Error: " + response.code());
            }
        } catch (IOException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
Go
package main

import (
    "fmt"
    "net/http"
    "io/ioutil"
)

func main() {
    client := &http.Client{}
    req, err := http.NewRequest("GET", "https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea", nil)
    if err != nil {
        fmt.Println("Error creating request:", err)
        return
    }
    req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")

    resp, err := client.Do(req)
    if err != nil {
        fmt.Println("Error making request:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Error reading response:", err)
        return
    }

    fmt.Println(string(body))
}
Terminal
#!/bin/bash

curl -X GET \
    -H "x-api-key: YOUR_API_KEY_HERE" \
    "https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea"
C#
using System;
using System.Net.Http;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");

        try
        {
            var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea"));
            var content = await response.Content.ReadAsStringAsync();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
TypeScript
import axios from 'axios';

async function run(): Promise<void> {
    try {
        const response = await axios({
            method: 'GET',
            url: 'https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea',
            headers: {
        'x-api-key': 'YOUR_API_KEY_HERE',
            },
        });

        console.log(response.data);
    } catch (error) {
        console.error('Error:', error);
    }
}

void run();
RUST
use reqwest::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new();

    let response = client
        .get("https://scrappa.co/api/maps/popular-times?business_id=0x89c2598f7ff4aa09%3A0x313547e757cb8cea")
        .header("x-api-key", "YOUR_API_KEY_HERE")
        .send()
        .await?;

    println!("{}", response.text().await?);

    Ok(())
}

Response Schema

Example response fields are illustrative; inspect the JSON before integrating.

Example response fields

Scan these fields before integrating.

place current_day current_hour live typical_visit_duration closed_days days credits_charged

Common days fields

day hours peak_hours
JSON Response
200 OK
{
    "place": {
        "business_id": "0x89c2598f7ff4aa09:0x313547e757cb8cea",
        "name": "Katz's Delicatessen",
        "address": "Katz's Delicatessen, 205 E Houston St, New York, NY 10002"
    },
    "current_day": "tuesday",
    "current_hour": 18,
    "live": {
        "day": "tuesday",
        "hour": 18,
        "hour_label": "6 PM",
        "busyness_percent": 51,
        "label": "A little busy",
        "usual_busyness_percent": 78,
        "usual_label": "Usually a little busy",
        "wait_time": null
    },
    "typical_visit_duration": {
        "text": "20 min to 1.5 hr",
        "min_minutes": 20,
        "max_minutes": 90
    },
    "closed_days": [],
    "days": [
        {
            "day": "monday",
            "hours": [
                {
                    "hour": 6,
                    "hour_label": "6 AM",
                    "busyness_percent": null,
                    "label": null,
                    "wait_time": null,
                    "wait_minutes": null
                },
                {
                    "hour": 12,
                    "hour_label": "12 PM",
                    "busyness_percent": 77,
                    "label": "Usually a little busy",
                    "wait_time": null,
                    "wait_minutes": null
                },
                {
                    "hour": 18,
                    "hour_label": "6 PM",
                    "busyness_percent": 84,
                    "label": "Usually as busy as it gets",
                    "wait_time": null,
                    "wait_minutes": null
                }
            ],
            "peak_hours": [
                {
                    "hour": 14,
                    "hour_label": "2 PM",
                    "busyness_percent": 86
                },
                {
                    "hour": 15,
                    "hour_label": "3 PM",
                    "busyness_percent": 87
                },
                {
                    "hour": 16,
                    "hour_label": "4 PM",
                    "busyness_percent": 87
                }
            ]
        },
        {
            "day": "tuesday",
            "hours": [
                {
                    "hour": 6,
                    "hour_label": "6 AM",
                    "busyness_percent": null,
                    "label": null,
                    "wait_time": null,
                    "wait_minutes": null
                },
                {
                    "hour": 12,
                    "hour_label": "12 PM",
                    "busyness_percent": 79,
                    "label": "Usually a little busy",
                    "wait_time": null,
                    "wait_minutes": null
                },
                {
                    "hour": 18,
                    "hour_label": "6 PM",
                    "busyness_percent": 78,
                    "label": "Usually a little busy",
                    "wait_time": null,
                    "wait_minutes": null
                }
            ],
            "peak_hours": [
                {
                    "hour": 13,
                    "hour_label": "1 PM",
                    "busyness_percent": 87
                },
                {
                    "hour": 14,
                    "hour_label": "2 PM",
                    "busyness_percent": 89
                },
                {
                    "hour": 15,
                    "hour_label": "3 PM",
                    "busyness_percent": 87
                }
            ]
        }
    ],
    "credits_charged": 3
}

Errors

Handle these documented responses before retrying or showing customer-facing failures.

422

Validation Error

No business_id or place_id was sent, or a value is malformed. This response is not billed.

{
    "message": "The request validation failed",
    "errors": {
        "business_id": [
            "Provide a business_id or a place_id."
        ]
    }
}
404

No Popular Times

Google Maps has no place for this id, Google shows no popular times for it, or the result shows another place. This response is not billed.

{
    "error": "Google shows no popular times for this place.",
    "error_code": "google_maps_popular_times_not_found"
}
503

Popular Times Temporarily Unavailable

No Google session could read the result. Retry after the Retry-After interval; this response is not billed.

{
    "error": "Google Maps popular times are temporarily unavailable. Please retry.",
    "error_code": "google_maps_popular_times_unavailable",
    "retryable": true,
    "retry_after": 5
}

Generate Code with AI

Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.

Related reading

Try It Live

Test this endpoint in our interactive playground with real data.