Skip to content
Scrappa Get API key
Edmunds API 1 credit/request

Edmunds Editorial Review API Documentation

GET https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan

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.

Edmunds Editorial Review API Documentation 1 credit/request

Endpoint

Request preview
GET
https://scrappa.co/api/edmunds/reviews/editorial?make=toyota&model=camry&year=2025&submodel=sedan
Auth header
x-api-key
Cost
1 credit/request
make = toyota model = camry year = 2025
Response preview
200 OK
{
    "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,...",
...

Parameters

Start with the required fields, then add optional filters only when your use case needs them.

Runnable path

4 required parameters needed before sending a request.

make string Required

Make slug in lowercase. Example: toyota.

Example value toyota
model string Required

Model slug in lowercase. Example: camry.

Example value camry
year integer Required

Model year. Example: 2025.

Example value 2025
submodel string Required

Submodel slug from the model years endpoint. Example: sedan.

Example value sedan

Request Examples

PHP
<?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
<?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();
}
JavaScript
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));
JavaScript
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);
}
Ruby
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
Python
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()
Python
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}")
Java
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());
        }
    }
}
Go
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))
}
Terminal
#!/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"
C#
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}");
        }
    }
}
TypeScript
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();
RUST
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
JSON Response
200 OK
{
    "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.

422

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"
}
404

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
}
503

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
}
503

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.