How long Berkeley entitlements actually take
Berkeley, California development applications traced from filing to decision: hearing dates, decision dates, days elapsed, appeals filed, and which body decided, so the real timeline of getting approved is visible.
What to deliver
- 2 minimum · 6 preferred · 42 maximum files
- How much of each field to fill is spelled out below
- 220 MB total, at most
- Every file gets a tamper-proof fingerprint on upload
- 1+ “documentation” file
- 1+ “evidence” file
Accepted formats
What each record needs
case_numbertextRequired
City case number. The identifier the City of Berkeley uses for this application.
Produce it: Exactly as the city writes it. One row per case.
Output path: case_number
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: casecase_number
Example: ZP2023-0088
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: A case number that does not exist in the city's records fails the row.
project_addresstextRequired
Project address. Street address of the application site.
Produce it: Street number and street name plus 'Berkeley, CA'. No owner or applicant names.
Output path: project_address
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: address
Example: 2211 Harold Way, Berkeley, CA
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: Address must match the city record for the case.
units_proposedintegerRequired
Dwelling units proposed. Units in the application as filed, so timing can be read against project size.
Produce it: Whole number from the record. Enter 0 for a non-residential application. Never estimate.
Output path: units_proposed
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: units
Example: 12
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: Must match the record.
application_datedateRequired
Date filed. Date the application was submitted.
Produce it: ISO 8601, YYYY-MM-DD, as recorded by the city. This is the clock start.
Output path: application_date
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: filedapplication_date
Example: 2023-02-08
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: A wrong start date makes the whole row useless. Re-check sampled rows.
first_hearing_datedateOptional
First public hearing. Date of the first public hearing on the application.
Produce it: ISO 8601, YYYY-MM-DD, from the agenda. Blank where the application was decided at staff level with no hearing.
Output path: first_hearing_date
Coverage: 60 minimum populated · 100 preferred · 150 maximum · 50% minimum · 80% target
Flat-file columns: hearing_date
Example: 2023-09-14
Missing values: Allowed When the application was decided administratively with no public hearing..
Source: Cite where the value came from.
Buyer review: Must match a published agenda.
decision_datedateRequired
Decision date. Date the deciding body acted on the application.
Produce it: ISO 8601, YYYY-MM-DD. This is the clock stop. Use the original decision date, not an appeal outcome date.
Output path: decision_date
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: decision_date
Example: 2023-11-09
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: Must match the minutes or notice of decision.
days_to_decisionintegerRequired
Days from filing to decision. Calendar days between application_date and decision_date.
Produce it: Whole number. Must equal the difference between the two date columns; do not round or adjust it.
Output path: days_to_decision
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: daysduration
Example: 274
Missing values: Not allowed.
Buyer review: Recompute from the dates. Any mismatch fails the row.
decisiontextRequired
Decision. What the deciding body decided.
Produce it: Exactly one of: approved, approved_with_conditions, denied, withdrawn, continued_indefinitely.
Output path: decision
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: decisionoutcome
Example: approved_with_conditions
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: Must match the minutes or notice of decision.
deciding_bodytextRequired
Deciding body. Who made the decision.
Produce it: Exactly one of: staff, zoning_adjustments_board, design_review_committee, landmarks_preservation_commission, city_council, planning_commission.
Output path: deciding_body
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: bodydeciding_body
Example: zoning_adjustments_board
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: Must match the agenda or minutes that carry the decision.
appeal_filedtextRequired
Appeal filed. Whether the decision was appealed.
Produce it: Exactly one of: yes, no, unknown. Use 'unknown' only where the record genuinely does not say.
Output path: appeal_filed
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: appealappeal_filed
Example: no
Missing values: Not allowed.
Source: Cite where the value came from.
Buyer review: An appeal recorded in the city file but marked 'no' fails the row.
appeal_resolved_datedateOptional
Appeal resolved. Date the appeal was finally resolved.
Produce it: ISO 8601, YYYY-MM-DD. Blank where no appeal was filed or it is still open.
Output path: appeal_resolved_date
Coverage: 0 minimum populated · 40 preferred · 150 maximum · 0% minimum · 30% target
Flat-file columns: appeal_resolved
Example: 2024-02-20
Missing values: Allowed When no appeal was filed or the appeal is still pending..
Source: Cite where the value came from.
Buyer review: Only rows with appeal_filed = yes may carry a date here.
ceqa_pathwaytextOptional
CEQA pathway. How the application cleared environmental review.
Produce it: Exactly one of: exempt_categorical, exempt_statutory, negative_declaration, mitigated_negative_declaration, eir, not_stated.
Output path: ceqa_pathway
Coverage: 60 minimum populated · 100 preferred · 150 maximum · 50% minimum · 80% target
Flat-file columns: ceqa
Example: exempt_statutory
Missing values: Allowed Use 'not_stated' rather than leaving blank where the record is silent..
Source: Cite where the value came from.
Buyer review: Must match the staff report or notice of determination.
source_urlurlRequired
Source URL. Public link to the record this row was read from.
Produce it: A working public URL on berkeleyca.gov, an official permit portal, the state legislature site, or another official host. No paywalled or login-gated links.
Output path: source_url
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: urllinksource
Example: https://berkeleyca.gov/construction-development/land-use-development/zoning-adjustments-board
Missing values: Not allowed.
Source: This column is the source link.
Buyer review: Sampled links must resolve publicly and must contain the claimed information.
captured_atdateRequired
Date captured. The date this row was read from its source.
Produce it: ISO 8601, YYYY-MM-DD. Must be within 60 days of submission.
Output path: captured_at
Coverage: 100 minimum populated · 125 preferred · 150 maximum · 100% minimum · 100% target
Flat-file columns: datecaptured_at
Example: 2026-08-12
Missing values: Not allowed.
Buyer review: Reject rows captured more than 60 days before submission.
View the full field spec
{
"type": "array",
"items": {
"type": "object",
"required": [
"case_number",
"project_address",
"units_proposed",
"application_date",
"decision_date",
"days_to_decision",
"decision",
"deciding_body",
"appeal_filed",
"source_url",
"captured_at"
],
"properties": {
"decision": {
"type": "string",
"title": "Decision",
"examples": [
"approved_with_conditions"
],
"description": "What the deciding body decided."
},
"source_url": {
"type": "string",
"title": "Source URL",
"format": "uri",
"examples": [
"https://berkeleyca.gov/construction-development/land-use-development/zoning-adjustments-board"
],
"maxLength": 500,
"description": "Public link to the record this row was read from."
},
"captured_at": {
"type": "string",
"title": "Date captured",
"format": "date",
"examples": [
"2026-08-12"
],
"description": "The date this row was read from its source."
},
"case_number": {
"type": "string",
"title": "City case number",
"examples": [
"ZP2023-0088"
],
"maxLength": 50,
"minLength": 3,
"description": "The identifier the City of Berkeley uses for this application."
},
"appeal_filed": {
"type": "string",
"title": "Appeal filed",
"examples": [
"no"
],
"description": "Whether the decision was appealed."
},
"ceqa_pathway": {
"type": "string",
"title": "CEQA pathway",
"examples": [
"exempt_statutory"
],
"description": "How the application cleared environmental review."
},
"deciding_body": {
"type": "string",
"title": "Deciding body",
"examples": [
"zoning_adjustments_board"
],
"description": "Who made the decision."
},
"decision_date": {
"type": "string",
"title": "Decision date",
"format": "date",
"examples": [
"2023-11-09"
],
"description": "Date the deciding body acted on the application."
},
"units_proposed": {
"type": "integer",
"title": "Dwelling units proposed",
"maximum": 2000,
"minimum": 0,
"examples": [
"12"
],
"description": "Units in the application as filed, so timing can be read against project size."
},
"project_address": {
"type": "string",
"title": "Project address",
"examples": [
"2211 Harold Way, Berkeley, CA"
],
"maxLength": 200,
"minLength": 8,
"description": "Street address of the application site."
},
"application_date": {
"type": "string",
"title": "Date filed",
"format": "date",
"examples": [
"2023-02-08"
],
"description": "Date the application was submitted."
},
"days_to_decision": {
"type": "integer",
"title": "Days from filing to decision",
"maximum": 5000,
"minimum": 0,
"examples": [
"274"
],
"description": "Calendar days between application_date and decision_date."
},
"first_hearing_date": {
"type": "string",
"title": "First public hearing",
"format": "date",
"examples": [
"2023-09-14"
],
"description": "Date of the first public hearing on the application."
},
"appeal_resolved_date": {
"type": "string",
"title": "Appeal resolved",
"format": "date",
"examples": [
"2024-02-20"
],
"description": "Date the appeal was finally resolved."
}
},
"additionalProperties": false
},
"$schema": "https://json-schema.org/draft/2020-12/schema",
"minItems": 100
}Record relationships
No cross-field rules are required.
Files and relationships
Methodology write-up
One file, plain prose is fine.
1 minimum · 1 preferred · 2 maximum files · .md, .pdf, .txt · 10 MB eachAgenda, minutes, and notice evidence
Must collectively cover at least 15 percent of submitted rows.
1 minimum · 5 preferred · 40 maximum files · .pdf, .png, .jpg, .jpeg, .csv, .xlsx · 25 MB eachRights and sourcing
- Must be free to use commercially
- Whoever delivers it confirms they have the right to share it
CC0-1.0CC-BY-4.0ODC-BY-1.0Additional instructions
Everyone quotes a different number for how long Berkeley entitlement takes, and nobody can show their work. Tracing real cases from filing to decision turns that argument into a measurable distribution.