Get the Edmunds editorial review of one model year: overall rating, verdict, summary, what you need to know, trim recommendation, competitors, pros, cons, topic ratings with text and detail grades such as Very Good. All text is plain text. Older model years return the shorter legacy review with sections instead of scores. A year or submodel that Edmunds has not reviewed returns a not-billable 404.
Run this endpoint
Endpoint
Parameters
Start with the required fields, then add optional filters only when your use case needs them.
string
Required
Make slug in lowercase. Example: toyota.
toyota
string
Required
Model slug in lowercase. Example: camry.
camry
integer
Required
Model year. Example: 2025.
2025
string
Required
Submodel slug from the model years endpoint. Example: sedan.
sedan
Request Examples
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: YOUR_API_KEY_HERE"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
<?php
use Illuminate\Support\Facades\Http;
$response = Http::timeout(30)
->withHeaders(['x-api-key' => 'YOUR_API_KEY_HERE'])
->get('https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan');
if ($response->successful()) {
echo $response->body();
} else {
echo "Error: " . $response->status();
}
const options = {
method: 'GET',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE'
}
};
fetch('https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan', options)
.then(response => {
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.text();
})
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
const axios = require('axios');
const options = {
method: 'GET',
url: 'https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan',
headers: {
x-api-key: 'YOUR_API_KEY_HERE',
}
};
try {
const response = await axios(options);
console.log(response.data);
} catch (error) {
console.error('Error:', error.message);
}
require 'net/http'
require 'uri'
uri = URI.parse("https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
request = Net::HTTP::Get.new(uri.request_uri)
request['x-api-key'] = 'YOUR_API_KEY_HERE'
begin
response = http.request(request)
puts response.body
rescue => e
puts "Error: #{e.message}"
end
import http.client
import json
conn = http.client.HTTPSConnection("scrappa.co")
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
conn.request("GET", "/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
except Exception as e:
print(f"Error: {e}")
finally:
conn.close()
import requests
headers = {
'x-api-key': 'YOUR_API_KEY_HERE',
}
try:
response = requests.get('https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan', headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
public class ApiExample {
public static void main(String[] args) {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan")
.addHeader("x-api-key", "YOUR_API_KEY_HERE")
.build();
try (Response response = client.newCall(request).execute()) {
if (response.isSuccessful()) {
System.out.println(response.body().string());
} else {
System.out.println("Error: " + response.code());
}
} catch (IOException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
package main
import (
"fmt"
"net/http"
"io/ioutil"
)
func main() {
client := &http.Client{}
req, err := http.NewRequest("GET", "https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan", nil)
if err != nil {
fmt.Println("Error creating request:", err)
return
}
req.Header.Set("x-api-key", "YOUR_API_KEY_HERE")
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error making request:", err)
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
fmt.Println(string(body))
}
#!/bin/bash
curl -X GET \
-H "x-api-key: YOUR_API_KEY_HERE" \
"https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan"
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
using var client = new HttpClient();
client.DefaultRequestHeaders.Add("x-api-key", "YOUR_API_KEY_HERE");
try
{
var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, "https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan"));
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(content);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
}
import axios from 'axios';
async function run(): Promise<void> {
try {
const response = await axios({
method: 'GET',
url: 'https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan',
headers: {
'x-api-key': 'YOUR_API_KEY_HERE',
},
});
console.log(response.data);
} catch (error) {
console.error('Error:', error);
}
}
void run();
use reqwest::Client;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let response = client
.get("https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan")
.header("x-api-key", "YOUR_API_KEY_HERE")
.send()
.await?;
println!("{}", response.text().await?);
Ok(())
}
Response Schema
Example response fields are illustrative; inspect the JSON before integrating.
Example response fields
Scan these fields before integrating.
success
data
meta
{
"success": true,
"data": {
"make": "toyota",
"model": "camry",
"year": 2025,
"submodel": "sedan",
"review": {
"rating": 8.4,
"verdict": "The redesigned 2025 Toyota Camry now has an all-hybrid lineup and it makes perfect sense for this moment. Besides great mpg, the Camry has a roomy and comfortab...",
"subtitle": "The 9th-generation Camry is all-hybrid, high-tech",
"summary": "Whoever said that the sedan is dead, Toyota would like a word with you because the company has given the 2025 Camry a complete redesign that transforms the mids...",
"need_to_know": "A source of confusion for 2025 might be the discontinuation of the Camry Hybrid \u2014 at least as a model name. But in actuality, Toyota has made every Camry a hybr...",
"recommendation": "We think the midgrade XLE model makes sense for most consumers. It comes with the larger 12.3-inch infotainment screen and some nice-to-have creature comforts,...",
"competitors": "The Toyota Camry's chief rival through the decades is the Honda Accord. The Accord was redesigned for the 2023 model year, incorporating smoothed-out styling wi...",
"pros": [
"High fuel economy",
"Quiet and roomy interior",
"Easy to drive and operate"
],
"cons": [
"Engine sounds coarse during hard acceleration",
"Front seat comfort is lacking"
],
"author_url": "https://www.edmunds.com/editorial/authors/brian-wong",
"published_on": "2024-05-01",
"updated_on": "2025-10-17",
"tested_on": "2024-04-15",
"url": "https://www.edmunds.com/toyota/camry/2025/review/",
"ratings": [
{
"topic": "driving",
"score": 8.6,
"text": "We tested the Camry XSE with front-wheel drive. Acceleration is smooth and easy, and there's enough power on tap when you need it for passing, merging and other..."
},
{
"topic": "comfort",
"score": 8,
"text": "The Camry's front seats feel a bit too firm, but they are great for back support on long drives. They're generally very comfortable once you settle in on a long..."
},
{
"topic": "value",
"score": 8.2,
"text": "Toyota's decision to make every Camry a hybrid means there are plenty of trim levels to choose from if you're seeking a hybrid. That's a different approach than..."
}
],
"details": [
{
"topic": "driving",
"aspect": "steering",
"grade": "Very Good",
"text": "Might be an unpopular opinion but I prefer the steering in the Camry to the Accord. There is a huge difference in the weighting between Normal and Sport mode, w..."
},
{
"topic": "storage",
"aspect": "space",
"grade": "Good",
"text": "15.1 cubic feet of space is less than both the Hyundai Sonata and the Honda Accord. Still, it should be plenty of space to accomodate a few large suitcases or a..."
},
{
"topic": "value",
"aspect": "warranty",
"grade": "Good"
}
]
}
},
"meta": {
"endpoint_family": "editorial_review",
"billable": true
}
}
Errors
Handle these documented responses before retrying or showing customer-facing failures.
Validation Error
A required query parameter is missing or invalid. This response is not billable.
{
"errors": {
"make": [
"The make field is required."
]
},
"message": "The request validation failed"
}Resource Not Found
The requested Edmunds resource does not exist. This response is not billable.
{
"meta": {
"billable": false,
"retryable": false,
"endpoint_family": "editorial_review"
},
"error": {
"code": "NOT_FOUND",
"message": "The requested Edmunds resource was not found."
},
"success": false
}Invalid Source Response
The upstream answered with a shape that no longer matches the documented contract. This response is not billable.
{
"error": {
"code": "PARSER_DRIFT",
"message": "The Edmunds API is temporarily unavailable. Please retry."
},
"success": false
}Service Unavailable
The upstream service is temporarily unavailable. Please retry shortly.
{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "The Edmunds API is temporarily unavailable. Please retry."
},
"success": false
}Generate Code with AI
Copy a ready-made prompt with all the endpoint details, parameters, and example responses. Paste it into ChatGPT, Claude, or any AI assistant to instantly generate working code.
Try It Live
Test this endpoint in our interactive playground with real data.