v1.3.0
Access fresh street-level imagery, map features, and AI-detected video driving events from the world's largest decentralized mapping infrastructure with Bee cameras collecting data globally.
Most endpoints require authentication via API key. You can authenticate in two ways:
Option 1: Query Parameter
apiKey as a query parameter: ?apiKey=YOUR_API_KEYOption 2: Authorization Header
Authorization header with your API key: Authorization: Basic YOUR_API_KEYBoth methods work for all authenticated endpoints.
This API uses two billing dimensions:
All API requests require a Basic API key sent via the Authorization header. You can generate and manage keys in the Developer Portal.
curl -X GET "https://beemaps.com/api/developer/imagery" \ -H "Authorization: Basic YOUR_API_KEY"
Access fresh, high-quality geolocated street-level imagery
/imagery/polyReturns street-level imagery frames captured during a specific week within your polygon boundary. Use this for historical imagery queries or when you need data from a particular time period.
Each frame includes:
Use /map-data instead if you need: point+radius queries, route-based queries, or both imagery and map features together.
Constraints:
> Billing: Imagery URLs returned in the response are metered per view. Each unique view deducts from your account's USD balance. See beemaps.com/pricing for details.
GeoJSON (Multi)Polygon
typestringPolygon or MultiPolygon
Example: "Polygon"
coordinatesnumber[][][]Example: [[[-122.48185591741223,37.76910370072376]]]
const apiKey = 'your-api-key-here';const url = 'https://beemaps.com/api/developer/imagery/poly';const resp = await fetch(url, { method: 'post', body: JSON.stringify({ coordinates: [ [ [-122.41927011115149,37.775414437036275], [-122.41605628337065,37.7763 86631642566], [-122.41597692959819,37.77889546188183], [-122.42299973845249,37.7772647319 11615], [-122.41927011115149,37.775414437036275] ] ], type: 'Polygon' }), headers: { 'content-type': 'application/json', 'authorization': `Basic ${apiKey}` }});const data = await resp.json();const frames = data.frames;framesImageryResultsArray items:
urlstringtemporary signed url
Example: "https://www.cdn.com/image?signed=yoursdearly"
timestampstringExample: "2023-11-09T02:30:48.974Z"
sequencestringExample: "60cb39e7cce2931a8cd2fa2d"
idxintegerExample: 0
devicestringsupported camera device
Example: "bee"
positionobjectlatnumberN
Example: 37.76910370072376
lat_refstringExample: "n"
lonnumberE
Example: -122.48185591741223
lon_refstringExample: "e"
gdopnumberExample: 0.123
hdopnumberExample: 0.123
pdopnumberExample: 0.123
ephnumberExample: 0.123
cnonumberExample: 0.123
widthintegerExample: 2028
heightintegerExample: 1024
imuobjectacc_xnumberExample: 0.123
acc_ynumberExample: 0.123
acc_znumberExample: 0.123
gyro_xnumberExample: 0.123
gyro_ynumberExample: 0.123
gyro_znumberExample: 0.123
notestringOptional note about the query result
/latest/polyReturns the freshest available street-level imagery within your polygon, optionally filtered to exclude data older than a specified week. Use this when you want current conditions rather than historical data.
Ideal for:
Constraints:
> Billing: Imagery URLs returned in the response are metered per view. Each unique view deducts from your account's USD balance. See beemaps.com/pricing for details.
YYYY-mm-dd of a day in the week to use as cutoff
Include heading information in the response
When set to 'true', returns catalog metadata only without signed image URLs
When true, queries use the full input polygon for each time period instead of sub-polygons
GeoJSON (Multi)Polygon
typestringPolygon or MultiPolygon
Example: "Polygon"
coordinatesnumber[][][]Example: [[[-122.48185591741223,37.76910370072376]]]
const apiKey = 'your-api-key-here';const url = 'https://beemaps.com/api/developer/latest/poly';const resp = await fetch(url, { method: 'post', body: JSON.stringify({ coordinates: [ [ [-122.41927011115149,37.775414437036275], [-122.41605628337065,37.7763 86631642566], [-122.41597692959819,37.77889546188183], [-122.42299973845249,37.7772647319 11615], [-122.41927011115149,37.775414437036275] ] ], type: 'Polygon' }), headers: { 'content-type': 'application/json', 'authorization': `Basic ${apiKey}` }});const data = await resp.json();const frames = data.frames;framesImageryResultsArray items:
urlstringtemporary signed url
Example: "https://www.cdn.com/image?signed=yoursdearly"
timestampstringExample: "2023-11-09T02:30:48.974Z"
sequencestringExample: "60cb39e7cce2931a8cd2fa2d"
idxintegerExample: 0
devicestringsupported camera device
Example: "bee"
positionobjectlatnumberN
Example: 37.76910370072376
lat_refstringExample: "n"
lonnumberE
Example: -122.48185591741223
lon_refstringExample: "e"
gdopnumberExample: 0.123
hdopnumberExample: 0.123
pdopnumberExample: 0.123
ephnumberExample: 0.123
cnonumberExample: 0.123
widthintegerExample: 2028
heightintegerExample: 1024
imuobjectacc_xnumberExample: 0.123
acc_ynumberExample: 0.123
acc_znumberExample: 0.123
gyro_xnumberExample: 0.123
gyro_ynumberExample: 0.123
gyro_znumberExample: 0.123
notestringOptional note about the query result
Access AI-detected driving video events from Bee cameras on vehicles
/aievents/searchAccess action-rich video clips with synchronized ego-vehicle data for training AI driving systems and world models.
Search and retrieve video segments capturing specific driving behaviors and scenarios—harsh braking, lane changes, stop sign interactions, swerving maneuvers, and more.
Each event includes:
Your API key. Alternative to Authorization header.
startDatestringStart of the time range (ISO 8601)
endDatestringEnd of the time range (ISO 8601). Must be within 31 days of startDate.
deviceIdsstring[]Array of Device IDs to filter by
typesstring · enum[]Array of AI event types to filter by
HARSH_BRAKINGAGGRESSIVE_ACCELERATIONSWERVINGHIGH_SPEEDHIGH_G_FORCESTOP_SIGN_VIOLATIONTRAFFIC_LIGHT_VIOLATIONTAILGATINGpolygonnumber[][]Array of [lon, lat] coordinates defining a closed polygon. Must have at least 4 points with first and last point matching. Must not self-intersect.
limitintegerNumber of items to return
Default: 100
offsetintegerOffset for pagination
Default: 0
const apiKey = 'your-api-key-here';const url = 'https://beemaps.com/api/developer/aievents/search';const resp = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Basic ${apiKey}` }, body: JSON.stringify({ startDate: '2026-01-01T00:00:00.000Z', endDate: '2026-01-21T23:59:59.000Z', types: ['SWERVING', 'HARSH_BRAKING'], limit: 100 })});const data = await resp.json();// Response: { pagination: {...}, startDate, endDate, events: [...] }paginationAIEventPaginationtotalintegerTotal number of events matching the query
limitintegerNumber of items returned per page
offsetintegerCurrent offset for pagination
startDatestringendDatestringeventsAIEvent[]Array items:
idstringUnique event identifier
Example: "697100eef68342b197b78418"
typestring · enumType of AI-detected driving event
HARSH_BRAKINGAGGRESSIVE_ACCELERATIONSWERVINGHIGH_SPEEDHIGH_G_FORCESTOP_SIGN_VIOLATIONTRAFFIC_LIGHT_VIOLATIONTAILGATINGtimestampstringWhen the event occurred
Example: "2026-01-21T16:37:27.250Z"
locationobjectGPS coordinates where the event occurred
latnumberLatitude
Example: 37.7749
lonnumberLongitude
Example: -122.4194
metadataobjectEvent-specific metadata. Contents vary by event type. Common fields include ACCELERATION_MS2, SPEED_MS, SPEED_LIMIT_MS, FIRMWARE_VERSION.
Example: {"ACCELERATION_MS2":1.108304,"FIRMWARE_VERSION":"6.63.0"}
videoUrlstringTemporary signed URL to download the event video clip. May be null if video is not available.
Example: "https://example-bucket.s3.amazonaws.com/recordings/.../video.mp4?X-Amz-..."
gnssDataobject[]High-precision GPS data array. Only included when includeGnssData=true query parameter is set. Contains ~30-60 samples at ~1Hz rate around the event.
Example: [{"timestamp":1769731194000,"lat":37.7749123,"lon":-122.4194567,"alt":15.5},{"timestamp":1769731195000,"lat":37.7749234,"lon":-122.4194678,"alt":15.6}]
Array items:
timestampnumberUnix timestamp in milliseconds
Example: 1769731194000
latnumberLatitude in degrees
Example: 37.7749123
lonnumberLongitude in degrees
Example: -122.4194567
altnumberAltitude in meters
Example: 15.5
imuDataobject[]High-frequency IMU (Inertial Measurement Unit) sensor data. Only included when includeImuData=true query parameter is set. Contains 3000+ samples at ~10Hz (100ms intervals) capturing 3-axis accelerometer and gyroscope readings around the event.
Example: [{"timestamp":1769731194000.461,"acc_x":-0.204417,"acc_y":-0.000218,"acc_z":1.011279,"gyro_x":0.030514,"gyro_y":0.915588,"gyro_z":-0.282222},{"timestamp":1769731194100.461,"acc_x":-0.210543,"acc_y":0.004563,"acc_z":1.008234,"gyro_x":0.152592,"gyro_y":0.778777,"gyro_z":-0.335555}]
Array items:
timestampnumberUnix timestamp in milliseconds with sub-millisecond precision
Example: 1769731194000.461
acc_xnumberAcceleration in X axis (m/s²)
Example: -0.204417
acc_ynumberAcceleration in Y axis (m/s²)
Example: -0.000218
acc_znumberAcceleration in Z axis (m/s²)
Example: 1.011279
gyro_xnumberAngular velocity around X axis (rad/s)
Example: 0.030514
gyro_ynumberAngular velocity around Y axis (rad/s)
Example: 0.915588
gyro_znumberAngular velocity around Z axis (rad/s)
Example: -0.282222
/aievents/{id}Retrieve detailed information about a specific AI-detected driving event, including the video clip URL and synchronized ego-vehicle data.
Use query parameters to optionally include frame-level sensor data:
?includeGnssData=true - Include GPS coordinates array (lat, lon, alt, timestamp)?includeImuData=true - Include IMU array (accelerometer/gyroscope readings with timestamps)?includeGnssData=true&includeImuData=true - Include bothNote: Sensor data adds 50-200 KB to response size. Only request when needed for detailed analysis, path reconstruction, or ML training.
Use this endpoint after searching to access the full event details and video for analysis, training, or validation purposes.
Event ID
Include frame-level GPS data (lat, lon, alt, timestamp array)
Include frame-level IMU data (accelerometer and gyroscope readings with timestamps)
Your API key. Alternative to Authorization header.
const apiKey = 'your-api-key-here';const eventId = '697100eef68342b197b78418';const url = `https://beemaps.com/api/developer/aievents/${eventId}`;const resp = await fetch(url, { method: 'GET', headers: { 'Authorization': `Basic ${apiKey}` }});const event = await resp.json();// Response: { id, type, timestamp, location, metadata, videoUrl }idstringUnique event identifier
Example: "697100eef68342b197b78418"
typestring · enumType of AI-detected driving event
HARSH_BRAKINGAGGRESSIVE_ACCELERATIONSWERVINGHIGH_SPEEDHIGH_G_FORCESTOP_SIGN_VIOLATIONTRAFFIC_LIGHT_VIOLATIONTAILGATINGtimestampstringWhen the event occurred
Example: "2026-01-21T16:37:27.250Z"
locationobjectGPS coordinates where the event occurred
latnumberLatitude
Example: 37.7749
lonnumberLongitude
Example: -122.4194
metadataobjectEvent-specific metadata. Contents vary by event type. Common fields include ACCELERATION_MS2, SPEED_MS, SPEED_LIMIT_MS, FIRMWARE_VERSION.
Example: {"ACCELERATION_MS2":1.108304,"FIRMWARE_VERSION":"6.63.0"}
videoUrlstringTemporary signed URL to download the event video clip. May be null if video is not available.
Example: "https://example-bucket.s3.amazonaws.com/recordings/.../video.mp4?X-Amz-..."
gnssDataobject[]High-precision GPS data array. Only included when includeGnssData=true query parameter is set. Contains ~30-60 samples at ~1Hz rate around the event.
Example: [{"timestamp":1769731194000,"lat":37.7749123,"lon":-122.4194567,"alt":15.5},{"timestamp":1769731195000,"lat":37.7749234,"lon":-122.4194678,"alt":15.6}]
Array items:
timestampnumberUnix timestamp in milliseconds
Example: 1769731194000
latnumberLatitude in degrees
Example: 37.7749123
lonnumberLongitude in degrees
Example: -122.4194567
altnumberAltitude in meters
Example: 15.5
imuDataobject[]High-frequency IMU (Inertial Measurement Unit) sensor data. Only included when includeImuData=true query parameter is set. Contains 3000+ samples at ~10Hz (100ms intervals) capturing 3-axis accelerometer and gyroscope readings around the event.
Example: [{"timestamp":1769731194000.461,"acc_x":-0.204417,"acc_y":-0.000218,"acc_z":1.011279,"gyro_x":0.030514,"gyro_y":0.915588,"gyro_z":-0.282222},{"timestamp":1769731194100.461,"acc_x":-0.210543,"acc_y":0.004563,"acc_z":1.008234,"gyro_x":0.152592,"gyro_y":0.778777,"gyro_z":-0.335555}]
Array items:
timestampnumberUnix timestamp in milliseconds with sub-millisecond precision
Example: 1769731194000.461
acc_xnumberAcceleration in X axis (m/s²)
Example: -0.204417
acc_ynumberAcceleration in Y axis (m/s²)
Example: -0.000218
acc_znumberAcceleration in Z axis (m/s²)
Example: 1.011279
gyro_xnumberAngular velocity around X axis (rad/s)
Example: 0.030514
gyro_ynumberAngular velocity around Y axis (rad/s)
Example: 0.915588
gyro_znumberAngular velocity around Z axis (rad/s)
Example: -0.282222
Query detected road objects like speed limits, stop signs, and lane lines
/map-dataThe primary endpoint for accessing Hivemapper road intelligence. Returns detected road features (speed limits, stop signs, turn restrictions, fire hydrants, lane lines) and/or street-level imagery within your specified geometry.
Use this endpoint when you need:
whats within 100m of this location')whats along this delivery path')Common use cases: fleet route validation, robotaxi pickup/dropoff zone checks, POI verification, AI training data collection, infrastructure auditing.
Geometry options:
Constraints:
startDate defaults to 1 week ago if not specified for imagery queries.Your API key. Alternative to Authorization header.
Request parameters including geometry, data type, and optional filters
typestring · enum[]Array of data types to query (at least one required)
mapFeaturesimagerygeometryPointGeometry | LinestringGeometry | PolygonGeometryOne of:
PointGeometryPointGeometryLinestringGeometryLinestringGeometryPolygonGeometryPolygonGeometrystartDatestringStart date (YYYY-MM-DD) for imagery queries. Must be within the last year. If not provided, defaults to one week ago.
headingsbooleanInclude heading information (imagery only)
const apiKey = 'your-api-key-here';const url = `https://beemaps.com/api/developer/map-data?apiKey=${apiKey}`;const resp = await fetch(url, { method: 'post', body: JSON.stringify({ type: ['mapFeatures'], geometry: { type: 'Point', coordinates: [-122.419, 37.774], radius: 100 } }), headers: { 'content-type': 'application/json' }});const data = await resp.json();// Response: { totalCreditsUsed, totalCreditsRemaining, mapFeatureResults: { type, data, creditsUsed } }totalCreditsUsedintegerTotal number of credits consumed by all query types
totalCreditsRemainingintegerNumber of credits remaining after the query
mapFeatureResultsMapDataResulttypestring · enumThe type of data returned
mapFeaturesimagerydataMapFeaturesResults | ImageryResultsThe actual data - either map features or imagery frames
One of:
MapFeaturesResultsMapFeaturesResultsImageryResultsImageryResultsnotestringOptional note about the query result
imageryResultsMapDataResulttypestring · enumThe type of data returned
mapFeaturesimagerydataMapFeaturesResults | ImageryResultsThe actual data - either map features or imagery frames
One of:
MapFeaturesResultsMapFeaturesResultsImageryResultsImageryResultsnotestringOptional note about the query result
/mapFeatures/polyReturns map features (road signs, infrastructure, lane markings) detected within your polygon boundary. Each feature includes precise positioning, confidence score, and feature-specific properties.
Feature types include:
Each feature includes:
Use /map-data instead if you need: point+radius queries, route-based queries, or both imagery and features together.
Constraints:
GeoJSON (Multi)Polygon
typestringPolygon or MultiPolygon
Example: "Polygon"
coordinatesnumber[][][]Example: [[[-122.48185591741223,37.76910370072376]]]
const apiKey = 'your-api-key-here';const url = 'https://beemaps.com/api/developer/mapFeatures/poly';const resp = await fetch(url, { method: 'post', body: JSON.stringify({ coordinates: [ [ [-122.41927011115149,37.775414437036275], [-122.41605628337065,37.7763 86631642566], [-122.41597692959819,37.77889546188183], [-122.42299973845249,37.7772647319 11615], [-122.41927011115149,37.775414437036275] ] ], type: 'Polygon' }), headers: { 'content-type': 'application/json', 'authorization': `Basic ${apiKey}` }});const data = await resp.json();const features = data.features;featuresMapFeaturesResultsArray items:
idstringunique id
Example: "SLS299345"
statusstringExample: "active"
propertiesobjectspeedLimitintegerExample: 35
unitstringExample: "mph"
regulatorystringExample: "enforced"
positionobjectlonnumberExample: -108.123
latnumberExample: 34.234
azimuthnumberExample: 90
heightnumberExample: 0.5
widthnumberExample: 0.3
observedobjectfirstSeenstringExample: "2023-11-09T03:09:40.131Z"
LastSeenstringExample: "2023-11-09T03:09:40.131Z"
confidencenumberExample: 0.99
classstringExample: "speed-limit"
/burst/createCreates bursts that incentivize Hivemapper drivers to map specific locations. Once created, bursts appear in the Bee App and trigger push notifications to nearby drivers.
Use this when:
Input options:
Coverage timing (depends on local driver density):
After creating a burst:
isHit field)Array of burst creation requests
Array items:
geojsonPolygon | PointGeometryEither a GeoJSON Polygon or a Point with radius (in meters). Point + radius will be converted to a Polygon internally.
One of:
PolygonPolygonPointGeometryPointGeometrytrackedLocationstringOptional Tracked location ID
expirationstringOptional expiration date overwrite
deviceTypestring · enumOptional device type of burst target
beeconst apiKey = 'your-api-key-here';const url = 'https://beemaps.com/api/developer/burst/create';const resp = await fetch(url, { method: 'POST', headers: { 'Authorization': `Basic ${apiKey}`, 'Content-Type': 'application/json' }, body: JSON.stringify([{ geojson: { type: 'Point', coordinates: [-122.419, 37.774], radius: 500 }, credits: 125 }])});const data = await resp.json();// Response: { success: true, bursts: [...], creditsRemaining: 1000 }successbooleanburstsHoneyBurst[]Array items:
_idstringgeojsonPolygontypestringPolygon or MultiPolygon
Example: "Polygon"
coordinatesnumber[][][]Example: [[[-122.48185591741223,37.76910370072376]]]
amountnumberstatusstring · enumactiveexpiredrefundedvalidFromstringvalidUntilstringdeviceTypestring · enumbeeisHitbooleanWhether the burst has been intersected by a coverage report
latestHitAtstringTimestamp of the coverage report that triggered the hit detection
createdAtstringupdatedAtstring/burstsReturns a paginated list of bursts you've created, with their current status and coverage information.
Use this to:
hit (driver collected imagery in the area)Key fields in response:
active (waiting for coverage), expired, or refundedisHit: true if a driver has mapped the burst arealatestHitAt: Timestamp when coverage was detectedvalidUntil: Burst expiration datecurl -X GET "https://beemaps.com/api/developer/bursts" \ -H "Authorization: Basic YOUR_API_KEY"burstsHoneyBurst[]Array items:
_idstringgeojsonPolygontypestringPolygon or MultiPolygon
Example: "Polygon"
coordinatesnumber[][][]Example: [[[-122.48185591741223,37.76910370072376]]]
amountnumberstatusstring · enumactiveexpiredrefundedvalidFromstringvalidUntilstringdeviceTypestring · enumbeeisHitbooleanWhether the burst has been intersected by a coverage report
latestHitAtstringTimestamp of the coverage report that triggered the hit detection
createdAtstringupdatedAtstringtotalintegerlimitintegerskipinteger/devicesReturns camera intrinsic parameters (focal length, distortion coefficients) for each camera device type. No authentication required.
Use this when:
Device types:
Parameters returned:
curl -X GET "https://beemaps.com/api/developer/devices" \ -H "Authorization: Basic YOUR_API_KEY"/mcpSend JSON-RPC messages to the MCP server using Streamable HTTP transport.
apiKeystringYour Beemaps API key
MCP JSON-RPC Message
{ "mcpServers": { "beemaps": { "url": "https://beemaps.com/api/mcp?apiKey=YOUR_API_KEY" } }}Access account information
/historyReturns a paginated log of your past API queries, including the geometry queried, credits consumed, and timestamps.
Use this to:
Each history entry includes:
curl -X GET "https://beemaps.com/api/developer/history" \ -H "Authorization: Basic YOUR_API_KEY"historyobject[]Array items:
areanumberExample: 101.123
payloadPolygontypestringPolygon or MultiPolygon
Example: "Polygon"
coordinatesnumber[][][]Example: [[[-122.48185591741223,37.76910370072376]]]
timestampstringExample: "2023-11-09T03:09:40.131Z"
weeksstring[]Request fresh video footage of specific areas
/requestVideoReturns the video requests you've created, newest first.
To poll for newly fulfilled requests, pass since set to the time of your last check.
Once a request is fulfilled, its videos field lists the qualifying videos, each with a signed download URL. Until then, videos is omitted.
Signed URLs expire after 24 hours. Call this endpoint again to get fresh URLs.
Max results to return (max 1000, default 100)
Results to skip (default 0)
true returns only fulfilled requests; false returns only requests that haven't been fulfilled (pending, expired or cancelled)
Only return requests fulfilled at or after this time. Implies fulfilled=true; can't be combined with fulfilled=false
const apiKey = 'your-api-key-here';const url = `https://beemaps.com/api/developer/requestVideo?limit=100&skip=0`;const resp = await fetch(url, { method: 'GET', headers: { 'Authorization': `Basic ${apiKey}` }});const data = await resp.json();// Response: { requests: [{ id, geojson, validFrom, validUntil, videos }] }requestsVideoRequest[]Array items:
idstringVideo request ID
Example: "66f9a1c2e4b0a1b2c3d4e5f6"
geojsonPolygonGeometry | VideoRequestTrajectoryThe Polygon or LineString the request was created with
One of:
PolygonGeometryPolygonGeometryVideoRequestTrajectoryVideoRequestTrajectoryvalidFromstringvalidUntilstringcreatedAtstringWhen the request was created
statusstring · enum`pending`: still collecting video. `fulfilled`: qualifying video covered the area and `videos` is ready. `expired`: `validUntil` passed without the area being covered. `cancelled`: the request was cancelled. A request can stay `pending` briefly after `validUntil` while it's finalized
pendingfulfilledexpiredcancelledclosedAtstringWhen the request stopped being `pending`. null while pending
eligibleLocalTimeStartintegerStart of the qualifying time of day, in milliseconds since local midnight
eligibleLocalTimeEndintegerEnd of the qualifying time of day, in milliseconds since local midnight
videosRequestedVideo[]Qualifying videos, oldest first. Omitted until the request is fulfilled
Array items:
urlstringSigned download URL for the video file. Expires after 24 hours
pathobjectGeoJSON LineString of the route driven during the video
timestringWhen recording started
durationintegerVideo length in milliseconds
Example: 30000
heightintegerFrame height in pixels
Example: 1080
widthintegerFrame width in pixels
Example: 1920
/requestVideoCreates a request for fresh video footage covering a polygon, or driving along a LineString, during a time window. Bee drivers are rewarded for recording qualifying video inside the area.
Video only qualifies if it is:
validFrom and validUntilConstraints:
geojson must be a Polygon between 10 m² and 50,000 m², or a LineString up to about 950 m longvalidFrom must be before validUntileligibleLocalTimeStart and eligibleLocalTimeEnd are milliseconds since local midnight (0 to 86399999). When both are given, start must be before endTo make sure a request is only created once, pass an idempotencyKey. Retrying the same request with a key you've already used returns the id of the request first created with it. Using the key for a different request is rejected with 409. Neither creates anything new.
After creating a request, poll GET /requestVideo/{id} until videos is present.
A unique key for this request, such as an order ID. Retrying the same request with the key returns the original request's id; using it for a different request is rejected with 409. Keys are scoped to your account
Video request
geojsonPolygonGeometry | VideoRequestTrajectoryThe area to cover, or a line to drive along in the direction it is drawn
One of:
PolygonGeometryPolygonGeometryVideoRequestTrajectoryVideoRequestTrajectoryvalidFromstringEarliest recording time that qualifies
Example: "2026-10-01T00:00:00Z"
validUntilstringLatest recording time that qualifies
Example: "2026-10-15T00:00:00Z"
eligibleLocalTimeStartintegerStart of the qualifying time of day, in milliseconds since local midnight
Example: 25200000
eligibleLocalTimeEndintegerEnd of the qualifying time of day, in milliseconds since local midnight
Example: 68400000
const apiKey = 'your-api-key-here';const url = `https://beemaps.com/api/developer/requestVideo`;const resp = await fetch(url, { method: 'POST', headers: { 'Authorization': `Basic ${apiKey}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ geojson: { type: 'Polygon', coordinates: [[[-122.419, 37.774], [-122.417, 37.774], [-122.417, 37.776], [-122.419, 37.776], [-122.419, 37.774]]] }, validFrom: '2026-10-01T00:00:00Z', validUntil: '2026-10-15T00:00:00Z', // Only accept video recorded between 07:00 and 19:00 local time eligibleLocalTimeStart: 7 * 60 * 60 * 1000, eligibleLocalTimeEnd: 19 * 60 * 60 * 1000 })});const data = await resp.json();// Response: { id: '66f9a1c2e4b0a1b2c3d4e5f6' }idstringVideo request ID
Example: "66f9a1c2e4b0a1b2c3d4e5f6"
/requestVideo/{id}Returns one of your video requests. Once it is fulfilled, videos lists the qualifying videos, each with a signed download URL that expires after 24 hours.
Returns 404 if the request doesn't exist or belongs to another account.
Video request ID returned by POST /requestVideo
const apiKey = 'your-api-key-here';const url = `https://beemaps.com/api/developer/requestVideo/${requestId}`;const resp = await fetch(url, { method: 'GET', headers: { 'Authorization': `Basic ${apiKey}` }});const data = await resp.json();// Response: { request: { id, geojson, validFrom, validUntil, videos } }requestVideoRequestidstringVideo request ID
Example: "66f9a1c2e4b0a1b2c3d4e5f6"
geojsonPolygonGeometry | VideoRequestTrajectoryThe Polygon or LineString the request was created with
One of:
PolygonGeometryPolygonGeometryVideoRequestTrajectoryVideoRequestTrajectoryvalidFromstringvalidUntilstringcreatedAtstringWhen the request was created
statusstring · enum`pending`: still collecting video. `fulfilled`: qualifying video covered the area and `videos` is ready. `expired`: `validUntil` passed without the area being covered. `cancelled`: the request was cancelled. A request can stay `pending` briefly after `validUntil` while it's finalized
pendingfulfilledexpiredcancelledclosedAtstringWhen the request stopped being `pending`. null while pending
eligibleLocalTimeStartintegerStart of the qualifying time of day, in milliseconds since local midnight
eligibleLocalTimeEndintegerEnd of the qualifying time of day, in milliseconds since local midnight
videosRequestedVideo[]Qualifying videos, oldest first. Omitted until the request is fulfilled
Array items:
urlstringSigned download URL for the video file. Expires after 24 hours
pathobjectGeoJSON LineString of the route driven during the video
timestringWhen recording started
durationintegerVideo length in milliseconds
Example: 30000
heightintegerFrame height in pixels
Example: 1080
widthintegerFrame width in pixels
Example: 1920
/requestVideo/{id}Cancels one of your active video requests. Video recorded after cancellation won't be collected.
Returns 404 if the request doesn't exist, belongs to another account, or is no longer active (already fulfilled, expired or cancelled).
Video request ID returned by POST /requestVideo
const apiKey = 'your-api-key-here';const url = `https://beemaps.com/api/developer/requestVideo/${requestId}`;const resp = await fetch(url, { method: 'DELETE', headers: { 'Authorization': `Basic ${apiKey}` }});const data = await resp.json();// Response: { error: null }errorstringExample: null