Hi! My first post here.

Im trying to paste multiple vin numbers into the nthsa API. Im later using this code inside of a shiny app.

My working solution looks like this:

library(jsonlite)
library(httr)

vins <- c('4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466','4JGCB5HE1CA138466',)

for (i in vins){

json  <- fromJSON(paste0('https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVinValues/',i,'?format=json'))

print(json)


}

This solution is very slow. I tried pbapply, same thing because it pastes one vin at a time.

There is a batch paste option that i just cant figure out. Can someone please assist.

Here is my code so far:

headers = c(
  `Content-Type` = 'application/json'
)

data = '[{"data":"4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466;4JGCB5HE1CA138466"}]'

httr::POST(url = 'https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/', httr::add_headers(.headers=headers), body = data)
print(r$status_code)

I am getting status code 200 but server code 500 with no data.

The vin numbers string has to be in the following format: vin;vin;vin;vin;

here is the link: https://vpic.nhtsa.dot.gov/api/ (the last one)

her, they also provide instructions for other languages: https://vpic.nhtsa.dot.gov/api/Home/Index/LanguageExamples

Thanks in advance.

library(jsonlite)
library(httr)
library(purrr)

I added purrr to the list of libraries because it's really great for working with lists like the one that the NHTSA API returns.

Here is our "list" of VINS

vins <- rep("4JGCB5HE1CA138466", 3)

It took some trial and error, but from looking at the examples the NHTSA provided in other languages, such as JavaScript, I was able to piece together that the body of the message should be a JSON object with entries for format = "json" and data to hold the VINs concatenated into a single string separated by ;. Note that httr will automatically convert lists to JSON for us.

The final detail was realizing that the NHTSA API wanted the POST body encoded as a form, requiring the encode = "form".

I also added verbose() so that httr prints information about the request. It can be helpful during debugging.

r <- httr::POST(
  url = "https://vpic.nhtsa.dot.gov/api/vehicles/DecodeVINValuesBatch/",
  body = list(
    format = "json",
    data = paste(vins, collapse = ";")
  ),
  encode = "form",
  verbose()
)

results <- httr::content(r)

httr automatically converts the returned JSON into an R list. Here we can see that the NHTSA API returns a JSON object with four top-level entries.

str(results, max.level = 1)
#> List of 4
#>  $ Count         : int 3
#>  $ Message       : chr "Results returned successfully. NOTE: Any missing decoded values should be interpreted as NHTSA does not have da"| __truncated__
#>  $ SearchCriteria: chr ""
#>  $ Results       :List of 3

The individual VIN results are returned in .$Results, and here I show just the first 10 entries with text of the first result...

results$Results[[1]] %>%
  purrr::keep(~ . != "") %>%
  .[1:10] %>%
  str()
#> List of 10
#>  $ AirBagLocFront          : chr "1st Row (Driver & Passenger)"
#>  $ AirBagLocSide           : chr "1st & 2nd & 3rd Rows"
#>  $ BodyClass               : chr "Sport Utility Vehicle (SUV)/Multi Purpose Vehicle (MPV)"
#>  $ DisplacementCC          : chr "3500.0"
#>  $ DisplacementCI          : chr "213.58310433156"
#>  $ DisplacementL           : chr "3.5"
#>  $ Doors                   : chr "4"
#>  $ DriveType               : chr "AWD/All Wheel Drive"
#>  $ EngineConfiguration     : chr "V-Shaped"
#>  $ EngineCylinders         : chr "6"
2 Likes

Amazing! You saved my life. Thank you!

If your question's been answered (even by you!), would you mind choosing a solution? It helps other people see which questions still need help, or find solutions if they have similar problems. Here’s how to do it:

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.