Reported: How the NYC Taxi complaints app was created

The story of honking complaints, rules that taxi drivers have to follow and the penalties if they don’t, how 311 complaints are handled, FOIL requests and lots of data.

Part 1: Introduction to the Reported App

Have you ever witnessed a taxi driver…

  • Honk their horn when there was no emergency
  • Drive recklessly (go through red light, fail to yield, speed, etc.)
  • Ask where you’re going and refuse to drive you there
  • Use a cellphone, text or watch TV while driving
  • Be rude or threatening

Did you know

  • The fine for a driver who honks when there is no emergency is $100
  • The #1 complaint by far (23%) is of drivers refusing passengers which carries a minimum $350 fine
  • The fine for using a cell phone or other electronic devices while driving is $250

What the app does

  • Submit an official 311 complain in less than 30 seconds and automatically track its status
  • Make it easy to refer to the incident when you are asked about it
  • Look up what the relevant charges and fines are for any incident
  • Look up how common a charge is
  • See how many similar complaints were made in 2012 and 2013
  • Look up a driver and see what complaints have been made against them

This resonates with New Yorkers

Part 2: How I got interested in taxi complaints

I know a thing or two about TLC complaints…

My spreadsheet of taxi complaints.
  • It took an average of 51 days for the complaint to resolve.
  • 8 were found guilty (6 immediately paid the summons)
  • 4 were ultimately dismissed: 1 driver had expired license (what?!), 1 driver couldn’t be identified, 1 was the wrong medallion (my fault, misread the number). And after 1 scheduled hearing, the attorney called me and said she decided to dismiss the case because there wasn’t enough evidence, which I was not happy about since all the information was clearly explained.
  • 1 is still open
  • 1 was found not guilty
  • The trip sheet that shows the driver was working that night and these were his pickups before and after.
  • Here is the narrative of the original 311 complaint
  • Here is Section 375 of NY State Law 1A which says “[a horn] shall not be used other than as a reasonable warning nor be unnecessarily loud or harsh.”
  • And NY city Vehicle Traffic Codes 4-12(i) which says “(i) Horn for danger only. No person shall sound the horn of a vehicle except when necessary to warn a person or animal of danger.”

Complaints don’t end up in a black hole

The life of a TLC complaint

  1. You submit a taxi complaint online or via 311.
  2. The TLC checks the taxi’s GPS to ensure it was in the area where you said the incident happened. They also check who was driving at the time (several drivers can have access to one medallion taxi).
  3. If they can identify the driver and location, within 5-7 days a TLC attorney will call you to confirm your story (to ensure you meant what you said). The conversation is very quick. They basically ask “can you tell me what happened on that day” and you tell them what you wrote or said when you submitted the initial complaint. The more detail the better.
  4. If sufficient evidence is presented, the attorney will try to categorize your “complaint narrative” into one or more explicit charges. For example, if you say “this driver asked me where I was going and then didn’t take me to Brooklyn,” that will align with the charge 54-20(a)(1):

Part 3: Making sense of TLC data

Note: We plan to publicly release all of the data used in our app.

Complaints t
Violations table
  • Lic_no: the official hack license number for the driver (as all complaints are against drivers)
  • Vio_type: the type of violation. For consumer complaints that would be CV and CC. For others, I’m not sure what the codes mean.
  • Vio_number: identifier for the specific violation which is tied to a single charge.
  • Vio_date: Date the violation happened (or was reported)
  • Appear_date: If it went to trial, this is the date the driver appeared in court for his hearing
  • Vio_number: the violation id number.
  • Charge_code: this is the specific charge that was filed. A charge code will correlate to one of the NYC rulebooks, such as Chapter 54. This is really important because it tells you exactly what rule was potentially broken, the description of the rule and the penalty and fine for it.
  • Disp_code: This is the disposition code. It is essentially the outcome for that particular violation, ie was he guilty or not.
Disposition codes
  • CSA and OSA: means the driver immediately accepted the summons
100*( SUM(CASE WHEN d.disposition_code IN (‘CAD’, ‘CDI’, ‘CGA’, ‘CGH’, ‘CGI’, ‘CGP’, ‘CSA’, ‘CSW’, ‘OGH’, ‘OGI’, ‘OGP’, ‘OOT’, ‘OSA’) THEN 1 ELSE 0 END)) / ( SUM(CASE WHEN d.disposition_code IN (‘CDH’, ‘CDR’, ‘CWC’, ‘CAD’, ‘CDI’, ‘CGA’, ‘CGH’, ‘CGI’, ‘CGP’, ‘CSA’, ‘CSW’, ‘OGH’, ‘OGI’, ‘OGP’, ‘OOT’, ‘OSA’) THEN 1 ELSE 0 END) ) as “Percent guilty outomes”,
  • CDH, CDR, CWC: are basically not guilty because they are dismissed or withdrawn. Based on the data these show up most frequently.
Chapter 54 — One of many rules, 54-14(e)(1)
Drivers who lease medallion vehicles. The key to linking drivers and medallion numbers!
  1. Saved the PDF as XML — this at least made things much more structured and easier to manage.
  2. Many many search/replacements — to clear leading spaces, newlines, odd characters, etc, so that I could…
  3. Paste it into Excel in a structured format
  4. In order to fill the medallion number and owner name into each of the rows for the TLC driver info, I added an Excel formula to check and copy. Nifty. =IF(ISNUMBER(F3),IF(D2<>0,D2,A2),0)
  5. One irksome fact about Excel is that if you paste something like “4E12”, the field will auto-annoyingly convert it to exponential format, like 4* 10^12. Even if you convert the cells formats to “text” it doesn’t fix the problem. So I used a little trick to convert a large number (ie 3000000000000) back to a medallion number. It took the left most number, then added “E”, then divided the LOG of the number by the left most digit (ie 3), to get just the exponent number. And then, because Excel is so annoying, I added a “.” so it wouldn’t convert it back to a number. =LEFT(B2,1) & “E” &LOG10(B3/LEFT(B3)) & “.”

Unused, but cool data…

Query for a hashed medallion number
OATH Daily Hearings Report

Part 4: The App and BigApps

Value for New Yorkers

  • People who regularly take taxis
  • People who regularly have bad interactions with taxis (ie running a red light outside their apartment)

A bit of control in a city that pushes you around



product @ClassPass | husband & dad | Transit & #bikenyc advocate | creator @Reported_NYC

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Jeff Novich

product @ClassPass | husband & dad | Transit & #bikenyc advocate | creator @Reported_NYC