LAPD Crime Data Scraper — Los Angeles Crime Records avatar

LAPD Crime Data Scraper — Los Angeles Crime Records

Pricing

from $2.77 / 1,000 lapd crime records

Go to Apify Store
LAPD Crime Data Scraper — Los Angeles Crime Records

LAPD Crime Data Scraper — Los Angeles Crime Records

Export LAPD crime data from the Los Angeles open-data portal: NIBRS offenses, dates, areas, hundred-block coordinates and status. USD 3.47 per 1,000 records.

Pricing

from $2.77 / 1,000 lapd crime records

Rating

0.0

(0)

Developer

Muhammad Afzal

Muhammad Afzal

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

8 hours ago

Last modified

Categories

Share

LAPD Crime Data Scraper pulls Los Angeles Police Department crime records from the City of Los Angeles Open Data Portal and returns one normalized row per offense or incident with case number, offense code and description, crime-against category, report and occurrence dates, LAPD area, hundred-block location, coordinates, premise, status and the full source row. It is built for analysts, journalists, researchers and real-estate or safety teams who need LAPD crime data in a spreadsheet or pipeline, and it costs USD 3.465 per 1,000 records on the FREE tier (USD 2.772 on GOLD).

What LAPD crime data does it return?

Each dataset row is one record from the official LAPD open-data tables:

FieldWhat it contains
recordTypelapd-nibrs-offense (current data) or lapd-legacy-incident (2020–2024)
caseNumber, incidentNumberLAPD case number and the unique offense or incident identifier
offenseCode, offenseDescriptionOffense code and description, for example 23H and 487(A) - PC - F - Grand Theft - 23H
nibrsGroup, crimeAgainstNIBRS group (A or B) and Person, Property or Society; null for legacy records
dateReported, dateOccurred, timeOccurredReport and occurrence timestamps, and occurrence time as HHMM
area, areaName, reportingDistrictLAPD geographic area code and name (for example 06, Hollywood) and reporting district
location, latitude, longitudeHundred-block address and its coordinates, generalized by LAPD for privacy
premiseDescription, weaponDescriptionPremise type and weapon, when reported
statusCase status, for example Open or Investigation Continued
victimCount, offenseCountVictim and offense totals for the incident (current data only)
rawThe complete source row, including flags such as domestic violence, hate crime, gang-related and transit-related
sourceDatasetId, sourceUrl, scrapedAtSource table, exact query URL and collection time

The run summary is saved as OUTPUT: status (data, empty or failed), records collected, pages fetched, failed requests, charged events and warnings.

Which LAPD datasets can I query?

Two modes cover all LAPD crime data on the portal:

  • nibrs (default): current NIBRS offense records, table k7nn-b2ep. One row per offense, so an incident with two offenses produces two rows that share a caseNumber. On 2026-10-26 it held about 499,000 rows with occurrences up to 2026-10-03.
  • legacy: historical incident records from 2020 to 2024, table 2nrs-mtv8, about 1,005,000 rows. LAPD stopped updating it after moving to NIBRS reporting in 2024.

Records come newest occurrence first. maxResults (1 to 5,000, default 25) caps both output and charges.

How do I get LA crime data for one area, offense and date range?

Set the occurrence dates, then filter by offense and area:

{
"datasetMode": "nibrs",
"startDate": "2025-01-01",
"endDate": "2025-01-31",
"offense": "robbery",
"areaName": "Central",
"maxResults": 100
}

This combination matched 56 robbery records for January 2025 in a check against the source on 2026-10-27.

  • startDate and endDate: inclusive YYYY-MM-DD occurrence dates. An end date before the start date stops the run with a warning before any request.
  • offense: case-insensitive partial match on the offense description, for example burglary, robbery, assault or vehicle.
  • searchTerm: case-insensitive partial match on the offense description or the area name. Hollywood also matches N Hollywood.
  • areaName: exact area name, case-insensitive, in both modes. Unlike searchTerm, Hollywood does not match N Hollywood.

The 21 LAPD areas are 77th Street, Central, Devonshire, Foothill, Harbor, Hollenbeck, Hollywood, Mission, Newton, N Hollywood, Northeast, Olympic, Pacific, Rampart, Southeast, Southwest, Topanga, Van Nuys, West LA, West Valley and Wilshire.

Can I build Los Angeles crime statistics or a crime map from it?

Yes. Each row has areaName, offenseDescription, crimeAgainst, dateOccurred and hundred-block latitude and longitude, so you can count offenses by area and month or plot them in any mapping or BI tool. The Actor returns records, not pre-computed rates; divide by population yourself if you need per-capita figures.

When should I use it, and when not?

Use it when you need record-level LAPD crime data for a date range, area or offense type: neighborhood safety research, newsroom analysis, academic work, dashboards, or a scheduled feed of new offenses.

Use something else when:

  • You need national, state or agency-level crime statistics: FBI Crime Data Scraper.
  • You need Los Angeles County Sheriff areas or other cities: this Actor covers LAPD jurisdiction only.
  • You need active Los Angeles business registrations: LA Business Licenses Scraper.
  • You need an individual's criminal history: this data has no names and is not a background check.

How do I run it from code?

JavaScript with apify-client:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('muhammadafzal/lapd-crime-data-scraper').call({
datasetMode: 'nibrs',
startDate: '2025-01-01',
endDate: '2025-01-31',
offense: 'burglary',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const r of items) console.log(r.dateOccurred, r.areaName, r.offenseDescription, r.location);

Python with apify-client:

import os
from collections import Counter
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("muhammadafzal/lapd-crime-data-scraper").call(run_input={
"datasetMode": "nibrs",
"startDate": "2025-01-01",
"endDate": "2025-01-31",
"maxResults": 2000,
})
by_area = Counter(r["areaName"] for r in client.dataset(run.default_dataset_id).iterate_items())
print(by_area.most_common(5))

Use it from an AI assistant

LAPD Crime Data Scraper works from Claude, ChatGPT, Cursor or any MCP client through Apify's MCP server. Add the single-tool URL https://mcp.apify.com/?tools=muhammadafzal/lapd-crime-data-scraper to your client and ask, for example: "Pull LAPD burglary records for January 2025 and tell me which five areas had the most." Each record is charged at the prices below.

What does the output look like?

Two records from the current NIBRS table, as normalized by the Actor (raw, sourceUrl and scrapedAt omitted):

[
{
"recordType": "lapd-nibrs-offense",
"caseNumber": "25001719",
"incidentNumber": "25001719_90J_0",
"offenseCode": "90J",
"offenseDescription": "369I(B)(1) - PC - M - Trespass Rail Transit Property - 90J",
"nibrsGroup": "B",
"crimeAgainst": "Society",
"dateReported": "2025-01-04T02:06:34.000",
"dateOccurred": "2025-01-03T23:53:00.000",
"timeOccurred": "2353",
"area": "15",
"areaName": "N Hollywood",
"reportingDistrict": "1549",
"location": "5300 Lankershim Blvd",
"latitude": 34.1687,
"longitude": -118.377,
"premiseDescription": "MTA B Red Line -North Hollywood",
"weaponDescription": null,
"status": "Open",
"victimCount": 1,
"offenseCount": 1,
"sourceDatasetId": "k7nn-b2ep"
},
{
"recordType": "lapd-nibrs-offense",
"caseNumber": "C259000841",
"incidentNumber": "C259000841_26F_0",
"offenseDescription": "530.5(A) - PC - F - Identity Theft - 26F",
"crimeAgainst": "Person",
"dateOccurred": "2025-01-03T23:50:00.000",
"areaName": "Van Nuys",
"location": "14100 Archwood St",
"premiseDescription": "Cyber Space",
"status": "Investigation Continued",
"sourceDatasetId": "k7nn-b2ep"
}
]

How much does LAPD crime data cost?

The Actor uses pay-per-event pricing, and platform usage is included in the event prices. Each record saved to the dataset is one charged event; empty, rejected and failed runs charge no record events.

EventFREEBRONZESILVERGOLDPLATINUM / DIAMOND
LAPD crime recordUSD 0.003465USD 0.003378USD 0.003291USD 0.002772USD 0.002772
Actor start (per started GB of allocated memory)USD 0.006251USD 0.006094USD 0.005938USD 0.005USD 0.005

Worked totals on the FREE tier at the default 512 MB memory (one start event):

  • 5 records (the Store example input): 5 × USD 0.003465 + USD 0.006251 = USD 0.0236
  • 5,000 records (the per-run maximum): 5,000 × USD 0.003465 + USD 0.006251 = USD 17.33

The start log line shows the maximum record charge at your tier's per-record price.

Limits and reliability

  • Source: the official City of Los Angeles open-data service, read directly with no login. Pages of up to pageSize rows (default 1,000) are requested with a requestDelayMs pause (default 100 ms).
  • Failures: if the source returns an error, the run stops paging, saves what it already collected and lists the error in OUTPUT. A run with no records and a failed request ends as failed with no record charges.
  • Data caveats: LAPD notes that records can contain transcription errors and that locations are generalized to the hundred block. Zero results do not mean no crime occurred.
  • Run size: up to 5,000 records per run (default timeout 5 minutes). A year of NIBRS data is far larger, so split long date ranges across runs.

FAQ

Where does LAPD crime data come from?

From the LAPD tables the City of Los Angeles publishes on its Open Data Portal (data.lacity.org). The Actor queries those tables and normalizes the fields.

Is the 2020–2024 LAPD crime dataset still updated?

No. LAPD moved to NIBRS reporting in 2024 and stopped updating the legacy table. Use the default nibrs mode for recent crimes.

How current is the data?

As current as LAPD's published table. On 2026-10-26 the newest occurrence date in the NIBRS table was 2026-10-03.

Should I filter areas with areaName or searchTerm?

Use areaName for one exact LAPD area in either mode; it ignores the trailing spaces the NIBRS table adds to area names. Use searchTerm for a partial match that can also hit offense descriptions, so Hollywood there also returns N Hollywood.

Does it include victim or suspect names?

No. The tables contain no names. Legacy rows include victim age, sex and descent in raw, as published by LAPD.

Can I schedule a daily LAPD crime feed?

Yes. Save an input with a recent startDate as an Apify task, schedule it, and deduplicate on incidentNumber downstream.

Can I query another table on the portal?

Yes, through the optional datasetId field (format xxxx-xxxx), but the field mapping is designed for the two LAPD crime tables.

The Actor reads public open data published by the City of Los Angeles and does not log in or bypass access controls. Records describe reported crimes, not convictions. Do not use them to identify or target individuals, for tenant or employment screening, or for emergency information. Follow the City of Los Angeles open-data terms and attribute the source. This tool is not affiliated with LAPD or the City of Los Angeles, and this is not legal advice.

Last verified: 2026-10-27