# PAVE OpenAPI Overview

Let anyone take photos of a car and get a detailed condition report and grading in minutes.

PAVE's an intelligent inspection API that helps you to add robust vehicle capture and inspection capability to your applications. This guide will allow you to quickly set up the ability to activate PAVE's guided capture UI to use in your workflows and automate your process using the returned inspection and image capture results.

### <mark style="color:blue;">**Base URL**</mark>

All URLs referenced in the API documentation have the following base;

```
https://openapi.paveapi.com/v1/sessions
```

The PAVE Inspection API (PAVE API) supports two environments from the same base URL:

* **Staging:** The environment is for your team to use for test purposes only. You may use your staging API key at any time. Your capture and inspection results will remain the same as production and return actual results. However, these sessions are not included in your monthly usage. For testing, set your API key as TEST in your developer settings by logging into your console.
* **Production:** The production environment will be used for any commercial capture and inspection usage and will be included in your monthly usage. For production, set your API key to LIVE in your developer settings.

### <mark style="color:blue;">**4-Step Process to Automate Your Inspections**</mark>

You can start implementing PAVE into your production in many ways.

<figure><img src="/files/KCZzOiRs2DjoD81xAN1V" alt=""><figcaption></figcaption></figure>

**Step one: Generate a unique PAVE Session URL** that will activate the guided capture UI. This Capture UI is a PWA (Progressive Web App) that utilizes the user's browser to walk them through capturing the required images. If needed, it can include specific vehicle disclosures, additional announcements, customized questions, and additional content-driven photo capture.

**Step two: Using the Capture UI,** the end-user starts their capture proces&#x73;**,** and you can track their progress in real-time from the dashboard or using the appropriate webhooks.

**Step three: With your Redirect URL,** the end-user gets directed back to your website or application using a redirect URL you included for each session; when the user is finished capturing the final image and has completed additional optional steps.

**Step four: Get comprehensive inspection results.** Within 150 seconds from the time the final image gets captured and transferred, you will get a detailed condition report and grading of the vehicle. As well as all the information you would need to automate your workflows.

### <mark style="color:blue;">**Eight Ways to Add PAVE’s Capture UI (PWA) in Your Application or Process**</mark>

Your end-users can access the PAVE Capture UI by clicking the unique session link you created. This capture interface works on most smartphones (iOS and Android, excluding Huawei) with no download required using our PWA (Progressive Web App) that can be distributed in eight ways.

### 1) Add PAVE to Your Native App&#x20;

Visit the [Deep Linking](/integrations/developer-docs/deep-linking) section on implementing PAVE's deep link capabilities to activate the PAVE Capture UI as a PWA from within your native mobile Android or iOS application.

{% content-ref url="/pages/r3H5pet7ulj66XdRuQys" %}
[Deep Linking](/integrations/developer-docs/deep-linking)
{% endcontent-ref %}

### 2) Add PAVE Button to Your Webpage or Application

```
<a href="https://{{your_account_name}}.vehiclecapture.com/{{session_key}}">CAPTURE VEHICLE PHOTOS</a>.
```

<figure><img src="/files/2BlxaSOGIjht4FuAVjH6" alt=""><figcaption></figcaption></figure>

Once you have the session\_key generated, you can launch the capture UI, which begins the inspection process. First replace **{{your\_account\_name}}** with the username provided for your account and replace **{{session\_key}}** in the PAVE session URL **`{{your_account_name}}`**`.vehiclecapture.com/`**`{{session_key}}`**, with the generated session\_key you created using the POST Create Session process.

These session launch URLs are one-use links so please request a new **`session_key`** for each vehicle to be inspected. Your Users will be able to start a capture and return at any time to complete the session where they last finished as these URLs do not expire.

As your end-user clicks the CTA on your page or space to launch PAVE use the [POST Create Session](/integrations/developer-docs/sessions-1/post-create-new-session) process to generate the **`session_key`** and replace **`{{session_key}}`**&#x69;n the session launch URL.

{% content-ref url="/pages/-MaZxUJPXizcnX0Nx61t" %}
[POST Create Session](/integrations/developer-docs/sessions-1/post-create-new-session)
{% endcontent-ref %}

### 3) Add Widget to Your Webpage

<figure><img src="/files/5HCk6kOor6g0n7H6aafT" alt=""><figcaption></figcaption></figure>

PAVE's dashboard provides easy-to-use tools to set up your website embeddable form widgets as a low code method to add a way for your website visitors to send a PAVE link via SMS to their phone. Set up your website form widget by visiting your dashboard and go to SETTINGS > WIDGETS > CREATE NEW WIDGET.

<figure><img src="/files/Yyb0ZoRcdvUc9wyKkoUI" alt=""><figcaption></figcaption></figure>

{% embed url="<https://dashboard.paveapi.com/dashboard>" %}

### 4) Include Sharable Link in Outbound Campaigns and Social Media

<figure><img src="/files/WhbFRGeByV0lsIkcbShj" alt=""><figcaption></figcaption></figure>

You can create shareable links to use for any API key from your dashboard. Shareable links make it easy to allow your customers to send themselves a PAVE link by SMS to their phone if they are not mobile or they can start a session directly if they are. Use shareable links in any of your email campaigns, or on social media. You can also include your own YouTube explainer video to enhance your sharable link landing page.

Set up sharable link widgets for each of your team by visiting your dashboard and go to SETTINGS > WIDGETS > CREATE NEW WIDGET > SHARABLE LINK.

<figure><img src="/files/4OeGbjWxLPJvhGRON7FS" alt=""><figcaption></figcaption></figure>

{% embed url="<https://dashboard.paveapi.com/settings?tab=widgets>" %}

### 5) Add Sharable Link to Your Device Home Screen&#x20;

<figure><img src="/files/kReCjJDT73ha7kbcafCM" alt=""><figcaption></figcaption></figure>

Once you create a sharable link, add it to the home screen on any smartphone to make it easy to send anyone a link or use it to start your capture sessions.

### 6) Generate QR Code of Shareable Link

<figure><img src="/files/9m0TJPfTGr82irsrAzyw" alt=""><figcaption><p>Scan QR Code to try out using a PAVE Sharable Link (for demo purposes only, please generate new QR code using your own link)</p></figcaption></figure>

### 7) Send Links as SMS From the Dashboard

<figure><img src="/files/XtHHoZT25MzzkLuIDzmg" alt=""><figcaption></figcaption></figure>

Once you get access to your PAVE dashboard you can start sending links as SMS messages right away.

{% embed url="<https://dashboard.paveapi.com/dashboard>" %}

### 8) Send Links as SMS Using API

The other option is to request an SMS message (containing a link to your User's own unique Capture URL) to be sent to your User directly from the PAVE API, and you can also have the results sent to any person from your organization when they are finished capturing their vehicle. To accomplish this option, you would only need to provide a "to" and a "from" mobile number in your POST Create Session request. If you use the callback URL option, you will also see when the recipient sends and receives the message. This process is covered in more detail in the section for the POST Create Session.

{% content-ref url="/pages/-MaZxUJPXizcnX0Nx61t" %}
[POST Create Session](/integrations/developer-docs/sessions-1/post-create-new-session)
{% endcontent-ref %}


# How PAVE Works


# Capture Link

Send a PAVE capture link by text to anyone.

<figure><img src="/files/HqUP2G4CB1Zwf1eEE01s" alt=""><figcaption></figcaption></figure>

1\) From your dashboard, select 'Send Inspection'.

<figure><img src="/files/do45WgfxrlSNCJ6siTjm" alt=""><figcaption><p>Step 1: Click 'Send Inspection'</p></figcaption></figure>

2\) Enter the details as shown and click 'Send Inspection'

<figure><img src="/files/lMVK7NXD4BlpgF40zfmI" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
If you would also like to send the inspection results to the inspector, then select the ' Send Inspection results to this number' check box as well. The inspector will then get a SMS with a link to the inspection results.
{% endhint %}

{% hint style="info" %}
You can send multiple captures to the same person, enter the number of inspections, and the recipient will receive the links.
{% endhint %}

{% hint style="info" %}
If you know the language preference of the recipient, selecting locale will translate their instructions. We will be adding several language preferences soon.
{% endhint %}

<figure><img src="/files/c9ruUOivD1RxksqygMQb" alt=""><figcaption></figcaption></figure>

With no downloads required, the recipient can start their capture by just clicking this link.

<figure><img src="/files/c9BHMQyQNAfZM3Ka3LjD" alt=""><figcaption></figcaption></figure>


# Guided Capture

PAVE's guided capture makes it easy for anyone to capture the required photos.

<figure><img src="/files/nF1KlLjLU8HvkpNRtCp9" alt=""><figcaption></figcaption></figure>

PAVE will automatically open in the user's browser on their device and begins their guided capture experience.

<figure><img src="/files/vNnQhsUtlo6ab4wRz54D" alt=""><figcaption></figcaption></figure>

Detailed instructions coincide with each image they get guided to capture using the PAVE Browser Camera. In real time, as the User takes the photos, they are checked for quality. If any are unusable, they will be informed and guided to recapture that view.


# Customer Disclosures

The user can quickly answer all your required disclosures and announcements once they're done taking the photos.

<figure><img src="/files/BuwJ1409wUpNODcu0UJW" alt=""><figcaption></figcaption></figure>

PAVE asks all the relevant disclosure and announcement questions to complete your requirements.

<figure><img src="/files/QVZMdagf2k9s8uB1RcIA" alt=""><figcaption></figcaption></figure>

{% tabs %}
{% tab title="Canada" %}
In your jurisdiction you are responsible for the disclosure of any facts you may know about this vehicle, please select any of the following that apply.

## Title Origin

**Out of Province**

Suppose the province of the last registration (or equivalent) to a retail customer is different than the jurisdiction from which the vehicle is currently being sold. In that case, the vehicle must be declared an out of province vehicle, and the Seller must identify the last province in which the vehicle was registered (or equivalent) to a retail customer. For vehicles sold in Ontario only: A car remains an out of province vehicle and must be so declared if it was previously registered (or equivalent) to a retail customer in another province and has been registered in Ontario for less than seven consecutive years. The Seller must declare all of the regions in which the vehicle was previously registered.<br>

**Cross Border**

The Seller must declare if the vehicle was ever registered in the United States or manufactured not in compliance with Canadian standards. All U.S. vehicles offered for sale must include a CarProof Verified vehicle history report or equivalent.<br>

**Title Branded**

The Seller must disclose if the vehicle’s title has been branded in accordance with provincial or state law and must indicate the brand(s) assigned.<br>

**Incorrect Vehicle Marking**

The Seller must disclose if any logo, badge, decal, emblem, ornament or similar markings on the vehicle do not match the make, model or series of the vehicle.<br>

**Stolen and Recovered**

The Seller must disclose if a vehicle was recovered after being reported stolen.<br>

**Warranty Cancelled**

The Seller must disclose if the manufacturer has cancelled the warranty on the Vehicle or has given notice of its intention to do so. Notice of warranty cancellation given after the date of sale is not subject to arbitration.<br>

**VIN Plate Issues**

The Seller must disclose if the original VIN plate (on the driver’s side of the dashboard) has been removed, altered or replaced. Vehicles may not be offered for sale unless the original VIN plate is intact or has been replaced in accordance with provincial and federal regulatory requirements.<br>

**Manufacturer Repurchase**

The Seller must disclose if the motor vehicle was repurchased by the manufacturer under the Canadian Motor Vehicle Arbitration Plan or under the laws of any jurisdiction including but not limited to U.S. lemon laws. If the reasons for, date and/or jurisdiction of the repurchase are known, they should be disclosed.<br>

**Total Loss**

The Seller must declare if an insurer determined the vehicle was a total loss.<br>

**Grey Market**

The Seller must declare if the vehicle was ever registered in a country other than the United States or Canada or manufactured not in compliance with North American standards. All Grey market vehicles offered for sale must include a CarProof Verified vehicle history report or equivalent.

## **Odometer**

**Odometer in Miles**

The Seller must disclose if the odometer is in miles.<br>

**Odometer Broken/Faulty**

The Seller must disclose if the odometer of the vehicle is broken or faulty, i.e. not accurately tracking distance driven.<br>

**Odometer Replaced**

The Seller must disclose if the odometer has been replaced.<br>

**Odometer Rollback**

The Seller must disclose if the odometer has been rolled back.<br>

**Odometer Unreadable**

The Seller must declare the odometer to be unreadable if it is accurately tracking distance driven but cannot be read due to pixel damage, because the vehicle cannot be started to obtain an odometer reading or similar reasons.<br>

**True Kilometres Unknown**

The Seller must declare a vehicle TKU (true kilometres unknown) if the distance travelled is unknown and there are no reliable records available to verify the odometer reading as of a certain date. When a vehicle is declared TKU, the total distance that a vehicle has been driven is likely substantially higher than the reading shown on the odometer.<br>

**Recent Kilometres Unknown**

If the total distance driven is unknown, but based on reliable records, the distance driven as of a certain date is known, the Seller must declare the last known distance and provide the date.<br>

**Odometer only has 5 Digits**

The Seller must disclose if the odometer is a five-digit odometer with over 100,000 miles or kilometres.

## **Damage**

**Accident Repair**

The Seller must declare a Vehicle to be Accident Repaired if the total cost to fix damage caused by a single incident was $3,000 or more ($2,000 cumulative incidents in British Columbia). The Accident Repair declaration must be made regardless of whether the damage was caused by collision, accident, weather or by some other incident. If the dollar value of the repair is known, it must be declared. If the Accident Repair information comes from a vehicle history report and the Seller believes that the Vehicle History Report is incorrect, it is the Seller’s obligation to get the report corrected within the Arbitration period or risk having the sale cancelled. Although not required, if the Seller chooses to declare an Accident Repair under $3,000 ($2,000 cumulative in B.C.), it may do so separately as an additional disclosure. Arbitration is not allowed for repairs under $3,000 ($2,000 cumulative in British Columbia).<br>

**Adjacent Panels Replaced**

The Seller must declare if two or more adjacent panels (excluding bumper panels) have been replaced on a vehicle. Please note: If the panels were replaced due to an accident or another incident, depending on the cost of the repairs, it may also be necessary for the Seller to make the Accident Repair declaration.<br>

**Excessive Rust**

The Seller must disclose if the vehicle suffers from excessive rust. Rust is considered to be excessive when the location or quantity of the rust affects the structural integrity of the vehicle, e.g. the frame or any structural component is perforated by rust.<br>

**Structural Damage**

The Seller must declare a vehicle to have structural damage if it meets the definition of structural damage set out in the National Auto Auction Association’s Structural Damage Policy. See [www.naaa.com](http://www.naaa.com)<br>

**Flood Damage**

The Seller must declare a vehicle as Flood Damaged when: i) water or other liquid has penetrated the vehicle to the level of the floorboards or higher; or ii) if any of the following components have been damaged due to immersion: Front or rear lighting or wiring harnesses, Engine and its major components, Transmission and differential, Dash instrument panel and wiring, Passenger seat cushions, Power seat or window motor, Major sound system components.<br>

**Fire Damage**

The Seller must disclose if the vehicle has been damaged by fire.<br>

**Irreparable**

Regardless of whether the title has been branded, the Seller must disclose if the vehicle is not capable of being repaired for roadworthy operation and may only be used for parts or scrap. Irreparable vehicles are assumed to also be Total Loss vehicles and thus the Total Loss declaration does not need to be made.

## **Mechanical**

**Air Bags Missing/Defective**

The Seller must disclose if the vehicle’s airbags are missing or not operational.<br>

**Major Repair Needed**

The Seller must disclose if a major component of the vehicle is defective or not operational and the component would cost over $750 (on a non-cumulative basis) to repair or replace in accordance with standard Mitchell warranty rates. Major components include: Engine, Transmission, Power train, Sub‐frame, Suspension, Computer equipment, Fuel operating system, Electrical system, Emissions system, Air Conditioning, Hail damage. The following items are not subject to arbitration: Upholstery, Glass, Tires, Visible body damage.<br>

**Material Variation from Production Specs**

The Seller must disclose if the vehicle varies materially from the original manufacturer’s specifications.<br>

**ABS Defective**

The Seller must disclose if the anti‐lock braking system is not operational (if equipped). Arbitration is only available for repairs over $750 (standard Mitchell warranty rates).<br>

**Alternate Fuel or Conversion**

The Seller must disclose if the vehicle uses propane or natural gas, or at any time had a propane or natural gas fuel system.

## **Previous Use**

**Previous Daily Rental**

The Seller must disclose if the vehicle was previously used as a daily rental vehicle (unless the vehicle was subsequently owned by a non‐dealer).<br>

**Previous Taxi/Limo**

The Seller must disclose if the vehicle was previously used as a taxi or limousine.<br>

**Previous Driving School Vehicle**

The Seller must disclose if the vehicle was previously used as a driving school vehicle.<br>

**Previous Police Vehicle**

The Seller must disclose if the vehicle was previously used as a police cruiser.<br>

**Previous Emergency Services Vehicle**

The Seller must disclose if the vehicle was previously used as an emergency services vehicle.<br>
{% endtab %}

{% tab title="USA" %}

{% endtab %}
{% endtabs %}

| DISCLOSERS                      |        |        |
| ------------------------------- | ------ | ------ |
| **TITLE BRANDED**               | Yes    | No     |
| GREY MARKET                     | Red    | Green  |
| INCORRECT VEHICLE MARKING       | Red    | Green  |
| MANUFACTURER REPURCHASE         | Red    | Green  |
| OUT OF STATE/OUT OF PROVINCE    | Select | Select |
| TITLE BRANDED                   | Select | Select |
| TOTAL LOSS                      | Red    | Green  |
| CROSS BORDER                    | Red    | Green  |
| VIN PLATE ISSUES                | Red    | Green  |
| WARRANTY CANCELLED              | Red    | Green  |
| STOLEN AND RECOVERED            | Red    | Green  |
|                                 |        |        |
| **ODOMETER**                    |        |        |
| ODOM 5 DIGIT                    | Red    | Green  |
| ODOM FAULTY                     | Red    | Green  |
| ODOM IN OTHER                   | Red    | Green  |
| ODOM REPLACED                   | Red    | Green  |
| ODOM ROLL BACK                  | Red    | Green  |
| ODOM UNREADABLE                 | Red    | Green  |
| TMU                             | Input  | Input  |
| RMU                             | Input  | Input  |
|                                 |        |        |
| **DAMAGES**                     |        |        |
| ACCIDENT REPAIR                 | Input  | Input  |
| ADJACENT PANELS REPLACED        | Red    | Green  |
| EXCESSIVE RUST                  | Red    | Green  |
| FIRE DAMAGE                     | Red    | Green  |
| FLOOD DAMAGE                    | Red    | Green  |
| IRREPARABLE                     | Red    | Green  |
| STRUCTURAL DAMAGE               | Red    | Green  |
| ​                               |        |        |
| **MECHANICAL**                  |        |        |
| ABS DEFECTIVE                   | Red    | Green  |
| AIR BAG DEFECTIVE               | Red    | Green  |
| ALTERNATE FUEL                  | Red    | Green  |
| NONE SPECS                      | Red    | Green  |
| MAJOR REPAIR                    | Red    | Green  |
| ​                               |        |        |
| **PREVIOUS USE**                |        |        |
| PREVIOUS DAILY RENTAL           | Red    | Green  |
| PREVIOUS DRIVING SCHOOL VEHICLE | Red    | Green  |
| PREVIOUS EMERGENCY VEHICLE      | Red    | Green  |
| PREVIOUS POLICE VEHICLE         | Red    | Green  |
| PREVIOUS TAXI LIMO              | Red    | Green  |
|                                 |        |        |
| **ANNOUNCEMENTS**               |        |        |
| TITLE PRESENT                   | Red    | Green  |
| ALL KEYS PRESENT                | Red    | Green  |
| BOOKS PRESENT                   | Red    | Green  |
| DISCS PRESENT                   | Red    | Green  |
| RIMS TIRES                      | Red    | Green  |
| OTHER ANNOUNCEMENTS             | Input  | Input  |


# Identified Vehicle Information

<figure><img src="/files/NPlefG7ZCjWgVhDBAPlM" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/d9BlJxHaE0aFSvNuC6Cg" alt=""><figcaption><p>Consistent and accurate data captured on every vehicle.</p></figcaption></figure>

**PAVE gets you all the vehicle information:**

* **Full Address of Capture Location (May Not Always be the User's Residence)**
* **VIN (Vehicle Identification Number)**
* **Exact Odometer Reading (Including Mileage Type)**
* **Year, Make, Model**
* **Trim is Identified and Mapped by PAVE If Any Visual Clues Like Badging is Available.**
* **Transmission**
* **Exterior and Interior Factory Color Name**


# Captured Photos

Get 13 HD and 4K Photos on Every Appraisal

<figure><img src="/files/PylX1fZLRcylJmjjPVIx" alt=""><figcaption></figcaption></figure>

Every PAVE capture comes with 11 to 13 photos. At times the user may not capture their VIN or Odometer but opt to manually input. You can tell when this has been done when you see a grey box instead of the photo on your Park Page. We are moving towards capturing 4k images when the User has enough connection bandwidth. These strategically angled photos ensure you receive a complete, unobstructed 360 view of every vehicle.

<figure><img src="/files/bZQvJqyJpfOJx33OOWW5" alt=""><figcaption></figcaption></figure>

You can also download these photos to use for other purposes like merchandising incoming trades before they arrive. To do this, click on the PHOTOS button on the vehicle listing within your dashboard. A file will download all the captured initial photos with the VIN as the file name.


# Text Notifications

Be Engaged The Second They Become Re-engaged.

<figure><img src="/files/PdJ6ZBuxe6eYG3JqioFW" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/HR6mzcm0IeuNIG8beiAw" alt=""><figcaption></figcaption></figure>

Set up to two people at your dealership to automatically receive the results via text message when the vehicle capture is completed.

This immediacy allows you to confidently appraise the trade-in right then and there, no peppering of additional questions. Thus affording your people the opportunity to communicate with the customer while top of mind. No delays!


# Inspection Results

### Inspection Results

Once an inspection is complete, the results are available in both an HTML format (Landing Page) and a PDF based Condition Report.

To view the inspection results, simply click the 'Results' icon, which then opens the inspection results in a new browser window or tab in an HTML Landing Page.&#x20;

<figure><img src="/files/TEoaWpMjxZ86Ia2RcoXi" alt=""><figcaption><p>Click 'Results' to view the Inspection Results</p></figcaption></figure>

#### Landing Page

The Landing Page page details the inspection results.&#x20;

It consists if many sections, such as

* Session Details
  * Date
  * Address (if applicable)
  * Session ID
* Vehicle Information
  * VIN
  * Year Make Model
  * Trim
  * Engine
  * Transmission&#x20;
  * Odometer
  * Colour
* Vehicle Grading
* Link to Condition Report PDF
* Vehicle Photos
* Damage Details

<figure><img src="/files/QVCWr0JAxzG1MFIUEGKF" alt=""><figcaption><p>Inspection Report</p></figcaption></figure>

> <https://dashboard.paveapi.com/park/UDB-512D3TASIY>

{% hint style="info" %}
The Results page URL is shareable and does not expire&#x20;
{% endhint %}


# Condition Report (PDF)

### Condition Report

The Condition Report is a document that presents inspection results in both PDF and HTML formats. The PDF version is commonly shared with consumers, while the HTML report is primarily used for internal purposes and includes KBB values. It is important to note that if an inspection is conducted under the PRO theme, the HTML report will not display the KBB value, and the dashboard will not provide an HTML report link. The LITE theme must be used to access the HTML report with the KBB value. You can change the theme under your selected API Key to run the inspection.

Please be aware that there are instances where the KBB report may not be available. This can occur if insufficient data in the sample set for the specific geographic location where the inspection was completed. KBB relies on data from similar vehicles in the area to provide accurate values.

To access the Condition Report, click on the 'Condition Report PDF' icon located on the Inspection Result HTML page, as shown in the image below:

<figure><img src="/files/HSTGoBmmp3xxeszczNvT" alt=""><figcaption><p>Click the 'Condition Report PDF' on the Inspection Report to open the Condition Report</p></figcaption></figure>

<figure><img src="/files/6tbhbsqmx6pYeN0hGdcA" alt=""><figcaption><p>Condition Report</p></figcaption></figure>


# Detected Damages

{% file src="/files/War5G7NzAmxTt8rUO3qM" %}

### Detected Damages by PAVE

PAVE's inspection engine analyzes images to detect 350 specific damages of different degrees of severity that cover most cosmetic damages on 249 components that make up the anatomy of over 23,000 light commercial and passenger vehicle models sold over the past 15 years in North America that PAVE’s models were developed from.

These damages are mainly concentrated on the exterior and wheels and tires.&#x20;

<figure><img src="/files/laOnZEi947ahQmb2a2XP" alt=""><figcaption><p><strong>NUMBER OF DAMAGES PER COMPONENT TYPE</strong></p></figcaption></figure>

<figure><img src="/files/6SZZUA2Gq6bLLZeg4EOu" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/26kRNs9SQsn28Tl3R2Jc" alt=""><figcaption><p><strong>PAVE REPAIR TYPES</strong></p></figcaption></figure>

<figure><img src="/files/bVeXdYpazPXRO5ph3nqH" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/jaCQY3kpmZuSBLCGZk8j" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/JRLoBfLxd208yXRslqRW" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/7743TQM18noWxcLGJhaS" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/8psJUyYuM4XQRzevloPV" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/XMjUnT7yEJteXw1QphFA" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/5erFAIBjolT9xHiNWZvd" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/HWT2aaMNLkw1o6iT2cws" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/0xz7FgtlssPeS9egm80i" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/hx7CryLuSWOiZzCal1EL" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/d1nG5VuoAVUpOzTibfbu" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/HdgKJwVd5FHmKsQnB0rn" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/N0ISVAqAgqwOZ2JHxri6" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/4iZv1WRoaccHFva73nNr" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/GRXEqUZzCwMdnWlvn1jx" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/3G8xGDWULh62VYXIwsva" alt=""><figcaption></figcaption></figure>

PAVE has no known limitations on its ability for detecting damages from 2D images on any vehicle type, body style or color. However, other environmental factors that can impact PAVE's results are:

Captures of vehicles in the dark or at night. \
Captures of cars or trucks during significant rain or snowfall. \
Captures of images when standing in direct sunlight.


# Grading

Comprehensive Vehicle Grading with PAVE

PAVE's grading system is a critical component of its platform, allowing it to provide a comprehensive assessment of the condition of a vehicle. After PAVE's system detects all damages, it calculates the overall grading of the vehicle to provide an accurate representation of its condition.

The grading standards used by PAVE are the result of a careful combination of the best practices from the global automotive industry. This approach ensures that PAVE's grading system is based on the most widely accepted and comprehensive industry standards. As a result, clients can trust that the grading they receive from PAVE is a reliable and accurate representation of the vehicle's condition.

PAVE's grading system is designed to be transparent and user-friendly. Clients can easily understand the grading results, making it easier for them to make informed decisions about their vehicles. Whether it's for insurance claims, vehicle purchases, or leasing, PAVE's grading system provides the essential information clients need to make informed decisions.

<figure><img src="/files/Bxa3kMv5xm9IXVBLuap1" alt=""><figcaption><p>PAVE Grading Standardizes All Your Appraisals </p></figcaption></figure>

<figure><img src="/files/dFm7dtogeYww2v6Jt3rR" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/nazAiFvBK149YYZOkZY4" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/DkqkcLU8QWhILtmOAnAe" alt=""><figcaption></figcaption></figure>


# Languages

Introduction to PAVE's User Interface Language Internationalization

PAVE is committed to providing a seamless experience for its users all over the world. With the aim of expanding its global reach, PAVE has undergone a significant overhaul in its language handling capabilities. The company has implemented a new approach to language management, which involves internationalizing its user-facing text from the views and layouts of its key components - the client dashboard, the PWA Capture UI, and the park page.

With this new language internationalization, PAVE's user interface can now automatically render text to match the language settings of the user's browser in a staggering 78 different languages. This means that no matter where PAVE's users are located, they will be able to access its platform and its features in their preferred language, making the experience more accessible and enjoyable.

The redesigned language handling capabilities of PAVE are a significant step forward in the company's mission to provide a world-class experience to its users, no matter where they are located.

<figure><img src="/files/IBXSU4PcPRBRrzfG3IpF" alt=""><figcaption></figcaption></figure>

### Language Localization of API Results and PDF Condition Report

PAVE's commitment to providing a seamless and accessible experience for its users extends beyond its user interface. We have also taken steps to localize its API damage results and PDF condition reports in various languages. When a new license is set up for a client, they can choose up to two languages from the ten available languages for their OpenAPI account. These selected languages will be used to generate the results and PDF report in the client's preferred language.

PAVE's language localization efforts ensure that its clients can access their inspection results and PDF reports in a language that is most suitable for them. As PAVE continues to expand into new regions, the company plans to add additional languages to its available options, further increasing the accessibility of its platform.

We hope, PAVE's language internationalization and localization efforts are a testament to our dedication to providing a world-class experience to its users. With the ability to access its platform and results in their preferred language, PAVE's clients can focus on making informed decisions without being hindered by language barriers.

<figure><img src="/files/TMAl5KvpQPCIqaJLEpov" alt=""><figcaption></figcaption></figure>


# Accuracy & Limitations

PAVE is designed to match the accuracy of in-person inspections, though some limitations in damage detection may occur when relying solely on analyzing photos.

PAVE is designed to match the accuracy of in-person inspections, despite some limitations in damage detection from photos alone. PAVE's grading capabilities have been extensively tested and improved over the past two years with the help of one of North America's largest auto auctions. In April 2022, the most recent test was conducted, comparing the PAVE reports for 200 vehicles to the in-person inspection reports from the auction.

## PAVE Damage Detection Limitations

### Interior Inspections Not Included&#x20;

Our User Acceptance Testing has shown that users are less likely to complete the inspection process if it requires more than 13 photos and takes longer than 3 minutes. As a result, a complete interior inspection using PAVE's approach is not feasible. However, the grading algorithm accounts for the interior to be in similar condition to the exterior. Tests have shown that when PAVE grades a vehicle as being in Poor Condition, it is expected that the interior will also be in poor condition.

### Glass Damage May Not Show in Photos&#x20;

PAVE inspects all glass surfaces for cracks, chips, scratches, and stars. On average, 70% of these types of damages can be seen in the photos captured. However, small chips and stars in a windshield may not be visible in the photos and therefore, undetectable by PAVE.

### Previous Accident Repairs&#x20;

Detection of previous paintwork is best done with a paint gauge to measure the thickness of paint on each panel. PAVE will detect mismatched paintwork and misaligned panels, but it cannot effectively detect previous accidents. We recommend checking the vehicle's history report to confirm any reported accidents.

##


# Developer Docs


# Authentication

The PAVE Capture API requires authentication for all API calls, which is achieved through the use of an HMAC-SHA256 message hash as a header within the request.

### Introduction

This section provides the details on how to use the `curl` command to access the PAVE OpenAPI sessions endpoint using `API-Key`, `API-Token`, and `API-Timestamp` headers. The `API-Key` and `API-Token` are used for authentication purposes, and the `API-Timestamp` is used for ensuring the freshness of the request.

### Endpoint

```bash
https://openapi.paveapi.com/v1/sessions
```

### HMAC-SHA256

HMAC (Keyed-Hash Message Authentication Code) is a cryptographic technique that calculates a message authentication code by combining a cryptographic hash function with a secret key. In the case of the PAVE Capture API, the cryptographic hash function used is SHA256, resulting in the algorithm known as HMAC-SHA256.

### Prerequisites

* A valid API Key and API Token should be obtained before accessing the API endpoint.
* `curl` must be installed on your system.

### Steps to Use curl

1. Open a terminal or command prompt.
2. Use the following `curl` command to access the API endpoint:

```bash
curl -H "API-Key: <Your_API_Key>" \
     -H "API-Token: <Your_Generated_Access_Token>" \
     -H "API-Timestamp: <UTC_Datetime_String>" \
     https://openapi.paveapi.com/v1/sessions
```

3. Replace `<Your_API_Key>` with your API Key.
4. Replace `<Your_Generated_Access_Token>` with your API Token.
5. Replace `<UTC_Datetime_String>` with the UTC datetime in the format `YYYY-MM-DDTHH:MM:SSZ`. For example, `2023-02-11T12:00:00Z`.
6. Execute the `curl` command.
7. The API endpoint will return a JSON object containing the session data.

### Headers

The following headers are required for each API request:

| Header Name     | Description                                                                         |
| --------------- | ----------------------------------------------------------------------------------- |
| `API-Key`       | Your API Key, which is used to identify your account and provide access to the API. |
| `API-Token`     | A generated access token, which is used to authenticate your API request.           |
| `API-Timestamp` | The UTC datetime string, which is used to verify the freshness of your request.     |

### Note

* Make sure to replace the placeholders with the actual values before executing the `curl` command.
* Ensure that the UTC datetime string in the `API-Timestamp` header is accurate and up-to-date, as it is used for ensuring the freshness of the request.
* `API-Token`: will expire within 5 minutes.

### Response

If the request is successful, the API server will return a JSON object that contains the session information, including the session ID, expiration time, and the associated API Key and access token.

Example response:

```json
{
  "session_id": "f8f4e4c1-6416-4d4a-8b16-f15a4e4a1c2d",
  "expiration": "2023-02-11T12:00:00Z",
  "api_key": "abcd1234",
  "api_token": "efgh5678"
}
```

### Error Responses

If there is an error with the request, the API server will return a JSON object with an error message. Some possible error messages include:

* `Invalid API Key`: The provided API Key is invalid or does not match any existing accounts.
* `Invalid API Token`: The provided access token is invalid or has expired.
* `Invalid API Timestamp`: The provided UTC datetime string is invalid or the request is stale.

Example error response: **`403 Forbidden`**&#x20;

```json
 {
  "message": "Unable to validate the request, please recheck your API-Key and API-Token."
}
```

### Here are examples of how to make this API request using different programming languages:

#### JavaScript

```javascript
const axios = require('axios');

const apiKey = '<Your_API_Key>';
const apiToken = '<Your_Generated_Access_Token>';
const apiTimestamp = '<UTC_Datetime_String>';

axios({
  method: 'post',
  url: 'https://openapi.paveapi.com/v1/sessions',
  headers: {
    'API-Key': apiKey,
    'API-Token': apiToken,
    'API-Timestamp': apiTimestamp
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error.response.data);
  });
```

#### Python

```python
import requests

api_key = '<Your_API_Key>'
api_token = '<Your_Generated_Access_Token>'
api_timestamp = '<UTC_Datetime_String>'

headers = {
    'API-Key': api_key,
    'API-Token': api_token,
    'API-Timestamp': api_timestamp
}

response = requests.post(
    'https://openapi.paveapi.com/v1/sessions',
    headers=headers
)

if response.status_code == 200:
    print(response.json())
else:
    print(response.json()['error'])
```

#### Go

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

const apiKey = "<Your_API_Key>"
const apiToken = "<Your_Generated_Access_Token>"
const apiTimestamp = "<UTC_Datetime_String>"

func main() {
	url := "https://openapi.paveapi.com/v1/sessions"

	client := &http.Client{}
	req, err := http.NewRequest("POST", url, nil)
	if err != nil {
		fmt.Println(err)
		return
	}

	req.Header.Set("API-Key", apiKey)
	req.Header.Set("API-Token", apiToken)
	req.Header.Set("API-Timestamp", apiTimestamp)

	resp, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}

	defer resp.Body.Close()

	var result map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&result)

	fmt.Println(result)
}
```

#### Swift

```swift
import Foundation

let apiKey = "your_api_key"
let apiToken = "your_generated_access_token"
let url = URL(string: "https://openapi.paveapi.com/v1/sessions")!
let timestamp = DateFormatter().string(from: Date())

var request = URLRequest(url: url)
request.addValue(apiKey, forHTTPHeaderField: "API-Key")
request.addValue(apiToken, forHTTPHeaderField: "API-Token")
request.addValue(timestamp, forHTTPHeaderField: "API-Timestamp")

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data, let response = response as? HTTPURLResponse, error == nil else {
        print("Error: \(error?.localizedDescription ?? "Unknown error")")
        return
    }

    if response.statusCode == 200 {
        print(String(data: data, encoding: .utf8) ?? "Empty response")
    } else {
        print("Unexpected response code: \(response.statusCode)")
        print(String(data: data, encoding: .utf8) ?? "Empty response")
    }
}
task.resume()

```

#### Kotlin

```kotlin
import java.net.URL
import javax.net.ssl.HttpsURLConnection

fun main() {
    val apiKey = "<Your_API_Key>"
    val apiToken = "<Your_Generated_Access_Token>"
    val apiTimestamp = "<UTC_Datetime_String>"

    val url = URL("https://openapi.paveapi.com/v1/sessions")

    with(url.openConnection() as HttpsURLConnection) {
        requestMethod = "POST"
        setRequestProperty("API-Key", apiKey)
        setRequestProperty("API-Token", apiToken)
        setRequestProperty("API-Timestamp", apiTimestamp)

        inputStream.bufferedReader().use {
            val response = it.readText()
            println(response)
        }
    }
}
```


# Generate Access Token

Implementation Examples of Access Token Generation in Various Programming Languages

Create access token by using [**`HMAC-SHA256`**](https://en.wikipedia.org/wiki/HMAC)

An access token can be generated by combining the api\_key and timestamp string with the provided api\_secret.

| Attribute        | Description                                        |
| ---------------- | -------------------------------------------------- |
| **`api_key`**    | Get it from your PAVE Developer dashboard          |
| **`api_secret`** | Get it from your PAVE Developer dashboard          |
| **`timestamp`**  | UTC Datetime string, example: 2021-05-30T12:49:19Z |

### Examples in Different Languages:

{% tabs %}
{% tab title="PHP" %}

```php
$token = hash_hmac('sha256', '<username>:<api_key>@<timestamp>', '<api_secret');
// https://www.php.net/manual/en/function.hash-hmac.php
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const crypto = require('crypto');

const apiKey = 'your_api_key';
const apiSecret = 'your_api_secret';
const username = 'your_username';
const timestamp = (new Date()).toJSON(); 

const message = `${username}:${apiKey}@${timestamp}`;
const accessToken = crypto.createHmac('sha256', apiSecret).update(message).digest('hex');
```

{% endtab %}

{% tab title="Python" %}

```python
import hashlib
import hmac
from datetime import datetime, timezone

api_key = 'your_api_key'
api_secret = 'your_api_secret'
username = 'your_username'

timestamp = datetime.now(timezone.utc).isoformat()

message = f'{username}:{api_key}@{timestamp}'
access_token = hmac.new(api_secret.encode('utf-8'), msg=message.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"time"
)

func main() {
	apiKey := "your_api_key"
	apiSecret := "your_api_secret"
	username := "your_username"
	timestamp := time.Now().Format(time.RFC3339)

	message := fmt.Sprintf("%s:%s@%d", username, apiKey, timestamp)
	hmac := hmac.New(sha256.New, []byte(apiSecret))
	hmac.Write([]byte(message))
	access_token := hex.EncodeToString(hmac.Sum(nil))

	fmt.Println(signature) // prints the HMAC-SHA256 signature
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import CommonCrypto
import Foundation

func hmacSha256(message: String, key: String) -> String {
    let messageData = message.data(using: .utf8)!
    let keyData = key.data(using: .utf8)!
    var hmacData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))

    hmacData.withUnsafeMutableBytes { hmacPtr in
        CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), (keyData as NSData).bytes, keyData.count, (messageData as NSData).bytes, messageData.count, hmacPtr)
    }

    return hmacData.map { String(format: "%02hhx", $0) }.joined()
}

let apiKey = "your_api_key"
let apiSecret = "your_api_secret"
let username = "your_username"

let dateFormatter = ISO8601DateFormatter()
dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
let timestamp = dateFormatter.string(from: Date())

let message = "\(username):\(apiKey)@\(timestamp)"
let accessToken = hmacSha256(message: message, key: apiSecret)
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import java.nio.charset.StandardCharsets
import java.security.Key
import java.security.MessageDigest
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec
import java.time.LocalDateTime
import java.time.OffsetDateTime
import java.time.ZoneOffset
import java.time.format.DateTimeFormatter

fun main() {
    val apiKey = "your_api_key"
    val apiSecret = "your_api_secret"
    val username = "your_username"
    
    val utcDateTime = LocalDateTime.now(ZoneOffset.UTC)
    val offsetDateTime = OffsetDateTime.of(utcDateTime, ZoneOffset.UTC)
    val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX")
    val timestamp = offsetDateTime.format(formatter)

    val message = "$username:$apiKey@$timestamp"
    val accessToken = hmacSha256(message, apiSecret)    
}

fun hmacSha256(message: String, key: String): String {
    val secretKey = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "HmacSHA256")
    val mac = Mac.getInstance("HmacSHA256")
    mac.init(secretKey)
    val hmac = mac.doFinal(message.toByteArray(StandardCharsets.UTF_8))
    return bytesToHex(hmac)
}

fun bytesToHex(bytes: ByteArray): String {
    return bytes.joinToString("") { "%02x".format(it) }
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
To generate the correct token, please make sure the combination string you are using with the 1) api\_key, 2) timestamp and 3) api\_secret are arranged in this order.
{% endhint %}

{% hint style="info" %}
To generate the correct token, please ensure your timestamp is using UTC Datetime. And use the matching timestamp to the one included in your header when generating your token.
{% endhint %}

{% hint style="info" %}
Replace        \<username>&#x20;

with the primary account name that your representative initially provided. If you have an Enterprise account, use that account name, not one of the branch account.  Do not set \<username) as one of the user names you created in your dashboard.
{% endhint %}


# Sessions


# POST Create Session

Create a new session for every User by generating a session\_key.

### Endpoint

```
POST https://openapi.paveapi.com/v1/sessions 
```

#### Headers

```makefile
Accept: application/json
Content-type: application/json
API-Key: Your_API_Key
API-Token: Your_Generated_Access_Token
API-Timestamp: UTC Datetime
```

| Headers       | Description                                                                                                           | Example                                   |
| ------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
| Accept        | Specifies the format in which the response should be returned. In this case, the response should be returned in JSON. | Accept: application/json                  |
| Content-type  | Specifies the format in which the request body should be sent. In this case, the request body should be sent in JSON. | Content-type: application/json            |
| API-Key       | The API Key for authentication.                                                                                       | API-Key: Your\_API\_Key                   |
| API-Token     | The Access Token generated for the API Key for authentication.                                                        | API-Token: Your\_Generated\_Access\_Token |
| API-Timestamp | The UTC Timestamp when the request was made.                                                                          | API-Timestamp: UTC Datetime               |

### Create New Session

To create a new session, post your related information to the PAVE endpoint to generate a **`session_key`**. A **`session_key`** is a unique identifier for each user that is used to create one-time-use links. The user can return to their link at any time to continue their session.

Providing a PAVE Capture Link to the user is a three-step process:

1. Use the POST Create Session endpoint to obtain a session\_key.
2. Add the session\_key to the PAVE Capture URL to create a unique link for the user.
3. Provide the user with the link.

#### Sample PAVE Capture URL (User Link):

<pre class="language-markup"><code class="lang-markup">https://<a data-footnote-ref href="#user-content-fn-1">{{your_account_name}}</a>.vehiclecapture.com/<a data-footnote-ref href="#user-content-fn-2">{{session_key}}</a>
</code></pre>

Replace **`{{your_account_name}}`** with the username for your PAVE account and replace **`{{session_key}}`** with the session\_key returned from your request.

{% hint style="success" %}
**Introducing the New End-User Capture URL: Your Branded URL is Now Available for Use**

We are excited to announce that the new end-user capture URL is now live and ready for use. You can now start using your own branded capture URL in place of the previously listed URL

<pre class="language-html"><code class="lang-html"><strong>https://{{your_account_name}}.vehiclecapture.com/{{session_key}}
</strong>
Embed as CTA:
&#x3C;a href="https://{{your_account_name}}.vehiclecapture.com/{{session_key}}>&#x3C;Start Inspection&#x3C;/a>.
</code></pre>

{% endhint %}

#### **Sample** Request&#x20;

```
curl -H "Accept: application/json" \
     -H "Content-type: application/json" \
     -H "API-Key: Your_API_Key" \
     -H "API-Token: Your_Generated_Access_Token" \
     -H "API-Timestamp: UTC Datetime string, example: 2021-05-30T12:49:19Z" \
     -d '{
            "vehicle": {
                "vin":"JN1CV6AR9BMXXXXXX",
                "year":"2011",
                "make":"Infiniti",
                "model":"G37",
                "body_type":"Sedan",
                "trim":"Luxury",
                "transmission":"Automatic",
                "ext_col":"Malbec Black",
                "int_col":"Wheat",
                "odom_reading":330477,
                "odom_unit":"KILOMETRES"
            },
            "session": {
                "theme": "LITE",
                "redirect_url": "https://www.url-to-redirect-user-to.com",
                "client_id": "SOUTH234889"
            },
            "sms": {
                "to": "647-455-XXXX",
                "to_name": "Jane Smith",
                "from": "647-422-XXXX",
                "by": "Steve Test Dealer"
            }
        }' \
     -X POST https://openapi.paveapi.com/v1/sessions
```

{% hint style="info" %}
Optional Fields in Payload for Non-SMS Method: Including Redirect URL is Highly Recommended"

If you are not using the SMS method, none of the fields in the payload are mandatory. However, it is highly recommended to include the `redirect_url` field at a minimum in order to provide a more seamless user experience
{% endhint %}

## Customizable User Experience for Every Session&#x20;

Enhance the PAVE experience for each User by including additional data in your request. This information is optional and if not included, a session based on the default PAVE settings (the default being the PRO version) will be generated. Each session contains information specific to that session, which you supply in your request, organized as key/value pairs in a flat JSON format.

### The following are the attributes of the Session Object:

| Attribute     | Description                                                                                                                                                                                                                                                                                                                                                                                           | Default Value         |
| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------- |
| theme         | Choose between PRO or LITE.                                                                                                                                                                                                                                                                                                                                                                           | PRO                   |
| redirect\_url | The **`redirect_url`** is the handoff URL that we will send your User to at the end of their PAVE session to continue their journey on your application or website.                                                                                                                                                                                                                                   | <https://paveapi.com> |
| client\_id    | To protect your User's privacy we prefer that you send us only a client ID to avoid storing or listing any Personal Identifiable Information (PII) on our servers or from being included in the JSON object response.                                                                                                                                                                                 | *NULL*                |
| root\_id      | The root\_id is only applicable when creating a session within an Enterprise account.  It is not a required value when creating a session within a PAVE Business account. The root\_id refers to the branch account that you would like to create the session within. You must contact your PAVE representative to obtain the root\_id of a branch account as it is not present within the dashboard. | NULL                  |

### Theme Options

PAVE API currently offers three different themes for your Capture UI: LITE, PRO, and CAPT. Each theme offers a different user flow and the resulting data.

#### LITE Theme

The LITE theme is a lightweight user flow intended for non-professional users (Consumers). This theme does not return any session results at the end of the user flow (after completing the Disclosures and Announcements section) and will send them to the `redirect_url` to be included in the request.

Here's how to set the LITE theme:

Within a PAVE Business account

```json
"session": {
    "theme": "LITE",
    "redirect_url": "https://your_redirect_url.com",
    "client_id": "SOUTH234889"
}
```

Within a PAVE Enterprise account

```json
"session": {
    "theme": "LITE",
    "redirect_url": "https://your_redirect_url.com",
    "client_id": "SOUTH234889",
    "root_id": 11123
}
```

#### PRO Theme

The PRO theme offers an extended user flow that includes an overview of all the vehicle information, a description of all the detected damages, and the ability for users to edit, describe, add photos and label added damages.

Here's how to set the PRO theme:

Within a PAVE business account

```json
"session": {
    "theme": "PRO",
    "redirect_url": "https://your_redirect_url.com",
    "client_id": "SOUTH234889"
}
```

Within a PAVE Enterprise account

```json
"session": {
    "theme": "PRO",
    "redirect_url": "https://your_redirect_url.com",
    "client_id": "SOUTH234889"
    "root_id": 11123
}
```

#### CAPT Theme

The CAPT theme requires activation on your account and allows you to set the user flow to only capture selected photos that are quality checked as they get captured. This theme does not include any type of damage detection or inspection.

Please ensure the API key you are using has a CAPT theme associated to it before using.

Here's how to set the CAPT theme:

Within a PAVE Business Account

```json
"session": {
    "theme": "CAPT",
    "redirect_url": "https://your_redirect_url.com",
    "client_id": "SOUTH234889"
}
```

Within a PAVE Enterprise Account

```json
"session": {
    "theme": "CAPT",
    "redirect_url": "https://your_redirect_url.com",
    "client_id": "SOUTH234889"
    "root_id": 11123
}
```

### The following are the attributes of the Vehicle Object:

The attributes of the Vehicle Object serve two purposes: they allow you to skip the step of capturing the VIN for your end-user and provide PAVE with information about the vehicle that will be used in the session results. These attributes are represented as key/value pairs in a JSON format, where each attribute is given a name and corresponding value

| Attribute     | Data Type | Description                                                                       | Primary/Optional               |
| ------------- | --------- | --------------------------------------------------------------------------------- | ------------------------------ |
| vin           | string    | The unique identifier of the vehicle, represented as 17 characters                | Primary if skipping VIN decode |
| year          | numeric   | The model year of the vehicle                                                     | Primary if skipping VIN decode |
| make          | string    | The manufacturer of the vehicle                                                   | Primary if skipping VIN decode |
| model         | string    | The model of the vehicle                                                          | Primary if skipping VIN decode |
| body\_type    | string    | The type of body of the vehicle, such as sedan, SUV, etc.                         | Primary if skipping VIN decode |
| trim          | string    | The level of trim or features of the vehicle                                      | Optional                       |
| transmission  | string    | The type of transmission in the vehicle                                           | Optional                       |
| ext\_col      | string    | The color of the exterior of the vehicle                                          | Optional                       |
| int\_col      | string    | The color of the interior of the vehicle                                          | Optional                       |
| odom\_reading | numeric   | The odometer reading of the vehicle                                               | Optional                       |
| odom\_unit    | string    | The unit of measurement for the odometer reading, such as "KILOMETRES" or "MILES" | Optional                       |

{% code title="vehicle.json" %}

```json
"vehicle": {
                "vin":"JN1CV6AR9BMXXXXXX",
                "year":"2011",
                "make":"Infiniti",
                "model":"G37",
                "body_type":"Sedan",
                "trim":"Luxury",
                "transmission":"Automatic",
                "ext_col":"Malbec Black",
                "int_col":"Wheat",
                "odom_reading":330477,
                "odom_unit":"KILOMETRES"
}
```

{% endcode %}

### The following are the attributes of the SMS Object:

The SMS Object contains the information required to send notifications via SMS in a session. This information is stored as named key/value pairs in a straightforward JSON format, providing a convenient optional way for the end-user to receive their capture link. The following are the attributes of the SMS Object:

| Attribute                     | Description                                                                                                                                          | Optional                                                                                                                  |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| to                            | The mobile number of the recipient to receive the PAVE Capture link as an SMS message.                                                               | Yes - if no "To" is provided, the "From" will get an SMS notification when the session only reaches the COMPLETE: STATUS. |
| to\_name                      | The contact name of the individual who will receive the SMS message.                                                                                 | Yes                                                                                                                       |
| from                          | The mobile number of an individual on your team who will receive the PAVE inspection results as a link by SMS when the User completes their capture. | Yes                                                                                                                       |
| by                            | The name used in the message sent to the User to indicate where the link was generated from.                                                         | Yes                                                                                                                       |
| send\_results\_to\_phototaker | Send the inspection result link to the person conducting the inspection                                                                              | Yes                                                                                                                       |

{% code title="sms.json" %}

```json
"sms": {
    "to": "647-455-XXXX",
    "to_name": "Jane Smith",
    "from": "647-422-XXXX",
    "by": "Steve's Test Dealer"
    "send_results_to_phototaker": "false"
}
```

{% endcode %}

### The following are the attributes of the Options Object:

The `options` object contains optional attributes that can be passed to customize the PAVE experience for each user. The object has the following properties:

| Property    | Description                                                   | Type   | Optional |
| ----------- | ------------------------------------------------------------- | ------ | -------- |
| client\_id  | A string that represents the client's identifier              | string | Yes      |
| contact     | An object that holds information about the user's contact     | object | Yes      |
| first\_name | A string that represents the first name of the user's contact | string | Yes      |
| last\_name  | A string that represents the last name of the user's contact  | string | Yes      |

### Example

```json
"options": {
    "client_id": "DLVNQC",
    "contact": {
      "first_name": "Luan",
      "last_name": "tran"
    }
}
```

### Need to Pass-Through Additional User or Session Information?&#x20;

The PAVE API allows you to pass additional information about specific users in the JSON results for a session. This is useful when you want to combine information from different sources in a single session, for example, from a lead form on a website to the results payload sent to your CRM.

Visit this section for more information:

{% content-ref url="/pages/-MhJMYmAnxmnb\_XiRrfr" %}
[Pass-Through Additional User Information](/integrations/developer-docs/pass-through-additional-user-information)
{% endcontent-ref %}

## Authentication

{% hint style="warning" %}
The PAVE Capture API requires authentication for all API calls, which is achieved through the use of an HMAC-SHA256 message hash as a header within the request.
{% endhint %}

Please read the [Authentication](/integrations/developer-docs/authentication) section to learn more:

{% content-ref url="/pages/-Mar28zApS\_Z-NIG2MhS" %}
[Authentication](/integrations/developer-docs/authentication)
{% endcontent-ref %}

## POST Create Session Response with Capture Link

This section describes the response format for the POST request to create a session for a vehicle inspection, which includes the capture link to provide to the end-user. The response is in JSON format and contains the following fields:

### Response Fields

| Property             | Description                                                                                                                                                                             | Type    | Optional |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------- |
| theme                | The theme of the vehicle inspection session. This field is optional and defaults to "LITE" if not provided.                                                                             | string  | Yes      |
| active               | A boolean value that indicates whether the session is active or not. This field is required and must be set to true.                                                                    | boolean | No       |
| status               | The status of the session. This field is optional and defaults to "IDLE" if not provided.                                                                                               | string  | Yes      |
| options              | An optional field that can be used to provide additional options for the session.                                                                                                       | null    | Yes      |
| language             | The language of the session. This field is optional and defaults to "en" (English) if not provided.                                                                                     | string  | Yes      |
| created\_at          | The date and time when the session was created in ISO 8601 format.                                                                                                                      | string  | No       |
| updated\_at          | The date and time when the session was last updated in ISO 8601 format.                                                                                                                 | string  | Yes      |
| capture\_url         | The capture link should be provided to the end user for starting the vehicle inspection. The URL is now branded to your account consisting of the account username and the session key. | string  | No       |
| session\_key         | A unique key that identifies the vehicle inspection session.                                                                                                                            | string  | No       |
| redirect\_url        | The URL the end-user will be redirected to after the vehicle inspection.                                                                                                                | string  | Yes      |
| inspect\_ended\_at   | An optional field that can specify the date and time when the vehicle inspection ended in ISO 8601 format.                                                                              | Null    | Yes      |
| inspect\_started\_at | An optional field that can specify the date and time when the vehicle inspection started in ISO 8601 format.                                                                            | Null    | Yes      |

### Example Response

Here is an example response for the POST request to create a vehicle inspection session with the capture link included:

#### **Sample** Response (201:Ok)

```
{
    "session_key": "XXX-ABCDE12345",
    "theme": "PRO",
    "active": true,
    "status": "IDLE",
    "redirect_url": "https://www.url-to-redirect-user-to.com",
    "inspect_started_at": null,
    "inspect_ended_at": null,
    "created_at": "2021-05-25T11:50:49.000000Z",
    "updated_at": "2021-05-25T11:50:49.000000Z",
    "language": "EN",
    "capture_url": "https://demoadmin.vehiclecapture.com/TCB-123...",
    "options": {
        "client_id": "SOUTH234889",
        "sms": {
            "to": "647-455-XXXX",
            "to_name": "Jane Smith",
            "from": "647-422-XXXX",
            "by": "Steve's Test Dealer",           
        }
    },
    "vehicle": {
        "vin": "JN1CV6AR9BMXXXXXX"
    }    
}
```

The "capture\_url" field contains the capture link that should be provided to the end user for starting the vehicle inspection. The "session\_key" field contains a unique key identifying the vehicle inspection session. The end-user will be redirected to the "redirect\_url" after completing the vehicle inspection.

#### **Sample** Response (400:Bad Request)

```
{
    "message": "Required fields are missing or invalid.",
    "errors": {
        "session.redirect_url": [
            "Invalid redirect url"
        ],
        "sms.to": [
            "Invalid phone number"
        ],
        "vehicle.vin": [
            "VIN is too short, it must be 17 characters"
        ]
    }
}
```

[^1]: replace

[^2]: Replace


# GET Session Data

During a session, retrieve details belonging to the API-Key by referencing the session\_key.

```
https://openapi.paveapi.com/v1/sessions/:session_key
```

Replace **`:session_key`** with the unique **`session_key`** returned from your previous request, and PAVE will return the corresponding session information. information.

| Path Parameters   |        |                                                                |
| ----------------- | ------ | -------------------------------------------------------------- |
| **`session_key`** | string | Unique session\_key generated when the new session was created |

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

#### **Sample** Response (**200: Ok)**

```
{
    "session_key": "XXX-ABCDE12345",
    "theme": "PRO",
    "active": true,
    "status": "COMPLETE",
    "redirect_url": "https://dev.paveinspect.com/valet/XXX-ABCDE12345/?l=en",
    "inspect_started_at": "2021-05-25T11:51:49.000000Z",
    "inspect_ended_at": "2021-05-25T11:56:05.000000Z",
    "created_at": "2021-05-25T11:50:49.000000Z",
    "updated_at": "2021-05-25T11:59:20.000000Z",
    "language": "EN",
    "options": {
        "client_id": "SOUTH234889",
        "sms": {
            "to": "647-455-XXXX",
            "to_name": "Jane Smith",
            "from": "647-422-XXXX",
            "by": "Steve's Test Dealer",
        }
    },
    "vehicle": {
            "vehicle_id": 19880,
            "vin": "5N1AT2MV0HCXXXXXX",
            "year": 2017,
            "make": "Nissan",
            "model": "Rogue",
            "body_type": "Wagon 4 Dr.",
            "trim": "AWD 4dr S *Ltd Avail*",
            "transmission": "AUTOMATIC",
            "drivetrain": "All Wheel Drive",
            "engine_type": "4 Cylinder Engine",
            "fuel_type": "Gasoline Fuel",
            "ext_col": "Glacier White",
            "int_col": "Black",
            "odom_reading": "100,945",
            "odom_unit": "KILOMETRES"
        }
}
```

#### **Sample Response** (**404: Not Found)**

Session not successfully retrieved

```
{
    "message": "Session :session_key cannot be found."
}
```

#### Vehicle Object

| Attribute          | Type    | Description                                                        |
| ------------------ | ------- | ------------------------------------------------------------------ |
| **`vehicle_id`**   | integer | PAVE system ID for vehicle                                         |
| **`vin`**          | string  | The VIN inputted or extracted for the session                      |
| **`year`**         | integer | The Year of the vehicle                                            |
| **`make`**         | string  | The Make of the vehicle                                            |
| **`model`**        | string  | The Model of the vehicle                                           |
| **`body_type`**    | string  | The vehicle's body type                                            |
| **`trim`**         | string  | The Trim detected of the vehicle                                   |
| **`transmission`** | string  | The Transmission detected for the vehicle                          |
| **`drivetrain`**   | string  | The Drivetrain of the vehicle                                      |
| **`engine_type`**  | string  | The Engine Type of the vehicle                                     |
| **`fuel_type`**    | string  | The Fuel Type of the vehicle                                       |
| **`ext_col`**      | string  | The Exterior Color detected of the vehicle                         |
| **`int_col`**      | string  | The Interior Color detected of the vehicle                         |
| **`odom_reading`** | integer | The Odometer Reading inputted or extracted for the session         |
| **`odom_unit`**    | string  | The Odometer unit of measure inputted or extracted for the session |

Vehicle data may not appear if the User has not yet captured their VIN and no VIN look-up information is found.


# GET Session Photos

During a session, retrieve photos (as they get captured) belonging to the API-Key by referencing the session\_key.

```
https://openapi.paveapi.com/v1/sessions/:session_key/photos
```

Replace **`:session_key`** with the unique **`session_key`** returned from your previous request, and PAVE will return the corresponding session photos that have been captured and if they were rejected or passed PAVE's image QA process when first captured. When an image is rejected, you will also see the reason in the **`approved_message`.**&#x20;

| Path Parameters   |        |                                                                |
| ----------------- | ------ | -------------------------------------------------------------- |
| **`session_key`** | string | Unique session\_key generated when the new session was created |

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

#### Sample Response (200:Ok)

Returns list of captured photos: including phototype (photo\_label), image URL, QA status and message, and timestamps for when each was captured or recaptured.&#x20;

```
[
    {
        "photo_code": 1,
        "photo_label": "VIN",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:16+00:00",
        "updated_at": "2021-05-27T07:37:05+00:00"
    },
    {
        "photo_code": 2,
        "photo_label": "Interior",
        "url": "https://your_capture_photo_url.jpg",
        "approved": false,
        "approved_message": "REJECTED: Wrong View",
        "created_at": "2021-05-27T07:36:19+00:00",
        "updated_at": "2021-05-27T07:36:34+00:00"
    },
    {
        "photo_code": 3,
        "photo_label": "Cluster",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:21+00:00",
        "updated_at": "2021-05-27T07:36:41+00:00"
    },
    {
        "photo_code": 4,
        "photo_label": "Left",
        "url": "https://your_capture_photo_url.jpg",
        "approved": false,
        "approved_message": "REJECTED: Wrong View",
        "created_at": "2021-05-27T07:36:24+00:00",
        "updated_at": "2021-05-27T07:37:36+00:00"
    },
    {
        "photo_code": 10,
        "photo_label": "Front_Left",
        "url": "https://your_capture_photo_url.jpg",
        "approved": false,
        "approved_message": "REJECTED: Please recapture the photo, ensuring that the vehicle is fully in frame for this angle.",
        "created_at": "2021-05-27T07:36:26+00:00",
        "updated_at": "2021-05-27T07:36:56+00:00"
    },
    {
        "photo_code": 5,
        "photo_label": "Front",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:29+00:00",
        "updated_at": "2021-05-27T07:37:47+00:00"
    },
    {
        "photo_code": 2,
        "photo_label": "Interior",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:34+00:00",
        "updated_at": "2021-05-27T07:38:19+00:00"
    },
    {
        "photo_code": 11,
        "photo_label": "Front_Right",
        "url": "https://your_capture_photo_url.jpg",
        "approved": false,
        "approved_message": "REJECTED: Wrong View",
        "created_at": "2021-05-27T07:36:36+00:00",
        "updated_at": "2021-05-27T07:38:30+00:00"
    },
    {
        "photo_code": 7,
        "photo_label": "Right",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:38+00:00",
        "updated_at": "2021-05-27T07:38:41+00:00"
    },
    {
        "photo_code": 12,
        "photo_label": "Rear_Right",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:42+00:00",
        "updated_at": "2021-05-27T07:38:53+00:00"
    },
    {
        "photo_code": 8,
        "photo_label": "Rear",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:44+00:00",
        "updated_at": "2021-05-27T07:39:03+00:00"
    },
    {
        "photo_code": 13,
        "photo_label": "Rear_Left",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:51+00:00",
        "updated_at": "2021-05-27T07:39:21+00:00"
    },
    {
        "photo_code": 9,
        "photo_label": "Windshield",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:53+00:00",
        "updated_at": "2021-05-27T07:39:31+00:00"
    },
    {
        "photo_code": 6,
        "photo_label": "Tires",
        "url": "https://your_capture_photo_url.jpg",
        "approved": true,
        "approved_message": "ACCEPTED",
        "created_at": "2021-05-27T07:36:56+00:00",
        "updated_at": "2021-05-27T07:39:40+00:00"
    }
]
```

**Sample Response (404: Not Found)**

```
{
    "message": "Session :session_key cannot be found."
}
```

| User Capture Step | Photo Code | Photo Type   | Nullable                                       |
| ----------------- | ---------- | ------------ | ---------------------------------------------- |
| **1**             | **`1`**    | VIN          | default image URL provided if manually entered |
| **2**             | **`2`**    | Interior     | no                                             |
| **3**             | **`3`**    | Cluster      | default image URL provided if manually entered |
| **4**             | **`4`**    | Left         | yes, if all other needed images are captured   |
| **5**             | **`10`**   | Front\_Left  | yes, if all other needed images are captured   |
| **6**             | **`5`**    | Front        | yes, if all other needed images are captured   |
| **7**             | **`11`**   | Front\_Right | yes, if all other needed images are captured   |
| **8**             | **`7`**    | Right        | yes, if all other needed images are captured   |
| **9**             | **`12`**   | Rear\_Right  | yes, if all other needed images are captured   |
| **10**            | **`8`**    | Rear         | yes, if all other needed images are captured   |
| **11**            | **`13`**   | Rear\_Left   | yes, if all other needed images are captured   |
| **12**            | **`9`**    | Windshield   | no                                             |
| **13**            | **`6`**    | Tires        | no                                             |


# GET Session Notes

During a session, retrieve notes belonging to the API-Key by referencing the session\_key.

```
https://openapi.paveapi.com/v1/sessions/:session_key/notes
```

Replace **`:session_key`** with the unique **`session_key`** returned from your previous request, and PAVE will return the corresponding session notes that have been inputted from the dashboard or results page (park page).

| Path Parameters   |        |                                                                |
| ----------------- | ------ | -------------------------------------------------------------- |
| **`session_key`** | string | Unique session\_key generated when the new session was created |

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

#### Sample Response (200:Ok)

Returns list of inputted notes: including title, description, type (for now it's only session), privacy (public, private for only logged users, only-me), user source (logged user or guest), and timestamps for when each was inputted.&#x20;

```
[
    {
        "user": "guest",
        "title": "Here come the first note",
        "description": "Learn how to use session notes.",
        "type": "session",
        "privacy": "private",
        "timestamp": "2021-05-27T07:36:16+00:00",
    }
]
```

**Sample Response (404: Not Found)**

```
{
    "message": "Session :session_key cannot be found."
}
```


# GET Session Results

Retrieve the completed vehicle details, inspection and photo results belonging to the API-Key by referencing the session\_key.

```
https://openapi.paveapi.com/v1/sessions/:session_key/results
```

Replace **`:session_key`** with the unique **`session_key`** returned from your previous request, and PAVE will return the corresponding session result&#x73;**.**&#x20;

| Path Parameters   | Type   | Description                                                    |
| ----------------- | ------ | -------------------------------------------------------------- |
| **`session_key`** | string | Unique session\_key generated when the new session was created |

| Headers             | Type   | Description                                        |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

**Sample Request**

```
curl --location --request GET 'https://openapi.paveapi.com/v1/sessions/UNG-5IXXXXXXXX/results' \
```

### PAVE Inspection Results Data

This link below provides a PDF document that includes a detailed description of the various objects used in an inspection session JSON that is SESSION:COMPLETE.&#x20;

{% file src="/files/flGnc9RRCxVy1c7NmZHw" %}
Click to open PDF&#x20;
{% endfile %}

These objects include the Session Object, which contains information about the inspection session, such as the session key, theme, status, and contact details. The Vehicle Object has information on the inspected vehicle, including the VIN, make, model, and odometer reading. The Photos Object contains information about the photos taken during the inspection, including the URL where they are stored and whether they were approved in the photo QA process. The Location Object provides details about the location of the inspection. Lastly, the Inspection Object contains information about the damages detected during the inspection, including the total number of damages and their maximum grade per item.

\ <br>

**Sample Response (200: Ok)**

The session is COMPLETE and the final results are available.

```

{
    "event": "SESSION:COMPLETE",
    "session": {
        "session_key": "SMG-JLI***KEVE",
        "theme": "LITE",
        "active": true,
        "status": "COMPLETE",
        "redirect_url": "https:\/\/www.autotur***.com\/sell\/thank-you\/5FNRL6**LB051014?dealer=1010",
        "inspect_started_at": "2023-12-07T17:33:36+00:00",
        "inspect_ended_at": "2023-12-07T17:43:05+00:00",
        "capture_duration": 230,
        "inspect_duration": 569,
        "created_at": "2023-12-07T17:33:23+00:00",
        "updated_at": "2023-12-07T17:44:07+00:00",
        "language": "en",
        "options": {
            "client_id": "1**-2**66",
            "sms": {
                "to": "9**-2**-60**",
                "to_name": null,
                "from": "7**-7**-30**",
                "by": "Tu*** Acqu**"
            }
        },
        "user_account": {
            "username": "sm***",
            "first_name": "John",
            "last_name": "Smith",
            "email": "john.smith@pave.com",
            "phone": null
        },
        "source": {
            "type": "api",
            "properties": {
                "api_name": "Tu** Staging"
            }
        },
        "vehicle": {
            "id": 446964,
            "session_key": "SMG-JLID***EVE",
            "vin": "5FNRL6H5*****1014",
            "vrm": null,
            "year": 2020,
            "make": "Honda",
            "model": "ODYSSEY",
            "body_type": "Sports Van",
            "trim": "EX Auto",
            "transmission": "AUTOMATIC",
            "drivetrain": "Front Wheel Drive",
            "engine_type": "3.5 L Regular Unleaded V-6",
            "fuel_type": null,
            "ext_col": "Crystal Black Pearl",
            "int_col": "Mocha",
            "odom_reading": "28050",
            "odom_unit": "MILES"
        }
    },
    "photos": [
        {
            "photo_code": 2,
            "photo_label": "Interior",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JL**DEKEVE\/capture\/2-9acb1658-cb6e-476a-974d-a6179ff2b65b-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:34:00+00:00",
            "updated_at": "2023-12-07T17:34:07+00:00"
        },
        {
            "photo_code": 3,
            "photo_label": "Cluster",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/capture\/3-9acb1661-a4c1-4aff-bffe-0f9f1db1d226-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:34:06+00:00",
            "updated_at": "2023-12-07T17:34:14+00:00"
        },
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/4-9acb169b-97f3-4ccc-9ad3-4ff7b292e118-1920x1080.jpg",
            "approved": false,
            "approved_message": "REJECTED: Please recapture the photo, ensuring that the vehicle is fully in frame for this angle.",
            "rejection_code": "vehicle_is_not_in_frame",
            "created_at": "2023-12-07T17:34:44+00:00",
            "updated_at": "2023-12-07T17:35:10+00:00"
        },
        {
            "photo_code": 10,
            "photo_label": "Front_Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/10-9acb16bc-a31e-43c6-9306-e6a23098f3bf-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:05+00:00",
            "updated_at": "2023-12-07T17:35:16+00:00"
        },
        {
            "photo_code": 5,
            "photo_label": "Front",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/5-9acb16d0-e94e-4673-99f5-16c109f79aa8-1920x1080.jpg",
            "approved": false,
            "approved_message": "REJECTED: Wrong View",
            "rejection_code": "wrong_view",
            "created_at": "2023-12-07T17:35:19+00:00",
            "updated_at": "2023-12-07T17:35:31+00:00"
        },
        {
            "photo_code": 11,
            "photo_label": "Front_Right",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/11-9acb16d9-d688-4ce8-8155-98b3bfaadf8b-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:25+00:00",
            "updated_at": "2023-12-07T17:35:34+00:00"
        },
        {
            "photo_code": 7,
            "photo_label": "Right",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/7-9acb16df-56e7-4f64-a74f-0ca9b68c1614-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:29+00:00",
            "updated_at": "2023-12-07T17:35:38+00:00"
        },
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDD**EVE\/capture\/4-9acb16f0-412c-479b-8328-4ecc2511b18c-1920x1080.jpg",
            "approved": false,
            "approved_message": "REJECTED: Please recapture the photo, ensuring that the vehicle is fully in frame for this angle.",
            "rejection_code": "vehicle_is_not_in_frame",
            "created_at": "2023-12-07T17:35:39+00:00",
            "updated_at": "2023-12-07T17:35:49+00:00"
        },
        {
            "photo_code": 12,
            "photo_label": "Rear_Right",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDD**EVE\/capture\/12-9acb1706-2ee3-4d14-80eb-90d308288d38-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:54+00:00",
            "updated_at": "2023-12-07T17:36:04+00:00"
        },
        {
            "photo_code": 5,
            "photo_label": "Front",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/5-9acb172b-f37e-4a87-8b60-621aa26a23db-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:36:20+00:00",
            "updated_at": "2023-12-07T17:36:34+00:00"
        },
        {
            "photo_code": 8,
            "photo_label": "Rear",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/8-9acb173d-f866-464f-8737-769ec9640e41-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:36:30+00:00",
            "updated_at": "2023-12-07T17:36:41+00:00"
        },
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:36:46+00:00",
            "updated_at": "2023-12-07T17:36:56+00:00"
        },
        {
            "photo_code": 13,
            "photo_label": "Rear_Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/13-9acb176a-a8ce-4eb8-a2f8-e605b880e13f-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:37:00+00:00",
            "updated_at": "2023-12-07T17:37:11+00:00"
        },
        {
            "photo_code": 9,
            "photo_label": "Windshield",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/9-9acb179a-acf6-4981-8b21-6883e5a56cd6-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:37:31+00:00",
            "updated_at": "2023-12-07T17:37:47+00:00"
        },
        {
            "photo_code": 6,
            "photo_label": "Tires",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/6-9acb17a7-e30e-48f1-9f73-a8cbfcdb8d57-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:37:41+00:00",
            "updated_at": "2023-12-07T17:37:50+00:00"
        }
    ],
    "vehicle": {
        "id": 446964,
        "session_key": "SMG-JLID**EVE",
        "vin": "5FNRL6H51LB****14",
        "vrm": null,
        "year": 2020,
        "make": "Honda",
        "model": "ODYSSEY",
        "body_type": "Sports Van",
        "trim": "EX Auto",
        "transmission": "AUTOMATIC",
        "drivetrain": "Front Wheel Drive",
        "engine_type": "3.5 L Regular Unleaded V-6",
        "fuel_type": null,
        "ext_col": "Crystal Black Pearl",
        "int_col": "Mocha",
        "odom_reading": "28050",
        "odom_unit": "MILES"
    },
    "location": {
        "address": "****, KS, USA",
        "latitude": "37.7*1000000",
        "longitude": "-97.8*2000000",
        "street_num": "-",
        "street": "-",
        "city": "Cheney",
        "state": "Kansas",
        "state_code": "KS",
        "country_code": "US",
        "post_code": "11225",
        "country": "United States",
        "ip": null
    },
    "inspection": {
        "damages_overview": {
            "totalDamages": 13,
            "maxGradePerItem": 3,
            "maxTotalGrade": 10
        },
        "detected_damages": [
            {
                "damage_id": 1,
                "damage_group": "BODY",
                "component": "BUMPER_FRONT_UNIQUE",
                "damage_name": "SCRAPED_MAJOR",
                "component_label": "Front Bumper Cover",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Major Scrape",
                "status": "new",
                "description": "Scraped",
                "tolerance": "9 inches to 10 inches",
                "repair_method": "Repair & Refinish",
                "repair_type": "Minor Body Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 5.5,
                "labor_total": 412.5,
                "parts_materials": 250,
                "total": 662.5,
                "grade_score": 2,
                "frame_grade_score": 0,
                "photo": {
                    "code": "07",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/7-9acb16df-56e7-4f64-a74f-0ca9b68c1614-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.8984,
                    "y": 0.6573
                },
                "uuid": "g08lg3ulpvhgr3a",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JL**DEKEVE\/cropped\/07\/07-g08lg3ulpvhgr3a.jpg",
                "cropped_code": "1",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Heavy Scratch",
                "damage_type_id": 20,
                "aasc_damage_code": 81,
                "severity": "Major",
                "severity_id": 3,
                "aasc_severity_code": 15,
                "component_id": 14,
                "aasc_item_code": 6300
            },
            {
                "damage_id": 2,
                "damage_group": "BODY",
                "component": "BUMPER_FRONT_UNIQUE",
                "damage_name": "MULTIPLE_SCRATCHES_MAJOR_THROUGH_PAINT",
                "component_label": "Front Bumper Cover",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Multiple Major Scratches - Through Paint",
                "status": "repaired",
                "description": "Multiple Scratches Heavy",
                "tolerance": "10 or more heavy scratches",
                "repair_method": "Repair & Refinish",
                "repair_type": "Minor Body Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 5.5,
                "labor_total": 412.5,
                "parts_materials": 250,
                "total": 662.5,
                "grade_score": 2,
                "frame_grade_score": 0,
                "photo": {
                    "code": "05",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-**IDDEKEVE\/annotated\/5-9acb172b-f37e-4a87-8b60-621aa26a23db-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.231,
                    "y": 0.7051
                },
                "uuid": "4vhkulpvhh85l",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-**IDDEKEVE\/cropped\/05\/05-4vhkulpvhh85l.jpg",
                "cropped_code": "1",
                "estimate_included": true,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Heavy Mult Scratches",
                "damage_type_id": 19,
                "aasc_damage_code": 254,
                "severity": "Major Through Paint",
                "severity_id": 9,
                "aasc_severity_code": 66,
                "component_id": 14,
                "aasc_item_code": 6300
            },
            {
                "damage_id": 3,
                "damage_group": "BODY",
                "component": "BUMPER_FRONT_UNIQUE",
                "damage_name": "SCRAPED_MAJOR",
                "component_label": "Front Bumper Cover",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Major Scrape",
                "status": "new",
                "description": "Scraped",
                "tolerance": "9 inches to 10 inches",
                "repair_method": "Repair & Refinish",
                "repair_type": "Minor Body Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 5.5,
                "labor_total": 412.5,
                "parts_materials": 250,
                "total": 662.5,
                "grade_score": 2,
                "frame_grade_score": 0,
                "photo": {
                    "code": "05",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDD**EVE\/annotated\/5-9acb172b-f37e-4a87-8b60-621aa26a23db-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.2631,
                    "y": 0.8274
                },
                "uuid": "4vhkulpvhh85m",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/cropped\/05\/05-4vhkulpvhh85m.jpg",
                "cropped_code": "2",
                "estimate_included": true,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Heavy Scratch",
                "damage_type_id": 20,
                "aasc_damage_code": 81,
                "severity": "Major",
                "severity_id": 3,
                "aasc_severity_code": 15,
                "component_id": 14,
                "aasc_item_code": 6300
            },
            {
                "damage_id": 4,
                "damage_group": "PART",
                "component": "HOUSING_LIGHT_FOG_RIGHT",
                "damage_name": "BROKEN_MEDIUM",
                "component_label": "Right Fog Light Housing",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Medium Crack",
                "status": "old",
                "description": "Broken",
                "tolerance": "5 to 6 inches",
                "repair_method": "Replace",
                "repair_type": "Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "",
                "labor_hrs": 0,
                "labor_total": 0,
                "parts_materials": 0,
                "total": 0,
                "grade_score": 2,
                "frame_grade_score": 0,
                "photo": {
                    "code": "05",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-J**DDEKEVE\/annotated\/5-9acb172b-f37e-4a87-8b60-621aa26a23db-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.2803,
                    "y": 0.8167
                },
                "uuid": "4vhkulpvhh85n",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/cropped\/05\/05-4vhkulpvhh85n.jpg",
                "cropped_code": "3",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Textured Surface",
                "damage_type": "Broken",
                "damage_type_id": 2,
                "aasc_damage_code": 16,
                "severity": "Medium",
                "severity_id": 2,
                "aasc_severity_code": 10,
                "component_id": 68,
                "aasc_item_code": 8736
            },
            {
                "damage_id": 5,
                "damage_group": "BODY",
                "component": "BUMPER_REAR_UNIQUE",
                "damage_name": "SCRAPED_MINOR",
                "component_label": "Rear Bumper Cover",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Minor Scrape",
                "status": "old",
                "description": "Scraped",
                "tolerance": "1\/8 to 1\/2 inch - NAAA Acceptable",
                "repair_method": "Refinish",
                "repair_type": "SMART Repair",
                "unit_measure": "Per Item",
                "estimate_category": "Exterior",
                "labor_hrs": 2.5,
                "labor_total": 187.5,
                "parts_materials": 200,
                "total": 387.5,
                "grade_score": 1,
                "frame_grade_score": 0,
                "photo": {
                    "code": "08",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/8-9acb173d-f866-464f-8737-769ec9640e41-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.7078,
                    "y": 0.947
                },
                "uuid": "4vhkulpvhg318",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JL**DEKEVE\/cropped\/08\/08-4vhkulpvhg318.jpg",
                "cropped_code": "1",
                "estimate_included": true,
                "estimate_tbd": false,
                "material": "Textured Surface",
                "damage_type": "Heavy Scratch",
                "damage_type_id": 20,
                "aasc_damage_code": 81,
                "severity": "Minor",
                "severity_id": 1,
                "aasc_severity_code": 73,
                "component_id": 15,
                "aasc_item_code": 1420
            },
            {
                "damage_id": 6,
                "damage_group": "BODY",
                "component": "BUMPER_REAR_UNIQUE",
                "damage_name": "MULTIPLE_SCRATCHES_MINOR_THROUGH_PAINT",
                "component_label": "Rear Bumper Cover",
                "user_response": null,
                "admin_response": "add",
                "source": "inspect",
                "label": "Has Multiple Minor Scratches - Through Paint",
                "status": "repaired",
                "description": "Multiple Scratches Heavy",
                "tolerance": "2",
                "repair_method": "Refinish",
                "repair_type": "SMART Repair",
                "unit_measure": "Per Item",
                "estimate_category": "Exterior",
                "labor_hrs": 4,
                "labor_total": 300,
                "parts_materials": 550,
                "total": 850,
                "grade_score": 1,
                "frame_grade_score": 0,
                "photo": {
                    "code": "08",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/8-9acb173d-f866-464f-8737-769ec9640e41-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.7364,
                    "y": 0.8751
                },
                "uuid": "g08lg3ulpvhjdl8",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/cropped\/08\/08-g08lg3ulpvhjdl8.jpg",
                "cropped_code": "2",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Heavy Mult Scratches",
                "damage_type_id": 19,
                "aasc_damage_code": 254,
                "severity": "Minor Through Paint",
                "severity_id": 7,
                "aasc_severity_code": 52,
                "component_id": 15,
                "aasc_item_code": 1420
            },
            {
                "damage_id": 7,
                "damage_group": "BODY",
                "component": "HATCH_REAR_UNIQUE",
                "damage_name": "DENT_MAJOR_SEAM_LINE",
                "component_label": "Rear Hatch",
                "user_response": null,
                "admin_response": "add",
                "source": "inspect",
                "label": "Has Major Dent on Seam Line - Not Through Paint",
                "status": "new",
                "description": "Has Major Dent on Seam Line - Not Through Paint",
                "tolerance": "Major dent 9 - 10 inches but on seam line",
                "repair_method": "Replace",
                "repair_type": "SMART Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 9,
                "labor_total": 675,
                "parts_materials": 850,
                "total": 1525,
                "grade_score": 3,
                "frame_grade_score": 0,
                "photo": {
                    "code": "08",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/annotated\/8-9acb173d-f866-464f-8737-769ec9640e41-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.6843,
                    "y": 0.7756
                },
                "uuid": "g08lg3ulpvhjdl9",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/cropped\/08\/08-g08lg3ulpvhjdl9.jpg",
                "cropped_code": "3",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Mult Dents\/Paint Damage",
                "damage_type_id": 30,
                "aasc_damage_code": 257,
                "severity": "Major",
                "severity_id": 3,
                "aasc_severity_code": 66,
                "component_id": 56,
                "aasc_item_code": 423
            },
            {
                "damage_id": 8,
                "damage_group": "BODY",
                "component": "BUMPER_FRONT_UNIQUE",
                "damage_name": "SCRATCH_MINOR_NOT_THROUGH_PAINT",
                "component_label": "Front Bumper Cover",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Minor Scratch - Not Through Paint",
                "status": "old",
                "description": "Light Scratch",
                "tolerance": "1\/8 to 1\/2 inch - NAAA Acceptable",
                "repair_method": "Refinish",
                "repair_type": "SMART Repair",
                "unit_measure": "Per Item",
                "estimate_category": "Exterior",
                "labor_hrs": 4.5,
                "labor_total": 337.5,
                "parts_materials": 200,
                "total": 537.5,
                "grade_score": 1,
                "frame_grade_score": 0,
                "photo": {
                    "code": "04",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/annotated\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.1532,
                    "y": 0.5151
                },
                "uuid": "4vhkulpvhgf3t",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/cropped\/04\/04-4vhkulpvhgf3t.jpg",
                "cropped_code": "1",
                "estimate_included": true,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Scratch Light",
                "damage_type_id": 40,
                "aasc_damage_code": 73,
                "severity": "Minor Not Through Paint",
                "severity_id": 4,
                "aasc_severity_code": 73,
                "component_id": 14,
                "aasc_item_code": 6300
            },
            {
                "damage_id": 9,
                "damage_group": "BODY",
                "component": "DOOR_REAR_LEFT",
                "damage_name": "SCRATCH_MINOR_NOT_THROUGH_PAINT",
                "component_label": "Rear Left Door",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Has Minor Scratch - Not Through Paint",
                "status": "new",
                "description": "Light Scratch",
                "tolerance": "1\/8 to 1\/2 inch - NAAA Acceptable",
                "repair_method": "Refinish",
                "repair_type": "SMART Repair",
                "unit_measure": "Per Item",
                "estimate_category": "Exterior",
                "labor_hrs": 4,
                "labor_total": 300,
                "parts_materials": 200,
                "total": 500,
                "grade_score": 1,
                "frame_grade_score": 0,
                "photo": {
                    "code": "04",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0.6406,
                    "y": 0.4367
                },
                "uuid": "4vhkulpvhggxt",
                "cropped_url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/cropped\/04\/04-4vhkulpvhggxt.jpg",
                "cropped_code": "2",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Scratch Light",
                "damage_type_id": 40,
                "aasc_damage_code": 73,
                "severity": "Minor Not Through Paint",
                "severity_id": 4,
                "aasc_severity_code": 73,
                "component_id": 29,
                "aasc_item_code": 220
            },
            {
                "damage_id": 10,
                "damage_group": "TIRE",
                "component": "TIRE_FRONT_LEFT",
                "damage_name": "WORN_MAJOR",
                "component_label": "Front Left Tire",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Is Majorly Worn",
                "status": "old",
                "description": "Is Majorly Worn",
                "tolerance": "Shows Major Wear",
                "repair_method": "Replace",
                "repair_type": "Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0.5,
                "labor_total": 37.5,
                "parts_materials": 175,
                "total": 212.5,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "04",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0,
                    "y": 0
                },
                "uuid": "g08lg3ulpvhfxs0",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "Worn",
                "damage_type_id": 54,
                "aasc_damage_code": 10,
                "severity": "Major Tire Wear",
                "severity_id": 12,
                "aasc_severity_code": 71,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_id": 11,
                "damage_group": "TIRE",
                "component": "TIRE_REAR_LEFT",
                "damage_name": "WORN_MAJOR",
                "component_label": "Rear Left Tire",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Is Majorly Worn",
                "status": "new",
                "description": "Is Majorly Worn",
                "tolerance": "Shows Major Wear",
                "repair_method": "Replace",
                "repair_type": "Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0.5,
                "labor_total": 37.5,
                "parts_materials": 175,
                "total": 212.5,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "04",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0,
                    "y": 0
                },
                "uuid": "g08lg3ulpvhfxs1",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "Worn",
                "damage_type_id": 54,
                "aasc_damage_code": 10,
                "severity": "Major Tire Wear",
                "severity_id": 12,
                "aasc_severity_code": 71,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_id": 12,
                "damage_group": "TIRE",
                "component": "TIRE_REAR_RIGHT",
                "damage_name": "WORN_MAJOR",
                "component_label": "Rear Right Tire",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Is Majorly Worn",
                "status": "new",
                "description": "Is Majorly Worn",
                "tolerance": "Shows Major Wear",
                "repair_method": "Replace",
                "repair_type": "Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0.5,
                "labor_total": 37.5,
                "parts_materials": 175,
                "total": 212.5,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "07",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/7-9acb16df-56e7-4f64-a74f-0ca9b68c1614-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0,
                    "y": 0
                },
                "uuid": "g08lg3ulpvhfxs2",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "Worn",
                "damage_type_id": 54,
                "aasc_damage_code": 10,
                "severity": "Major Tire Wear",
                "severity_id": 12,
                "aasc_severity_code": 71,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_id": 13,
                "damage_group": "TIRE",
                "component": "TIRE_FRONT_RIGHT",
                "damage_name": "WORN_MAJOR",
                "component_label": "Front Right Tire",
                "user_response": null,
                "admin_response": null,
                "source": "inspect",
                "label": "Is Majorly Worn",
                "status": "repaired", 
                "description": "Is Majorly Worn",
                "tolerance": "Shows Major Wear",
                "repair_method": "Replace",
                "repair_type": "Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0.5,
                "labor_total": 37.5,
                "parts_materials": 175,
                "total": 212.5,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "07",
                    "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/7-9acb16df-56e7-4f64-a74f-0ca9b68c1614-1920x1080.jpg"
                },
                "coodrs": {
                    "x": 0,
                    "y": 0
                },
                "uuid": "g08lg3ulpvhfxs3",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "Worn",
                "damage_type_id": 54,
                "aasc_damage_code": 10,
                "severity": "Major Tire Wear",
                "severity_id": 12,
                "aasc_severity_code": 71,
                "component_id": 0,
                "aasc_item_code": 0
            }
        ],
        "estimates": {
            "total_exterior": 3537.5,
            "total_wheels_and_tires": 850,
            "total_excess_wear": 4387.5,
            "currency": "USD"
        },
        "detected_status": {
            "interior_status": "CLEAN",
            "wheels": {
                "wheel_rear_left": "Alloy Wheel",
                "wheel_front_left": "Alloy Wheel",
                "wheel_rear_right": "Alloy Wheel",
                "wheel_front_right": "Alloy Wheel"
            }
        },
        "grading": {
            "standard_A": 3,
            "standard_B": "C-3",
            "standard_C": "Fair Condition",
            "repair_estimate": {
                "total_exterior": 3537.5,
                "total_wheels_and_tires": 850,
                "total_excess_wear": 4387.5,
                "currency": "USD"
            }
        },
        "annotated_images": [
            {
                "photo_code": "04",
                "photo_label": "Left",
                "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg"
            },
            {
                "photo_code": "05",
                "photo_label": "Front",
                "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/5-9acb172b-f37e-4a87-8b60-621aa26a23db-1920x1080.jpg"
            },
            {
                "photo_code": "07",
                "photo_label": "Right",
                "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/7-9acb16df-56e7-4f64-a74f-0ca9b68c1614-1920x1080.jpg"
            },
            {
                "photo_code": "08",
                "photo_label": "Rear",
                "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/annotated\/8-9acb173d-f866-464f-8737-769ec9640e41-1920x1080.jpg"
            }
        ],
        "case_details": {
            "case_start_time": false,
            "case_end_time": false
        }
    },
    "condition_report": "https:\/\/reports.paveapi.com\/api\/report\/SMG-JLI**EKEVE",
    "landing_page": "https:\/\/dashboard.paveapi.com\/park\/SMG-JLI**EKEVE\/?l=en",
    "disclosures": null,
    "announcements": null,
    "seller_tires": null,
    "forms": null
}
```

**Sample Response (302: Found)**

The session is not yet COMPLETE and might be in IDLE or PROCESSING status, and the final results are not available. See the Webhooks section to learn more about PAVE session statuses.

```
{
    "message": "Session is not yet completed."
}
```

**Sample Response (404: Not Found)**

The session does not exist, please check the **`:session_key`**.

```
{
    "message": "Session :session_key cannot be found."
}
```

#### Session Objects

| Attribute                | Type     | Description                                          |
| ------------------------ | -------- | ---------------------------------------------------- |
| **`session_key`**        | string   | Session Key generated for User                       |
| **`theme`**              | string   | Theme provided to use for User Interface             |
| **`active`**             | string   | Results status                                       |
| **`status`**             | string   | Session status                                       |
| **`redirect_url`**       | string   | URL provided to send User when the session completes |
| **`inspect_started_at`** | datetime | UTC Datetime for when User started the session       |
| **`inspect_ended_at`**   | datetime | UTC Datetime for when User finished the session      |
| **`created_at`**         | datetime | UTC Datetime for when session\_key was created       |
| **`updated_at`**         | datetime | UTC Datetime for when session\_key was updated       |
| **`language`**           | string   | Language provided to use for User Interface          |

#### `options`

**`sms`**

| Attribute     | Type   | Description                                                            |
| ------------- | ------ | ---------------------------------------------------------------------- |
| **`to`**      | string | Destination mobile phone number provided to send to User               |
| **`to_name`** | string | The name that was inputted as the Contact Name on the form or request. |
| **`from`**    | string | Destination mobile phone number provided to send final results         |
| **`by`**      | string | Name provided to include in SMS Message sent to User                   |

```
    "session": {
        "session_key": "XXX-ABCDE12345",
        "theme": "PRO",
        "active": true,
        "status": "COMPLETE",
        "redirect_url": "https://dev.paveinspect.com/valet/XXX-ABCDE12345/?l=en",
        "inspect_started_at": "2021-05-25T11:51:49.000000Z",
        "inspect_ended_at": "2021-05-25T11:56:05.000000Z",
        "created_at": "2021-05-25T11:50:49.000000Z",
        "updated_at": "2021-05-25T11:59:20.000000Z",
        "language": "EN",
        "options": {
            "sms": {
                "to": "647-455-XXXX",
                "to_name": "Jane Smith",
                "from": "647-422-XXXX",
                "by": "Steve's Test Dealer",
            }
```

#### Photos

| Attribute              | Type     | Descriptionphotointeger                                 |
| ---------------------- | -------- | ------------------------------------------------------- |
| **`photo_code`**       | integer  | PAVE's system code for each photo                       |
| **`photo_label`**      | string   | Describes the content of the photo                      |
| **`url`**              | string   | URL to retrieve photo                                   |
| **`approved`**         | string   | Was the photo rejected or approved                      |
| **`approved_message`** | string   | ACCEPTED or REJECTED with the reason why                |
| **`rejection_code`**   | string   | Rejection Code for that specific approved\_message      |
| **`created_at`**       | datetime | UTC Datetime for when the photo was captured            |
| **`updated_at`**       | datetime | UTC Datetime for when the photo status was last updated |

```
  },
    "photos": [
        {
            "photo_code": 2,
            "photo_label": "Interior",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JL**DEKEVE\/capture\/2-9acb1658-cb6e-476a-974d-a6179ff2b65b-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:34:00+00:00",
            "updated_at": "2023-12-07T17:34:07+00:00"
        },
        {
            "photo_code": 3,
            "photo_label": "Cluster",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/capture\/3-9acb1661-a4c1-4aff-bffe-0f9f1db1d226-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:34:06+00:00",
            "updated_at": "2023-12-07T17:34:14+00:00"
        },
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/4-9acb169b-97f3-4ccc-9ad3-4ff7b292e118-1920x1080.jpg",
            "approved": false,
            "approved_message": "REJECTED: Please recapture the photo, ensuring that the vehicle is fully in frame for this angle.",
            "rejection_code": "vehicle_is_not_in_frame",
            "created_at": "2023-12-07T17:34:44+00:00",
            "updated_at": "2023-12-07T17:35:10+00:00"
        },
        {
            "photo_code": 10,
            "photo_label": "Front_Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/10-9acb16bc-a31e-43c6-9306-e6a23098f3bf-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:05+00:00",
            "updated_at": "2023-12-07T17:35:16+00:00"
        },
        {
            "photo_code": 5,
            "photo_label": "Front",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/5-9acb16d0-e94e-4673-99f5-16c109f79aa8-1920x1080.jpg",
            "approved": false,
            "approved_message": "REJECTED: Wrong View",
            "rejection_code": "wrong_view",
            "created_at": "2023-12-07T17:35:19+00:00",
            "updated_at": "2023-12-07T17:35:31+00:00"
        },
        {
            "photo_code": 11,
            "photo_label": "Front_Right",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/11-9acb16d9-d688-4ce8-8155-98b3bfaadf8b-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:25+00:00",
            "updated_at": "2023-12-07T17:35:34+00:00"
        },
        {
            "photo_code": 7,
            "photo_label": "Right",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDDEKEVE\/capture\/7-9acb16df-56e7-4f64-a74f-0ca9b68c1614-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:29+00:00",
            "updated_at": "2023-12-07T17:35:38+00:00"
        },
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDD**EVE\/capture\/4-9acb16f0-412c-479b-8328-4ecc2511b18c-1920x1080.jpg",
            "approved": false,
            "approved_message": "REJECTED: Please recapture the photo, ensuring that the vehicle is fully in frame for this angle.",
            "rejection_code": "vehicle_is_not_in_frame",
            "created_at": "2023-12-07T17:35:39+00:00",
            "updated_at": "2023-12-07T17:35:49+00:00"
        },
        {
            "photo_code": 12,
            "photo_label": "Rear_Right",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLIDD**EVE\/capture\/12-9acb1706-2ee3-4d14-80eb-90d308288d38-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:35:54+00:00",
            "updated_at": "2023-12-07T17:36:04+00:00"
        },
        {
            "photo_code": 5,
            "photo_label": "Front",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/5-9acb172b-f37e-4a87-8b60-621aa26a23db-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:36:20+00:00",
            "updated_at": "2023-12-07T17:36:34+00:00"
        },
        {
            "photo_code": 8,
            "photo_label": "Rear",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/8-9acb173d-f866-464f-8737-769ec9640e41-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:36:30+00:00",
            "updated_at": "2023-12-07T17:36:41+00:00"
        },
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/4-9acb1756-4114-4bf4-8c81-f8dc3dcaaa50-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:36:46+00:00",
            "updated_at": "2023-12-07T17:36:56+00:00"
        },
        {
            "photo_code": 13,
            "photo_label": "Rear_Left",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLID**KEVE\/capture\/13-9acb176a-a8ce-4eb8-a2f8-e605b880e13f-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:37:00+00:00",
            "updated_at": "2023-12-07T17:37:11+00:00"
        },
        {
            "photo_code": 9,
            "photo_label": "Windshield",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/capture\/9-9acb179a-acf6-4981-8b21-6883e5a56cd6-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:37:31+00:00",
            "updated_at": "2023-12-07T17:37:47+00:00"
        },
        {
            "photo_code": 6,
            "photo_label": "Tires",
            "url": "https:\/\/openapi-cdn.paveapi.com\/sessions\/sessions\/2023-12\/SMG-JLI**EKEVE\/capture\/6-9acb17a7-e30e-48f1-9f73-a8cbfcdb8d57-1920x1080.jpg",
            "approved": true,
            "approved_message": "Accepted",
            "rejection_code": null,
            "created_at": "2023-12-07T17:37:41+00:00",
            "updated_at": "2023-12-07T17:37:50+00:00"
        }
```

#### List of Rejection Codes

| approved\_message (string)                                                                        | rejection\_code (string)                          |
| ------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| REJECTED: Door is open - please close and recapture                                               | "rejection\_code": "opened\_door"​                |
| REJECTED: Image Not Clear                                                                         | "rejection\_code": "image\_not\_clear"​           |
| REJECTED: Make sure your plate number is visible in the photo provided                            | "rejection\_code": "vrm\_not\_visible"​           |
| REJECTED: Please recapture the photo, ensuring that the vehicle is fully in frame for this angle. | "rejection\_code": "vehicle\_is\_not\_in\_frame​" |
| REJECTED: The Vehicle does not match our previous inspection records for this VIN.                | "rejection\_code": "mismatched\_record"​          |
| REJECTED: Too Dark                                                                                | "rejection\_code": "too\_dark"​                   |
| REJECTED: Too Sunny                                                                               | "rejection\_code": too\_sunny"​                   |
| REJECTED: View is obstructed, please recapture photo.                                             | "rejection\_code": "view\_is\_obstructed"​        |
| REJECTED: We are having trouble reading your Odometer, please recapture Odometer photo.           | "rejection\_code": "no\_odometer​"                |
| REJECTED: Wrong View                                                                              | "rejection\_code": "wrong\_view"​                 |
| REJECTED: Bad Weather                                                                             | "rejection\_code": "bad\_weather"​                |
| REJECTED: Make sure your VIN is visible in the VIN photo provided                                 | "rejection\_code": "vin\_not\_visible"​           |
| REJECTED: Vehicle in photo does not match VIN provided or vehicle being inspected.                | "rejection\_code": "vin\_mismatch"​               |
| REJECTED: Please only capture your VIN from off the vehicle itself                                | "rejection\_code": "vin\_not\_from\_vehicle"      |
| "Accepted"                                                                                        | "rejection\_code": null                           |

#### Note:&#x20;

Since the VIN photo (Photo Code: 1) routes the data through PAVE's Capture API instead of the OpenAPI, the VIN photo will always show "rejection\_code": null&#x20;

#### Vehicle Objects&#x20;

| Attribute          | Type    | Description                                                        |
| ------------------ | ------- | ------------------------------------------------------------------ |
| **`vehicle_id`**   | integer | PAVE system ID for vehicle                                         |
| **`vin`**          | string  | The VIN inputted or extracted for the session                      |
| **`year`**         | integer | The Year of the vehicle                                            |
| **`make`**         | string  | The Make of the vehicle                                            |
| **`model`**        | string  | The Model of the vehicle                                           |
| **`body_type`**    | string  | The vehicle's body type                                            |
| **`trim`**         | string  | The Trim detected of the vehicle                                   |
| **`transmission`** | string  | The Transmission detected for the vehicle                          |
| **`drivetrain`**   | string  | The Drivetrain of the vehicle                                      |
| **`engine_type`**  | string  | The Engine Type of the vehicle                                     |
| **`fuel_type`**    | string  | The Fuel Type of the vehicle                                       |
| **`ext_col`**      | string  | The Exterior Color detected of the vehicle                         |
| **`int_col`**      | string  | The Interior Color detected of the vehicle                         |
| **`odom_reading`** | integer | The Odometer Reading inputted or extracted for the session         |
| **`odom_unit`**    | string  | The Odometer unit of measure inputted or extracted for the session |

```
    "vehicle": {
        "id": 19880,
        "vin": "5N1AT2MV0HCXXXXXX",
        "year": 2017,
        "make": "Nissan",
        "model": "Rogue",
        "body_type": "Wagon 4 Dr.",
        "trim": "AWD 4dr S *Ltd Avail*",
        "transmission": "AUTOMATIC",
        "drivetrain": "All Wheel Drive",
        "engine_type": "4 Cylinder Engine",
        "fuel_type": "Gasoline Fuel",
        "ext_col": "Glacier White",
        "int_col": "Black",
        "odom_reading": "100,945",
        "odom_unit": "KILOMETRES"
    },
```

#### Location

| Attribute          | Type    | Description                                     |
| ------------------ | ------- | ----------------------------------------------- |
| **`address`**      | string  | Full address of where the vehicle was inspected |
| **`street_num`**   | integer | Street Number                                   |
| **`street`**       | string  | Street                                          |
| **`city`**         | string  | City                                            |
| **`state`**        | string  | State or Province                               |
| **`state_code`**   | string  | ZIP or Postal Code                              |
| **`country`**      | string  | Name of Country                                 |
| **`country_code`** | string  | ISO Country Code                                |
| **`latitude`**     | string  | Latitude                                        |
| **`longitude`**    | string  | Longitude                                       |

The PAVE Capture UI detects the User's location for where they completed their inspection only when they give PAVE permission when asked by the browser. This location is not always their business or home address as it is the inspection location and may not be available for all sessions. When the User gives permission but they have not set the browser to share their location in their device settings PAVE will not return the location.

```
    "location": {
        "address": "3 Sloping Sky Mews, Toronto, ON M5V 0B9, Canada",
        "street_num": "3",
        "street": "Sloping Sky Mews",
        "city": "Toronto",
        "state": "Ontario",
        "state_code": "ON",
        "post_code": "M5V 0B9",
        "country": "Canada",
        "country_code": "CA",
        "latitude": "43.636662757",
        "longitude": "-79.403777518"
    }
```

#### Disclosures

| Attribute           | Type   | Description                              |
| ------------------- | ------ | ---------------------------------------- |
| **`title_orgin`**   | object | User responses to Title questions        |
| **`odometer`**      | object | User responses to Odometer questions     |
| **`damage`**        | object | User responses to Damage questions       |
| **`mechanical`**    | object | User responses to Mechanical questions   |
| **`previous_user`** | object | User responses to Previous Use questions |

```
    "disclosures": {
        "title_origin": {
            "grey_market": false,
            "incorrect_vehicle_marking": false,
            "manufacturer_repurchase": [],
            "out_of_state": [],
            "title_branded": "None",
            "total_loss": false,
            "cross_boarder": false,
            "vin_plate_issues": false,
            "warranty_cancelled": false,
            "stolen_and_recovered": false
        },
        "odometer": {
            "odom_5_digit": false,
            "odom_faulty": false,
            "odom_in_other": false,
            "odom_replaced": false,
            "odom_roll_back": false,
            "odom_unreadable": false,
            "tmu": false,
            "rmu": []
        },
        "damage": {
            "accident_repair": 0,
            "adjacent_panels_replaced": false,
            "excessive_rust": false,
            "fire_damage": false,
            "flood_damage": false,
            "irreparable": false,
            "structural_damage": false
        },
        "mechanical": {
            "abs_defective": false,
            "air_bag_defective": false,
            "alternate_fuel": false,
            "none_specs": false,
            "major_repair": []
        },
        "previous_user": {
            "previous_daily_rental": false,
            "previous_driving_school_vehicle": false,
            "previous_emergency_vehicle": false,
            "previous_police_vehicle": false,
            "previous_taxi_limo": false
        }
    },
```

#### Announcements&#x20;

| Attribute                 | Type    | Description                                          |
| ------------------------- | ------- | ---------------------------------------------------- |
| **`title_present`**       | boolean | User response to is Title Present                    |
| **`all_keys_present`**    | integer | Number of keys response from User                    |
| **`books_present`**       | boolean | User response to are Books Present                   |
| **`discs_present`**       | boolean | User response to are all Discs Present               |
| **`rims_tires`**          | boolean | User response to are Original Rims and Tires Present |
| **`other_announcements`** | string  | User-added announcements                             |

```
    "announcements": {
        "title_present": null,
        "all_keys_present": "1",
        "books_present": true,
        "discs_present": true,
        "rims_tires": false,
        "other_announcements": "qc test"
    },
```

#### Inspection Objects

**`detected_status`**

The **`detected_status`** provides a label that describes the condition that was determined by the inspection of the vehicle's interior and tires.

| Attribute      | Type   | Description                                              |
| -------------- | ------ | -------------------------------------------------------- |
| **`interior`** | string | PAVE Label that describes the overall interior condition |
| **`tire`**     | string | PAVE Label that describes the condition of the tires     |

**`detected_damages`**

The **`detected_damages`** provides the detail that describes the damages detected during the inspection.

| Attribute                | Type    | Description                                                                                                                                                                                                                                                                  |
| ------------------------ | ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`damage_group`**       | string  | The category of the damaged component type                                                                                                                                                                                                                                   |
| **`component`**          | string  | The label of the component that is damaged                                                                                                                                                                                                                                   |
| **`damage_name`**        | string  | The label of the damage type that was detected                                                                                                                                                                                                                               |
| **`component_label`**    | string  | The description of the component that is damaged                                                                                                                                                                                                                             |
| **`user_response`**      | string  | If the User accepted or denied the detected damages                                                                                                                                                                                                                          |
| **`source`**             | string  | If the damage was detected by PAVE or inputted manually                                                                                                                                                                                                                      |
| **`description`**        | string  | The description of the damage detected                                                                                                                                                                                                                                       |
| **`tolerance`**          | string  | The tolerance range of the detected damage label used                                                                                                                                                                                                                        |
| **`repair_method`**      | string  | The method used to repair the damage                                                                                                                                                                                                                                         |
| **`repair_type`**        | string  | The category of the type of repair                                                                                                                                                                                                                                           |
| **`unit_measure`**       | string  | If the repair fixes all other damages or not (Per Item does not)                                                                                                                                                                                                             |
| **`grade_score`**        | integer | The level of severity as a score from 0-5                                                                                                                                                                                                                                    |
| **`frame_grade_score`**  | integer | The added level of severity if considered frame damage                                                                                                                                                                                                                       |
| **`photo: code`**        | integer | The PAVE code for the image                                                                                                                                                                                                                                                  |
| **`photo: url`**         | string  | The URL to retrieve the image that was used to detect damage                                                                                                                                                                                                                 |
| **`uuid`**               | string  | PAVE's damage ID                                                                                                                                                                                                                                                             |
| **`cropped_url`**        | string  | The URL to retrieve the cropped image of the damage                                                                                                                                                                                                                          |
| **`cropped_code`**       | integer | The number that is used identify the location of the damage on the annotated image                                                                                                                                                                                           |
| **`estimate_category`**  | string  | The category of estimate between Exterior and Tire/Wheel                                                                                                                                                                                                                     |
| **`labor_hrs`**          | integer | Labor hour estimate to handle the damage                                                                                                                                                                                                                                     |
| **`labor_total`**        | integer | Labor total cost to handle the damage: Standard Labor Rate \* Labor hour                                                                                                                                                                                                     |
| **`part_materials`**     | integer | Estimate cost of the damaged component that need repair/replace                                                                                                                                                                                                              |
| **`total`**              | integer | Total estimate cost: Labor + Part                                                                                                                                                                                                                                            |
| **`estimate_included`**  | boolean | Indicate if the cost of this component is already included in another damage report                                                                                                                                                                                          |
| **`estimate_tbd`**       | boolean | Indicate if the cost of this component can be discussed between users                                                                                                                                                                                                        |
| **`material`**           | string  | Material of the component                                                                                                                                                                                                                                                    |
| **`component_id`**       | integer | PAVE ID of component                                                                                                                                                                                                                                                         |
| **`damage_type`**        | string  | Damage type that was detected                                                                                                                                                                                                                                                |
| **`damage_type_id`**     | integer | PAVE ID of damage type                                                                                                                                                                                                                                                       |
| **`severity`**           | string  | Severity of damage detected                                                                                                                                                                                                                                                  |
| **`severity_id`**        | integer | PAVE ID of severity                                                                                                                                                                                                                                                          |
| **`aasc_item_code`**     | integer | AutoGrade component code                                                                                                                                                                                                                                                     |
| **`aasc_damage_code`**   | integer | AutoGrade damage code                                                                                                                                                                                                                                                        |
| **`aasc_severity_code`** | integer | AutoGrade severity code                                                                                                                                                                                                                                                      |
| **`status`**             | string  | Indicate if the damage is an old one (already identified in the previous inspection) newly detected in the current inspection compared to the previous one for the same vehicle or if it was identified in the previous inspection and has been repaired in this inspection. |

<pre><code>
        "detected_damages": [
            {
                "damage_group": "BODY",
                "component": "HOOD_FRONT_UNIQUE",
                "damage_name": "BENT_MAJOR",
                "component_label": "Hood",
                "user_response": null,
                "source": "inspect",
                "label": "Has Major Bend",
                "status": "new",
                "description": "Has Major Bend",
                "tolerance": "9 inches to 10 inches",
                "repair_method": "Replace",
                "repair_type": "Body Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 1,
                "labor_total": 1,
                "parts_materials": 1,
                "total": 2,
                "grade_score": 3,
                "frame_grade_score": 0,
                "photo": {
                    "code": "05",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/05\/05-annotated.jpg"
                },
                "uuid": "8lwjqg15lepjogtg",
                "cropped_url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/crop-damages\/8lwjqg15lepjogtg.png",
                "cropped_code": "01",
                "estimate_included": false,
                "estimate_tbd": false,
                "<a data-footnote-ref href="#user-content-fn-1">material</a>": "Painted",
                "damage_type": "Bent",
                "damage_type_id": 1,
                "aasc_damage_code": 15,
                "severity": "Major",
                "severity_id": 3,
                "aasc_severity_code": 15,
                "component_id": 64,
                "aasc_item_code": 110
            },
            {
                "damage_group": "BODY",
                "component": "BUMPER_FRONT_UNIQUE",
                "damage_name": "BENT_MEDIUM",
                "component_label": "Front Bumper Cover",
                "user_response": null,
                "source": "inspect",
                "label": "Has Medium Bend",
                "status": "repaired",
                "description": "Has Medium Bend",
                "tolerance": "5 to 6 inches",
                "repair_method": "Replace",
                "repair_type": "Body Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 3.5,
                "labor_total": 3.5,
                "parts_materials": 550,
                "total": 553.5,
                "grade_score": 3,
                "frame_grade_score": 0,
                "photo": {
                    "code": "05",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/05\/05-annotated.jpg"
                },
                "uuid": "8lwjqg15lepjogth",
                "cropped_url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/crop-damages\/8lwjqg15lepjogth.png",
                "cropped_code": "02",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Bent",
                "damage_type_id": 1,
                "aasc_damage_code": 15,
                "severity": "Medium",
                "severity_id": 2,
                "aasc_severity_code": 10,
                "component_id": 14,
                "aasc_item_code": 6300
            },
            {
                "damage_group": "BODY",
                "component": "BUMPER_FRONT_UNIQUE",
                "damage_name": "BROKEN_MEDIUM",
                "component_label": "Front Bumper Cover",
                "user_response": null,
                "source": "inspect",
                "label": "Has Medium Crack",
                "status": "old",
                "description": "Has Medium Crack",
                "tolerance": "5 to 6 inches",
                "repair_method": "Replace",
                "repair_type": "Body Shop Repair",
                "unit_measure": "Per Component",
                "estimate_category": "Exterior",
                "labor_hrs": 3.5,
                "labor_total": 3.5,
                "parts_materials": 550,
                "total": 553.5,
                "grade_score": 3,
                "frame_grade_score": 0,
                "photo": {
                    "code": "05",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/05\/05-annotated.jpg"
                },
                "uuid": "8lwjqg15lepjogti",
                "cropped_url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/crop-damages\/8lwjqg15lepjogti.png",
                "cropped_code": "03",
                "estimate_included": true,
                "estimate_tbd": false,
                "material": "Painted",
                "damage_type": "Broken",
                "damage_type_id": 2,
                "aasc_damage_code": 16,
                "severity": "Medium",
                "severity_id": 2,
                "aasc_severity_code": 10,
                "component_id": 14,
                "aasc_item_code": 6300
            },
            {
                "damage_group": "TIRE",
                "component": "TIRE_REAR_LEFT",
                "damage_name": "GOOD_CONDITION",
                "component_label": "Rear Left Tire",
                "user_response": null,
                "source": "inspect",
                "label": "Good Condition",
                "description": "Good Condition",
                "tolerance": "Shows Minimum Signs of Wear",
                "repair_method": "Info\/Report",
                "repair_type": "Info\/Report",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0,
                "labor_total": 0,
                "parts_materials": 0,
                "total": 0,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "04",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/04\/04-annotated.jpg"
                },
                "uuid": "3o4nq15lepjn3xs",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "GOOD_CONDITION",
                "damage_type_id": 0,
                "aasc_damage_code": 0,
                "severity": "",
                "severity_id": 0,
                "aasc_severity_code": 0,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_group": "TIRE",
                "component": "TIRE_REAR_RIGHT",
                "damage_name": "GOOD_CONDITION",
                "component_label": "Rear Right Tire",
                "user_response": null,
                "source": "inspect",
                "label": "Good Condition",
                "description": "Good Condition",
                "tolerance": "Shows Minimum Signs of Wear",
                "repair_method": "Info\/Report",
                "repair_type": "Info\/Report",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0,
                "labor_total": 0,
                "parts_materials": 0,
                "total": 0,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "07",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/07\/07-annotated.jpg"
                },
                "uuid": "3o4nq15lepjn3xt",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "GOOD_CONDITION",
                "damage_type_id": 0,
                "aasc_damage_code": 0,
                "severity": "",
                "severity_id": 0,
                "aasc_severity_code": 0,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_group": "TIRE",
                "component": "TIRE_FRONT_LEFT",
                "damage_name": "WORN_MINOR",
                "component_label": "Front Left Tire",
                "user_response": null,
                "source": "inspect",
                "label": "Is Minor Worn",
                "description": "Is Minor Worn",
                "tolerance": "Minor Signs of Wear",
                "repair_method": "Info\/Report",
                "repair_type": "Info\/Report",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0,
                "labor_total": 0,
                "parts_materials": 0,
                "total": 0,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "04",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/04\/04-annotated.jpg"
                },
                "uuid": "3o4nq15lepjn3y7",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "Worn",
                "damage_type_id": 54,
                "aasc_damage_code": 10,
                "severity": "Minor Tire Wear",
                "severity_id": 10,
                "aasc_severity_code": 16,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_group": "INTERIOR",
                "component": "INTERIOR",
                "damage_name": "CLEAN",
                "component_label": "Interior",
                "user_response": null,
                "source": "inspect",
                "label": "",
                "description": "",
                "tolerance": "",
                "repair_method": "",
                "repair_type": "",
                "unit_measure": "",
                "estimate_category": "",
                "labor_hrs": 0,
                "labor_total": 0,
                "parts_materials": 0,
                "total": 0,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "02",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/02\/02-original_ACCEPT_3134994.jpg"
                },
                "uuid": "3o4nq15lepjmad1",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "",
                "damage_type": "",
                "damage_type_id": 0,
                "aasc_damage_code": 0,
                "severity": "",
                "severity_id": 0,
                "aasc_severity_code": 0,
                "component_id": 0,
                "aasc_item_code": 0
            },
            {
                "damage_group": "TIRE",
                "component": "TIRE_FRONT_RIGHT",
                "damage_name": "WORN_MINOR",
                "component_label": "Front Right Tire",
                "user_response": null,
                "source": "inspect",
                "label": "Is Minor Worn",
                "description": "Is Minor Worn",
                "tolerance": "Minor Signs of Wear",
                "repair_method": "Info\/Report",
                "repair_type": "Info\/Report",
                "unit_measure": "Per Component",
                "estimate_category": "Tires and Wheels",
                "labor_hrs": 0,
                "labor_total": 0,
                "parts_materials": 0,
                "total": 0,
                "grade_score": 0,
                "frame_grade_score": 0,
                "photo": {
                    "code": "07",
                    "url": "https:\/\/inspections.paveapi.com\/PAV-230301103619-113\/07\/07-annotated.jpg"
                },
                "uuid": "3o4nq15lepjn3y8",
                "cropped_url": "",
                "cropped_code": "",
                "estimate_included": false,
                "estimate_tbd": false,
                "material": "Rubber",
                "damage_type": "Worn",
                "damage_type_id": 54,
                "aasc_damage_code": 10,
                "severity": "Minor Tire Wear",
                "severity_id": 10,
                "aasc_severity_code": 16,
                "component_id": 0,
                "aasc_item_code": 0
            }
        ]
</code></pre>

#### Annotated Images

The **`annotated_images`**&#x70;rovides the URLs to retrieve the images PAVE generates that are annotated to highlight the exact location of all the detected damages. The highlighted number corresponds with the **`cropped_code`**&#x6E;umber found in the **`damages`**&#x6F;bject. These will be NULL if no damages are found.

```
        "annotated_images": [
            {"photo_code": 4, "photo_label": "Left", "url": "https://inspections-dev.paveapi.com/PAV-210525115647-178/04/04-annotated.jpg"},
            {"photo_code": 5, "photo_label": "Front", "url": "https://inspections-dev.paveapi.com/PAV-210525115647-178/05/05-annotated.jpg"}
        ],
```

#### Grading

The **`grading`** provides the overall grading that PAVE has given the session vehicle based on what damages are detected. These gradings are given in three separate grading bands to help align with industry standards in each region or use case. &#x20;

```
        "grading": {
            "standard_A": 4,
            "standard_B": "B-2",
            "standard_C": "Very Good Condition",
```

| **PAVE GRADING MATRIX:**                 |                                                                                             |                                   |   |                  |                     |                   |   |
| ---------------------------------------- | ------------------------------------------------------------------------------------------- | --------------------------------- | - | ---------------- | ------------------- | ----------------- | - |
| STANDARD A                               | STANDARD B                                                                                  | STANDARD C                        |   |                  |                     |                   |   |
| **PAVE Vehicle Condition Grading Scale** | [**NAMA Vehicle Condition Grading Scale http://www.nama-uk.com/**](http://www.nama-uk.com/) | **PAVE Book Value Grading Scale** |   | **vs Autograde** | **vs KBB**          | **vs Black Book** |   |
| 5                                        | A-1                                                                                         | Excellent Condition               |   | Extra Clean      | Excellent Condition | Extra Clean       |   |
| 4                                        | B-2                                                                                         | Very Good Condition               |   | Clean            | Very Good Condition | Clean             |   |
| 3                                        | C-3                                                                                         | Good Condition                    |   | Average          | Good Condition      | Average           |   |
| 2                                        | D-4                                                                                         | Fair Condition                    |   | Below Average    | Fair Condition      | Rough             |   |
| 1                                        | E-5                                                                                         | Poor Condition                    |   | Rough            | Unclassified        | Rough             |   |
| 0                                        | U-6                                                                                         | Very Poor Condition               |   | Unclassified     | Unclassified        | Rough             |   |

#### Component Damages

The **`component_damages`** provides an overall summary of how many items were detected per component and what the total estimates were for the session.

```
            "component_damages": {
                "DOOR_FRONT_LEFT": {
                    "score_by_component": false,
                    "item_score": 1,
                    "component_score": 0
                },
                "BUMPER_FRONT_UNIQUE": {
                    "score_by_component": false,
                    "item_score": 1,
                    "component_score": 0
                },
                "TIRE_FRONT_LEFT": {
                    "score_by_component": false,
                    "item_score": 0,
                    "component_score": 0
                },
                "TIRE_REAR_LEFT": {
                    "score_by_component": false,
                    "item_score": 0,
                    "component_score": 0
                },
                "TIRE_FRONT_RIGHT": {
                    "score_by_component": false,
                    "item_score": 0,
                    "component_score": 0
                },
                "TIRE_REAR_RIGHT": {
                    "score_by_component": false,
                    "item_score": 0,
                    "component_score": 0
                }
            }
        },
        "total_estimates": 2       
    },
```

#### Condition Report and Landing Page

When each session gets completed PAVE will generate two detailed condition reports; one as a sharable PDF and the other as an HTML landing page that you can use for your purposes. Your PAVE account representative can help to customize the header of both to fit your brand needs.

```
"condition_report": "https://reports.paveapi.com/api/report/XXX-ABCDE12345",
    "landing_page": "https://paveinspect.com/park/XXX-ABCDE12345"    
```

[^1]:


# PUT Update Session

Update the details you provided when creating a session belonging to the API-Key by referencing the session\_key - if it has not yet been started by the User.

{% hint style="warning" %}
You can only update **`redirect_url`**, **`language`** while the session has not yet been completed by the User
{% endhint %}

{% hint style="warning" %}
You can only update the **`theme`** when the session has not yet started, and the status is **`IDLE`**
{% endhint %}

{% hint style="warning" %}
You can only update the **`sms.to`** when the session has not yet started, and the **`sms`** delivery status is an error.
{% endhint %}

```
https://openapi.paveapi.com/v1/sessions/:session_key
```

Replace **`:session_key`** with the unique **`session_key`** returned from your previous request, and PAVE will update the corresponding session detail&#x73;**.**&#x20;

| Path Parameters   | Type   | Description                                 |
| ----------------- | ------ | ------------------------------------------- |
| **`session_key`** | string | The session ID generated when first created |

| Headers             | Type   | DescriptionAPI                                     |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | Your account's API-Key                             |
| **`API-Token`**     | string | The API-Token                                      |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

| Body Parameters | Type   | Description                                                                       |
| --------------- | ------ | --------------------------------------------------------------------------------- |
| **`session`**   | object | Single-level object, described in Create New Session                              |
| **`vehicle`**   | object | Single-level object, described in Create New Session                              |
| **`sms`**       | object | Single-level object, described in Create New Session**Sample Response - 200: Ok** |

#### Sample Session Payload

<pre><code><strong>{
</strong>            "session": {
                "theme": "LITE",
                "redirect_url": "https://www.url-to-redirect-user-to.com",
                "language": "EN",
                "client_id": "SOUTH234889"
            }
<strong>}
</strong></code></pre>

#### Sample Vehicle Payload

```
{ 
            "vehicle": {
                "vin":"JN1CV6AR9BMXXXXXX",
                "year":"2011",
                "make":"Infiniti",
                "model":"G37",
                "body_type":"Sedan",
                "trim":"Luxury",
                "transmission":"Automatic",
                "ext_col":"Malbec Black",
                "int_col":"Wheat",
                "odom_reading":330477,
                "odom_unit":"KILOMETRES"
            }
}
```

#### Sample SMS Payload

```
{
            "sms": {
                "to": "647-455-XXXX",
                "to_name": "Jane Smith",
                "from": "647-422-XXXX",
                "by": "Steve Test Dealer"
            }
}
```

```
{
            "sms": {
                "to": "647-455-XXXX"
            }
}
```

#### Sample Response (200: Ok)

Updated successfully retrieved.

```
{
    "session_key": "XXX-ABCDE12345",
    "theme": "PRO",
    "active": true,
    "status": "IDLE",
    "redirect_url": "https://dev.paveinspect.com/valet/XXX-ABCDE12345/?l=en",
    "inspect_started_at": "",
    "inspect_ended_at": "",
    "created_at": "2021-05-25T11:50:49.000000Z",
    "updated_at": "2021-05-25T11:59:20.000000Z",
    "language": "EN",
    "options": {
        "client_id": "SOUTH234889",
        "sms": {
            "to": "647-455-XXXX",
            "to_name": "Jane Smith",
            "from": "647-422-XXXX",
            "by": "Steve's Test Dealer",
            "delivery_status": "201 Created",
            "delivery_message": ""            
        }
    },
    "vehicle": {
        "vin": "JN1CV6AR9BMXXXXXX"
    }
}
```

#### Sample Response (404: Not Found)

Could not find a session matching the **`session_key`**.

```
{
    "message": "Session :session_key cannot be found."
}
```


# DELETE Session

Delete a session belonging to the API-Key by referencing the session\_key - if it has not yet been stated by the User.

{% hint style="warning" %}
You can only delete session that has not been started by the User, and the status is **`IDLE`**
{% endhint %}

```
https://openapi.paveapi.com/v1/sessions/:session_key
```

| Path Parameters   |        |                                                                |
| ----------------- | ------ | -------------------------------------------------------------- |
| **`session_key`** | string | Unique session\_key generated when the new session was created |

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

#### Sample Response (200: Ok)

The session successfully deleted.

```
{
    "message": "Session :session_key has been successfully removed."
}
```

#### Sample Response (400: Bad Request)

The session was unable to be deleted.

```
{
    "message": "Session :session_key has been started and cannot be deleted."
}
```

#### Sample Response (404: Not Found)

The session was not found - please check if the **`session_key`** is correct.

```
{
    "message": "Session :session_key cannot be found."
}
```


# Webhooks

Creating a New Callback

{% hint style="info" %}
Webhooks are configured directly on the PAVE Dashboard. For separate guidance on how to configure a webhook on the dashboard, please also read [here](https://guides.pave.ai/branch-dashboard/user-feature-walkthrough/developer-tools/webhooks)
{% endhint %}

### Endpoint:

```bash
https://openapi.paveapi.com/v1/callbacks
```

### Introduction

This endpoint allows you to set up a new callback for your API-Key.

### Headers

The following headers must be included in the request:

* `API-Key`: A string that represents the API-Key provided for your account.
* `API-Token`: A string that represents the API-Token used when the session was created.
* `API-Timestamp`: A UTC datetime string in the format of "2021-05-30T12:49:19Z".

### Body Parameters

The following parameters must be included in the request body:

* `event`: A string that represents one of the supported events. The options are:
  1. `SESSION:SMS_PROCESS`
  2. `SESSION:STAGE_CHANGE`
  3. `SESSION:STATUS_CHANGE`
  4. `SESSION:COMPLETE`
* `url`: A string that represents the endpoint URL for your callback to receive the events.

The following parameters are optional:

* `method`: A string that represents the method to be used. POST is the default if not provided.
* `headers`: A string that represents the authentication headers to be included (API key, token).
* `payload`: A string that represents the attributes to be sent along with the default payload for the supported events.

| Supported Events            |                                                        |
| --------------------------- | ------------------------------------------------------ |
| **`SESSION:SMS_PROCESS`**   | Triggered when the process changes for the SMS Message |
| **`SESSION:STAGE_CHANGE`**  | Triggered when User captures each photo in the process |
| **`SESSION:STATUS_CHANGE`** | Triggered when the session status changes              |
| **`SESSION:COMPLETE`**      | Triggered when the session is completed                |
| **`SESSION:NOTE_INSERT`**   | Triggered when a note has been inserted to the session |

### API Endpoints

* Retrieve a list of all callbacks: `GET https://openapi.paveapi.com/v1/callbacks`
* Retrieve a specific callback by event: `GET https://openapi.paveapi.com/v1/callbacks/:event`
* Create a new callback: `POST https://openapi.paveapi.com/v1/callbacks`
* Update an existing callback: `PUT https://openapi.paveapi.com/v1/callbacks/:event`
* Delete a callback: `DELETE https://openapi.paveapi.com/v1/callbacks/:event`"

### Sample Response (200: OK)

```json
{
    "api_key": "<your_request_api_key",
    "event": "SESSION:STAGE_CHANGE",
    "url": "https://your_sms_callback_url",
    "method": "POST",
    "headers": {
        "Authorization": "Bearer <jwt_token>"
    },
    "payload": {
        "source": "PAVE", // additional attributes to pass along; setting on create callback
    }
}
```

### Sample Response (400: Bad Request)

```json
{
    "message": "Missing required fields."
}
```

## Supported Callback Events

### Webhook for Event "SESSION:SMS\_PROCESS"

When we receive the result of an SMS message from the message provider, we will send it to the callback URL along with the following default payload.

**Payload:**

The payload for this webhook will include the following fields:

* `session_key`: A string that represents the key of the session associated with the SMS message.
* `event`: A string that represents the event that triggered the webhook. The value for this field will always be "SESSION:SMS\_PROCESS".
* `name`: A string that represents the name of the recipient of the SMS message. This field is optional.
* `phone`: A string that represents the phone number associated with the session's SMS message.
* `status`: A string that represents the status of the SMS message. The value for this field will be either "success" or "error".
* `message`: A string that represents an error message if the status is "error".
* `timestamp`: A string in ISO8601 format that represents the date and time when the SMS result was received.

**Example:**

```json
{
    "session_key": "SWP-7LQUT*9BHE",
    "event": "SESSION:SMS_PROCESS",
    "name": "John Doe",
    "phone": "555-555-5555",
    "status": "success",
    "message": "",
    "timestamp": "2021-05-29T03:45:27+05:00"
}
```

PAVE's webhook for the event "SESSION:SMS\_PROCESS" is used to notify interested parties when the result of an SMS message is received. The payload of this webhook includes information about the session, the recipient, the status of the SMS message, and the timestamp of when the result was received. This information can be used to update other systems or take other actions in response to the receipt of an SMS result.

### Webhook for Event "SESSION:STAGE\_CHANGE"

When a captured photo has been processed, we will send the status, as well as the timestamp, to the callback URL along with the following default payload.

**Payload:**

The payload for this webhook will include the following fields:

* `session_key`: A string that represents the key of the session associated with the processed photo.
* `event`: A string that represents the event that triggered the webhook. The value for this field will always be "SESSION:STAGE\_CHANGE".
* `photo_code`: An integer that represents a unique identifier for the photo.
* `photo_label`: A string that represents the label given to the photo, such as "Interior".
* `photo_url`: A string that represents the URL where the captured photo can be found.
* `photo_status`: A string that represents the status of the photo. The value for this field will be either "accepted" or "rejected".
* `message`: A string that represents an error message if the status is "rejected".
* `timestamp`: A string in ISO8601 format that represents the date and time when the photo was processed.

**Example:**

```json
{
    "session_key": "SWP-7LQUT*9BHE",
    "event": "SESSION:STAGE_CHANGE",
    "photo_code": 2,
    "photo_label": "Interior",
    "photo_url": "https://capturedphotourl.com",
    "photo_status": "accepted",
    "message": "",
    "timestamp": "2021-05-29T03:45:27+05:00"
}
```

PAVE's webhook for the event "SESSION:STAGE\_CHANGE" is used to notify interested parties when a captured photo has been processed. The payload of this webhook includes information about the session, the processed photo, and the status of the photo, as well as the timestamp of when the photo was processed. This information can be used to update other systems or take other actions in response to the processing of a photo.

### Webhook for Event "SESSION:STATUS\_CHANGE"

When the status of a session changes from STARTED to PROCESS, PROCESS to QC\_PASSED, or QC\_PASSED to CONFIRM, we will send the new status, as well as the timestamp, to the callback URL along with the following default payload.

**Payload:**

The payload for this webhook will include the following fields:

* `session_key`: A string that represents the key of the session whose status has changed.
* `event`: A string that represents the event that triggered the webhook. The value for this field will always be "SESSION:STATUS\_CHANGE".
* `status`: A string that represents the new status of the session. The value for this field will be one of the following: "STARTED", "PROCESS", QC\_PASSED, or "CONFIRM".
* `timestamp`: A string in ISO8601 format that represents the date and time when the status change occurred.

**Example:**

```json
{
    "session_key": "SWP-7LQUT*9BHE",
    "event": "SESSION:STATUS_CHANGE",
    "status": "STARTED",
    "timestamp": "2021-05-29T03:45:27+05:00"
}
```

PAVE's webhook for the event "SESSION:STATUS\_CHANGE" is used to notify interested parties when the status of a session changes. The payload of this webhook includes information about the session, the new status of the session, and the timestamp of when the status change occurred. This information can be used to update other systems or take other actions in response to a change in session status.

| STATUS     | DEFINITION                                                                                         |
| ---------- | -------------------------------------------------------------------------------------------------- |
| STARTED    | The user has started the inspection process but has not yet captured any vehicle images            |
| PROCESS    | The user has started capturing the vehicle images on the PAVE Web App                              |
| QC\_PASSED | All vehicle images have been captured by the user and have been accepted by PAVE's Image QC engine |
| CONFIRM    | The vehicle inspection is complete and the Condition Report is now being generated                 |
| COMPLETE   | The Condition Report has been generated and the inspection is now complete                         |
| EXPIRED    | The session has been idle for longer than the configured expiration window                         |

### Webhook for Event "SESSION:COMPLETE"

When the status of a session changes from CONFIRM to COMPLETE, we will send the results of the session to the callback URL. The payload will be exactly the same as the result of the API endpoint "GET Session Results".

**Payload:**

The payload for this webhook will include the same information as the result of the API endpoint "[**GET Session Results**](/integrations/developer-docs/sessions-1/get-a-session-results)". The exact structure and fields of the payload will depend on the specific implementation of the API.

PAVE's webhook for the event "SESSION:COMPLETE" is used to notify interested parties when a session is complete and its results are available. The payload of this webhook includes the same information as the result of the API endpoint "GET Session Results", including the session key, status, timestamp, and results. This information can be used to update other systems or take other actions in response to the completion of a session.

#### PAVE Inspection Results Data

This link below provides a PDF document that includes a detailed description of the various objects used in an inspection session JSON that is SESSION:COMPLETE.&#x20;

{% file src="/files/flGnc9RRCxVy1c7NmZHw" %}
Click to open PDF&#x20;
{% endfile %}

These objects include the Session Object, which contains information about the inspection session, such as the session key, theme, status, and contact details. The Vehicle Object has information on the inspected vehicle, including the VIN, make, model, and odometer reading. The Photos Object contains information about the photos taken during the inspection, including the URL where they are stored and whether they were approved in the photo QA process. The Location Object provides details about the location of the inspection. Lastly, the Inspection Object contains information about the damages detected during the inspection, including the total number of damages and their maximum grade per item.

### Webhook for Event "SESSION:NOTE\_INSERT"

This event is triggered when a new note is added to a session. The following section provides a description of the payload that will be sent with the webhook.

**Payload:**

The payload for this webhook will contain the following fields:

* `session_key`: A string that represents the key of the session where the note was inserted.
* `event`: A string that represents the event that triggered the webhook. For this event, the value will always be "SESSION:NOTE\_INSERT".
* `timestamp`: A string in ISO8601 format that represents the date and time when the note was inserted.
* `title`: A string that represents the title of the inserted note.
* `description`: A string that represents the description of the inserted note.
* `user`: A string that represents the user who inserted the note. This could be the username of a logged-in user or the word "guest" if the note was inserted by a guest.

Example:

```json
  {
  "session_key": "SWP-7LQUT*9BHE",
  "event": "SESSION:NOTE_INSERT",
  "timestamp": "2021-05-29T03:45:27+05:00",
  "title": "Note title",
  "description": "Note description",
  "user": "Logged-username"
}
```

PAVE's webhook for the event "SESSION:NOTE\_INSERT" is used to notify interested parties when a new note is added to a session. The payload of this webhook contains information about the session, the note, and the user who inserted the note. This information can be utilized to update other systems or take other actions in response to the addition of a new note.


# GET All Callbacks

See all callbacks created for your API-Key

```
https://openapi.paveapi.com/v1/callbacks
```

This endpoint allows you to get all callback settings from requesting API Key.

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

#### Sample Response (200:Ok)

```
{
    "api_key": "<your_requested_api_key>",
    "data": [
        {
            "event": "SESSION:SMS_PROCESS",
            "url": "https://your_sms_callback_url",
            "method": "POST",
            "headers": {
                "Authorization": "Bearer <jwt_token>"
            },
            "payload": {
                "phone": "<session_to_phone>", // original payload we sent to Twilio
                "status": "<success_or_error>", // delivery status from Twilio
                "message": "<error_message>", // optional; probably error message
                "source": "PAVE", // additional attributes to pass along; setting on create callback
            }
        },
        {
            "event": "SESSION:STAGE_CHANGE",
            "url": "https://your_sms_callback_url",
            "method": "POST",
            "headers": {
                "Authorization": "Bearer <jwt_token>"
            },
            "payload": {
                "session_key": "",
                "photo_url": "",
                "photo_status": "",
                "message": "<rejected_message>", // optional; probably rejected message
                "source": "PAVE", // additional attributes to pass along; setting on create callback
            }
        }
    ]
}
```


# GET View a Callback

See a callback setting created for your API-Key

```
https://openapi.paveapi.com/v1/callbacks/:event
```

This endpoint allows you to get all callback settings from requesting API Key.

| Headers             | Type   | Description                                        |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

| Path Parameters | Type   | Description                                                                                                                |
| --------------- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
| **`event`**     | string | Input one of the Supported Events, view [the list here](/integrations/developer-docs/callbacks#supported-callback-events). |

#### Sample Response (200:Ok)

```
{
    "api_key": "<your_requested_api_key>",
    "data": {
        "event": "SESSION:STAGE_CHANGE",
        "url": "https://your_callback_url",
        "method": "POST",
        "headers": {
            "Authorization": "Bearer <jwt_token>"
        },
        "payload": {
            "source": "PAVE", // additional attributes to pass along; setting on create callback
        }
    },    
}
```


# POST Create New Callback

Set up a new callback for your API-Key.

```
https://openapi.paveapi.com/v1/callbacks
```

This endpoint allows you to create a new callback for your requesting API Key.

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

| Body Parameters          | Type   | Description                                                                                                                                                 |
| ------------------------ | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`event`**              | string | Input one of the Supported Events: 1 - **`SESSION:SMS_PROCESS`**, 2 - **`SESSION:STAGE_CHANGE`** 3 - **`SESSION:STATUS_CHANGE`** 4 - **`SESSION:COMPLETE`** |
| **`url`**                | string | Your callback Endpoint URL to receive the events                                                                                                            |
| **`method`** (optional)  | string | The method to be used, POST is the default if not provided                                                                                                  |
| **`headers`** (optional) | string | Enter the authentication headers to be included (API key, token)                                                                                            |
| **`payload`** (optional) | string | Attributes to send along with the default payload for the Supported Events                                                                                  |

#### Sample Response (200:Ok)

```
{
    "api_key": "<your_request_api_key",
    "event": "SESSION:STAGE_CHANGE",
    "url": "https://your_sms_callback_url",
    "method": "POST",
    "headers": {
        "Authorization": "Bearer <jwt_token>"
    },
    "payload": {
        "source": "PAVE", // additional attributes to pass along; setting on create callback
    }
}
```

#### Sample Response (400:Bad Request)

```
{
    "message": "Missing required fields."
}
```


# PUT Update a Callback

Update a callback that was already set up for your API-Key.

```
https://openapi.paveapi.com/v1/callbacks/:event
```

This endpoint allows you to update a previously created callback for your requesting API Key.

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

| Path Parameters | Type   | Description                                                                                                                |
| --------------- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
| **`event`**     | string | Input one of the Supported Events, view [the list here](/integrations/developer-docs/callbacks#supported-callback-events). |

| Body Parameters          | Type   | Description                                                                |
| ------------------------ | ------ | -------------------------------------------------------------------------- |
| **`url`**                | string | Your callback Endpoint URL to receive the events                           |
| **`method`** (optional)  | string | The method to be used, POST is the default if not provided                 |
| **`headers`** (optional) | string | Enter the authentication headers to be included (API key, token)           |
| **`payload`** (optional) | string | Attributes to send along with the default payload for the Supported Events |

#### Sample Response (200: Ok)

```
{
    "api_key": "<your_request_api_key>",
    "event": "SESSION:STAGE_CHANGE",
    "url": "https://your_sms_callback_url",
    "method": "POST",
    "headers": {
        "Authorization": "Bearer <jwt_token>"
    },
    "payload": {
        "source": "PAVE", // additional attributes to pass along; setting on create callback
    }
}
```

#### Sample Response (400: Bad Request)

```
{
    "message": "Missing required fields."
}
```

#### Sample Response (404: Not Found)

```
{
    "api_key": "<your_request_api_key",
    "message": "Your API Key does not have callback setting for the event :event."
}
```


# DELETE a Callback

Delete a callback that was already set up for your API-Key.

```
https://openapi.paveapi.com/v1/callbacks/:event
```

This endpoint allows you to delete a previously created callback for your requesting API Key.

| Headers             |        |                                                    |
| ------------------- | ------ | -------------------------------------------------- |
| **`API-Key`**       | string | The API-Key that was provided for your account     |
| **`API-Token`**     | string | The API-Token used when the session was created    |
| **`API-Timestamp`** | string | UTC Datetime string, example: 2021-05-30T12:49:19Z |

| Path Parameters | Type   | Description                                                                                                                |
| --------------- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
| **`event`**     | string | Input one of the Supported Events, view [the list here](/integrations/developer-docs/callbacks#supported-callback-events). |

#### Sample Response (200: Ok)

```
{
    "api_key": "<your_request_api_key",
    "message": "Callback setting :event has been successfully removed."
}
```

#### Sample Response (404: Not Found)

```
{
    "api_key": "<your_request_api_key",
    "message": "Your API Key does not have callback setting for the event :event."
}
```


# Deep Linking

(Updated 5/1/2023)

## What is Deep Linking?

Deep Linking is a technique in which a given URL or resource is used to open a specific page or screen on mobile. So, instead of just launching the app on mobile, using our deep link method can lead a user to open PAVE's PWA in their browser. When finished, they will be redirected to a specific page within your native app, providing a seamless mobile experience. This particular page or screen you provide as a redirect URL may reside under a series of hierarchical pages, hence the term "deep" in deep linking.

## How does the PAVE Deep Linking work?

<figure><img src="/files/HGSmi4MnNOT2lbFfwG0K" alt=""><figcaption><p>Flowchart diagram of PAVE Deep Linking</p></figcaption></figure>

## Create Session

Create a new session for every User by generating a session\_key.

## Create New Session

<mark style="color:green;">`POST`</mark> `https://openapi.paveapi.com/v1/sessions`

#### Headers

| Name                                            | Type   | Description                                 |
| ----------------------------------------------- | ------ | ------------------------------------------- |
| Accept<mark style="color:red;">\*</mark>        | String | application/json                            |
| Content-type<mark style="color:red;">\*</mark>  | String | application/json                            |
| API-Key<mark style="color:red;">\*</mark>       | String | Your API Key                                |
| API-Token<mark style="color:red;">\*</mark>     | String | Your Generated Access Token                 |
| API Timestamp<mark style="color:red;">\*</mark> | String | UTC Datetime, example: 2021-05-30T12:49:19Z |

{% tabs %}
{% tab title="200: OK Sample Response" %}

```json
{
    "session_key": "XXX-ABCDE12345",
    "theme": "PRO",
    "active": true,
    "status": "IDLE",
    "redirect_url": "https://www.url-to-redirect-user-to.com",
    "inspect_started_at": null,
    "inspect_ended_at": null,
    "created_at": "2021-05-25T11:50:49.000000Z",
    "updated_at": "2021-05-25T11:50:49.000000Z",
    "language": "EN",
    "capture_url": "https://demoadmin.vehiclecapture.com/TCB-123...",
    "options": {
        "client_id": "SOUTH234889",
        "sms": {
            "to": "647-455-XXXX",
            "to_name": "Jane Smith",
            "from": "647-422-XXXX",
            "by": "Steve's Test Dealer",           
        }
    },
    "vehicle": {
        "vin": "JN1CV6AR9BMXXXXXX"
    }    
}
```

{% endtab %}

{% tab title="400: Bad Request Sample Reponse" %}

```json
{
    "message": "Required fields are missing or invalid.",
    "errors": {
        "session.redirect_url": [
            "Invalid redirect url"
        ],
        "sms.to": [
            "Invalid phone number"
        ],
        "vehicle.vin": [
            "VIN is too short, it must be 17 characters"
        ]
    }
}
```

{% endtab %}
{% endtabs %}

#### Sample Request

```json
{
    "vehicle": {
        "vin":"JN1CV6AR9BMXXXXXX",
        "year":"2011",
        "make":"Infiniti",
        "model":"G37",
        "body_type":"Sedan",
        "trim":"Luxury",
        "transmission":"Automatic",
        "ext_col":"Malbec Black",
        "int_col":"Wheat",
        "odom_reading":330477,
        "odom_unit":"KILOMETRES"
    },
    "session": {
        "theme": "LITE",
        "redirect_url": "https://www.url-to-redirect-user-to.com",
        "client_id": "SOUTH234889"
    },
    "sms": {
        "to": "647-455-XXXX",
        "to_name": "Jane Smith",
        "from": "647-422-XXXX",
        "by": "Steve Test Dealer"
    }
}
```

{% hint style="warning" %}
The **`redirect_url`** is the handoff URL that we will send your User to at the end of their PAVE session to continue their journey on your application or website. So if you want to use redirect link, you have to send it to us.
{% endhint %}

{% hint style="info" %}
Please, read the [Create Session document](https://docs.paveapi.com/integrations/developer-docs/sessions-1/post-create-new-session) for more information.
{% endhint %}

## Launch PAVE Capture UI

```
https://api.paveapi.com/v1/launch/:SESSION-ID
```

Once you have the Session Key generated it can be used to launch the capture UI, which begins the inspection process.

Replac&#x65;**: SESSION-ID** with the generated session-id belonging to the vehicle to be inspected.

Example:

```
https://api.paveapi.com/v1/launch/TMV-B0R97T5QOD/
```

Open links with Safari or chrome.

<figure><img src="/files/Jg5D8yQwwpGRRSdJk44K" alt=""><figcaption></figcaption></figure>

### Android

{% tabs %}
{% tab title="Java" %}

```
String url = "https://api.paveapi.com/v1/launch/TMV-B0R97T5QOD/";
try {
    Uri uri = Uri.parse("googlechrome://navigate?url=" + url);
    Intent i = new Intent(Intent.ACTION_VIEW, uri);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(i);
} catch (ActivityNotFoundException e) {
    // Chrome is probably not installed
}
```

{% endtab %}

{% tab title="Kotlin" %}

```
  val url = "https://capture-dev.paveapi.com/home/TMV-B0R97T5QOD/"
  try {
    val uri: Uri = Uri.parse("googlechrome://navigate?url=$url")
    val i = Intent(Intent.ACTION_VIEW, uri)
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(i)
        } catch (e: ActivityNotFoundException) {
            // Chrome is probably not installed
        }
```

{% endtab %}
{% endtabs %}

### IOS

{% tabs %}
{% tab title="Swift" %}

```
guard let url = URL(string: "https://api.paveapi.com/v1/launch/TMV-B0R97T5QOD/") 
else { return }
UIApplication.shared.open(url)
```

{% endtab %}

{% tab title="Objective C" %}

```
NSURL *url = [NSURL URLWithString:@"https://capture-dev.paveapi.com/home/TMV-B0R97T5QOD/"];
if ([[UIApplication sharedApplication] canOpenURL:url]) {
   [[UIApplication sharedApplication] openURL:url];
}
```

{% endtab %}
{% endtabs %}

### React Native

```
Linking.openURL('https://api.paveapi.com/v1/launch/TMV-B0R97T5QOD/')}}
```

## Result

After **PAVE Capture** successfully and tap on **`CLOSE`** button, you will redirect to your app.

<div align="center"><figure><img src="/files/0uRh8pSHeAZh7Bu4BMZL" alt=""><figcaption></figcaption></figure></div>


# Deep Link with React Native App

## While create the session ID, define the URL

We are going to support the URL (deep links) into the app:

* `pave://`

{% hint style="info" %}
You can create your custom URL, but make sure you config the same URL in native app. For example, we using the URL is ***`pave://`***&#x20;
{% endhint %}

## Create New Session ID

<mark style="color:green;">`POST`</mark> `https://openapi.paveapi.com/v1/sessions:api-key`

#### Headers

| Name                                            | Type   | Description                 |
| ----------------------------------------------- | ------ | --------------------------- |
| Accept<mark style="color:red;">\*</mark>        | String | application/json            |
| Content-type<mark style="color:red;">\*</mark>  | String | application/json            |
| API-Timestamp<mark style="color:red;">\*</mark> | String | UTC Datetime                |
| API-Token<mark style="color:red;">\*</mark>     | String | Your Generated Access Token |
| API-Key<mark style="color:red;">\*</mark>       | String | Your API Key                |

{% tabs %}
{% tab title="200: OK " %}

```json
{
    "session_key": "XXX-ABCDE12345",
    "theme": "PRO",
    "active": true,
    "status": "IDLE",
    "redirect_url": "https://www.url-to-redirect-user-to.com",
    "inspect_started_at": null,
    "inspect_ended_at": null,
    "created_at": "2021-05-25T11:50:49.000000Z",
    "updated_at": "2021-05-25T11:50:49.000000Z",
    "language": "EN",
    "capture_url": "https://demoadmin.vehiclecapture.com/TCB-123...",
    "options": {
        "client_id": "SOUTH234889",
        "sms": {
            "to": "647-455-XXXX",
            "to_name": "Jane Smith",
            "from": "647-422-XXXX",
            "by": "Steve's Test Dealer",           
        }
    },
    "vehicle": {
        "vin": "JN1CV6AR9BMXXXXXX"
    }    
}
```

{% endtab %}

{% tab title="400: Bad Request " %}

```json
{
    "message": "Required fields are missing or invalid.",
    "errors": {
        "session.redirect_url": [
            "Invalid redirect url"
        ],
        "sms.to": [
            "Invalid phone number"
        ],
        "vehicle.vin": [
            "VIN is too short, it must be 17 characters"
        ]
    }
}
```

{% endtab %}
{% endtabs %}

#### Sample Request

```json
{
    "vehicle": {
        "vin":"JN1CV6AR9BMXXXXXX",
        "year":"2011",
        "make":"Infiniti",
        "model":"G37",
        "body_type":"Sedan",
        "trim":"Luxury",
        "transmission":"Automatic",
        "ext_col":"Malbec Black",
        "int_col":"Wheat",
        "odom_reading":330477,
        "odom_unit":"KILOMETRES"
    },
    "session": {
        "theme": "LITE",
        "redirect_url": "https://www.url-to-redirect-user-to.com",
        "client_id": "SOUTH234889"
    },
    "sms": {
        "to": "647-455-XXXX",
        "to_name": "Jane Smith",
        "from": "647-422-XXXX",
        "by": "Steve Test Dealer"
    }
}
```

{% hint style="info" %}
Please, read the [Create Session's document](https://docs.paveapi.com/integrations/developer-docs/sessions-1/post-create-new-session) for more information.
{% endhint %}

## Setting up for iOS

### Adding a URL scheme

Open up **your project** and go to **Targets** > **Info** > **URL Types** and add the following:

<figure><img src="/files/sGGH1zxvJa7hTStWhnUd" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Change **`com.discoveryloft.pavejs`** to **your project's identifier**
{% endhint %}

### Update AppDelegate.m

You'll need to add the following lines to your **`*AppDelegate.m`:**

```objectivec
// iOS 9.x or newer
#import <React/RCTLinkingManager.h>
- (BOOL)application:(UIApplication *)application   
  openURL:(NSURL *)url   
  options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{ 
 
return [RCTLinkingManager application:application openURL:url options:options];
}
```

If you're targeting iOS 8.x or older, you can use the following code instead:

```objectivec
// iOS 8.x or older
#import <React/RCTLinkingManager.h>
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url  
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{  
    return [RCTLinkingManager application:application openURL:url                      
            sourceApplication:sourceApplication annotation:annotation];
}
```

## Setting up for Android

### Add intent filters for incoming links

To create a link to your app content, add an intent filter that contains these elements and attribute values in your manifest:

```markup
 <application
        ...>

        <activity
            android:name=".MainActivity"
            android:label="MainActivity" >
            
             <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            
            <intent-filter android:label="PAVE Filter">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- Accepts URIs that begin with "pave://...” -->
                <data android:scheme="pave" />

            </intent-filter>
        </activity>

   </application>
```

[According to Google](https://developer.android.com/training/app-links/index.html#android-app-links), the **autoVerify** attribute “allows your app to designate itself as the default handler of a given type of link. So when the user clicks on an Android App Link, your app opens immediately if it's installed — the disambiguation dialog doesn't appear.”

## Handle URLs

There are two ways to handle URLs that open your app.

#### **1. If the app is already open, the app is foregrounded and a Linking 'url' event is fired**

You can handle these events with `Linking.addEventListener('url', callback)` - it calls `callback({ url })` with the linked URL

#### **2. If the app is not already open, it is opened and the url is passed in as the initialURL**

You can handle these events with `Linking.getInitialURL()` - it returns a Promise that resolves to the URL, if there is one.

## Example

{% code title="App.js" %}

```javascript
/* This is the example code */
import React, {useEffect, useState} from 'react';
import {Linking} from 'react-native';

import {View, Text} from 'react-native';

const App = () => {
  const [url, setUrl] = useState('');

  useEffect(() => {
    Linking.getInitialURL()
      .then(url => handleURL({url}))
      .catch(console.error);

    Linking.addEventListener('url', handleURL);
  }, []);

  function handleURL(event) {
   /***********************************/
   /* HANDLE THE URL IN THIS FUNCTION */
   /***********************************/
    setUrl(event.url);
    console.log('url ======> ' + event.url);
  }

  return (
    <View style={{justifyContent: 'center', flex: 1, alignItems: 'center'}}>
      <Text>PAVE DEEP LINK: {url}</Text>
    </View>
  );
};

export default App;
```

{% endcode %}

## Result

After **PAVE Capture** successfully and tap on **`CLOSE`** button, you will redirect to your app.

<div align="center"><figure><img src="/files/C7cut10R1ptxJZu8A2rf" alt=""><figcaption></figcaption></figure></div>

## Test

### iOS

You can try deeplinking into your app by firing up Safari in your simulator and enter URL in there (i.e. `pave://`).

<div align="center"><figure><img src="/files/Kl7EQwtqcjzAWi8Bxshr" alt=""><figcaption></figcaption></figure></div>

Or an even better way is to execute deeplinks from the command line while your simulator is running with this command here:

> `xcrun simctl openurl booted pave://`

### Android

Execute deeplinks from the command line while your simulator is running with this command here:

> adb shell am start -a android.intent.action.VIEW -d "pave:\\\\" ***\<your-app-package-name>***

***Source code example:***&#x20;

* [***https://github.com/DiscoveryLoft/PAVE-Deep-Link***](https://github.com/DiscoveryLoft/PAVE-Deep-Link)

***Reference Documents:***

* [***https://reactnative.dev/docs/linking#handling-deep-links***](https://reactnative.dev/docs/linking#handling-deep-links)
* [***https://developer.android.com/training/app-links/deep-linking***](https://developer.android.com/training/app-links/deep-linking)


# Deep Link Native App

Follow the steps to set up deep-linking for your app.

## Setting up for iOS

### 1. Adding a URL scheme

Open up **your project** and go to **Targets** > **Info** > **URL Types** and add the following:

<figure><img src="/files/jmWPNbHSOvEv5hlIRQdD" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Change **`com.discoveryloft.pavejs`** to **your project's identifier**
{% endhint %}

### 2. Define your deep links

We are going to support two deep links into the app:

* `pave://home`
* `pave://detail`

And we will represent the `host` part of the URL in an `enum`.

**DeepLink.swift**

```swift
import Foundation

enum DeepLink: String {
    case home
    case detail
}
```

### 3. Handle URLs

To handle the URL we need to go into our **`AppDelegate.swift`** and parse the incoming request, and convert it into a **`DeepLink`** that we can hand off to our **`MainViewController`** for processing.

**AppDelegate.swift**

```swift
 func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {  
        // Process the URL.
        guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true),
              let host = components.host else {
            print("Invalid URL")
            return false
        }
                
        print("components: \(components)")
        
        // Create the deep link
        guard let deeplink = DeepLink(rawValue: host) else {
            print("Deeplink not found: \(host)")
            return false
        }

        // Hand off to mainViewController
        mainViewController.handleDeepLink(deeplink)
        
        return true
    }
```

Once in the **`MainViewController`** with the deeplink we can do whatever we want. Here we just manually navigate to the view controller in the tab bar we want to present.

**MainViewController.swift**

```swift
// MARK: Deep Link

extension MainViewController {
    func handleDeepLink(_ deepLink: DeepLink) {
        switch deepLink {
            case .home:
                // handle show your app's home screen here
            case .detail:
                // handle show your app's detail screen here
            default:
                // handle the PAVE's Session ID here
        }
    }
}
```

### 4. Test

You can try deeplinking into your app by firing up Safari in your simulator and enter URL in there (i.e. `pave://home`).

<div align="center"><figure><img src="/files/tcxY8MbtZZTUuRKvv6bl" alt=""><figcaption></figcaption></figure></div>

Or an even better way is to execute deeplinks from the command line while your simulator is running with this command here:

> `xcrun simctl openurl booted pave://home`

## Setting up for Android

### 1. Add intent filters for incoming links <a href="#adding-filters" id="adding-filters"></a>

To create a link to your app content, add an intent filter that contains these elements and attribute values in your manifest:

```markup
 <application
        ...>

        <activity
            android:name=".MainActivity"
            android:label="MainActivity" >
            
             <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            
            <intent-filter android:label="PAVE Filter">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <!-- Accepts URIs that begin with "pave://...” -->
                <data android:scheme="pave" />

            </intent-filter>
        </activity>

   </application>
```

[According to Google](https://developer.android.com/training/app-links/index.html#android-app-links), the **autoVerify** attribute “allows your app to designate itself as the default handler of a given type of link. So when the user clicks on an Android App Link, your app opens immediately if it's installed — the disambiguation dialog doesn't appear.”

### 2. Read data from incoming intents <a href="#handling-intents" id="handling-intents"></a>

Here’s a snippet that shows how to retrieve data from an **`Intent`**:

{% tabs %}
{% tab title="Kotlin" %}

```kotlin
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)

    val appLinkAction: String? = intent?.action
    val appLinkData: Uri? = intent?.data
    
    if (Intent.ACTION_VIEW == appLinkAction && appLinkData != null) {
      val sessionId = appLinkData.getQueryParameter("sessionId")
      if (sessionId.isNullOrBlank().not()) {
        // handle the PAVE's Session ID here
      }
      
    }
}
```

{% endtab %}
{% endtabs %}


# Deep Linking with Shareable Links

A shareable link provides a convenient and code-free solution for generating new sessions within an account.  Each shareable link widget has a static URL and is configured to launch a session with a configured API-Key and account.  It also contains a redirect field that can be utilized for deep linking.

Details of the vehicle are decoded from a VIN that is retrieved during the photo capture process.

Shareable links are a widget type that is found/created under Settings > Widgets > Shareable Link within an account.

<figure><img src="/files/E50iZpeFX3VsVykT4Wqa" alt=""><figcaption></figcaption></figure>

When creating a new shareable link, you need to enter a widget name and select the API key you wish to use for the inspections. The deep link back to your native application should be entered in the "Redirect URL"

<figure><img src="/files/hmN6TsBkQoUTpgK5p2Vy" alt="" width="375"><figcaption></figcaption></figure>

Once created, the shareable link is accessed with the static URL in the widget dashboard and guides the user to create an inspection session by entering a phone number (first / last name optional).

Example: [https://dashboard.paveapi.com/widget/1315137f-37b6-4a8d-90f6-da6042](https://dashboard.paveapi.com/widget/1315137f-37b6-4a8d-90f6-da6042ae4f5d)XXXXX

<figure><img src="/files/5lktxjr0mGg47l6gtN8o" alt="" width="375"><figcaption></figcaption></figure>

Once the inspection is completed, the configured redirect within the shareable link widget will pass the user back to your native application.

PAVE uses webhooks to pass the session key and sessions details such as inspection status and vehicle details back to your platform during a session and/or after it is completed. You can configure webhooks for all status changes and with custom data payloads. Learn more about PAVE webhooks here: <https://docs.paveapi.com/integrations/developer-docs/callbacks>

Once you receive a webhook notification for "STATUS: Complete", full details of the completed session can be retrieved from the PAVE API via "Get Session"<https://docs.paveapi.com/integrations/developer-docs/sessions-1/retrieve-a-session-data>


# Pass-Through Additional User Information

How to Pass Additional User Information in PAVE API

The PAVE API allows you to pass additional information about specific users in the JSON results for a session. This is useful when you want to combine information from different sources in a single session, for example, from a lead form on a website to the results payload sent to your CRM.

### Separating Contact Name into First Name and Last Name

You can use the `contact` object within the session details to separate the contact name into two fields: `first_name` and `last_name`. If you are using the SMS method to send the capture link, you can keep the contact name separated into two fields instead of including the `to_name` in the `sms` object. The `contact` object is optional, but both fields are required if used.

### Adding Additional User Information

You can add any additional user information in the `reference` object in the session details. PAVE will include any fields you provide within the `reference` object in your results payload and will delete it a few hours after the session completes.

**IMPORTANT:** Do not include any sensitive information such as credit card or social security numbers in these fields. PAVE requires you to use methods such as Cloud Data Loss Prevention (DLP) to de-identify sensitive data in text content. De-identification is the process of removing identifying information from data by masking, deleting, encrypting, or obscuring it.

### Sample Request with Pass-Through Contact Information

Here is a sample request with pass-through contact information:

```json
{
  "session": {
    "theme": "LITE",
    "redirect_url": "https://www.url-to-redirect-user-to.com",
    "language": "EN",
    "client_id": "SOUTH234889",
    "contact": {
      "first_name": "required",
      "last_name": "required"
    },
    "reference": {
      "any_key": "any_value"
    }
  }
}
```

### Sample Result with Pass-Through Contact Information

Here is a sample result with pass-through contact information:

```json
{
  "session_key": "TOA-IGOLDCIBY3",
  "theme": "LITE",
  "active": true,
  "status": "IDLE",
  "redirect_url": "https://paveinspect.com/",
  "inspect_started_at": null,
  "inspect_ended_at": null,
  "created_at": "2021-08-17T13:49:16+00:00",
  "updated_at": "2021-08-17T13:49:16+00:00",
  "language": "EN",
  "options": {
    "client_id": "DLVNQC",
    "contact": {
      "first_name": "Luan",
      "last_name": "tran"
    },
    "reference": {
      "coupon_code": "TST-PAVE-00001",
      "coupon_value": 200
    },
    "sms": {
      "to": "+84966294497",
      "to_name": null,
      "from": "+849
```


# Tracking Your Sessions

&#x20;**Using Integration Source Types for Tracking Each Session**

PAVE's session information includes the **`source`** in the results to track each of your launch methods when utilizing PAVE in more than one type of integration in your different types of user journeys. In addition, the source provides three fields to help with your analytics for each of your sessions.

**`type`:** indicates what method the session originated from, which can be one of four;&#x20;

* **`api`:** - This is the source for any session generated using the POST Create Session method using one of your API keys.&#x20;
* **`dashboard`:** - This is any session that an account user sends when logged into their dashboard.&#x20;
* **`shareable_link`:** - This is any session generated using your shareable links created in your SETTINGS > WIDGETS.
* **`embedded_widget`:** - This is any session generated from your embedded widgets created in your SETTINGS > WIDGETS.

In **`properties`,** you will see **`api_name`:** - This is the name you gave the API key when you created it in your DEVELOPER > API KEYS.

* You will also see **`dashboard_username`** if the source type is a **`dashboard`** - this is the account username who sent the link.&#x20;
* And if the source type is either **`shareable_link`** or **`embedded_widget`,** you will instead see **`form_name`** in the results - this is the name you gave each of these when you created them in your SETTINGS > WIDGETS.

**Sample Response with Source Type**

```
"session": {
        "session_key": "TOA-QGMWRCHHGB",
        "theme": "LITE",
        "active": true,
        "status": "IDLE",
        "redirect_url": "https://paveinspect.com/",
        "inspect_started_at": null,
        "inspect_ended_at": null,
        "created_at": "2021-08-17T13:27:10+00:00",
        "updated_at": "2021-08-17T13:27:10+00:00",
        "language": "EN",
        "options": {
            "contact": {
                "first_name": "Luan",
                "last_name": "Tran"
            },
            "reference": {
   "coupon_code": "TST-PAVE-00001",
                "coupon_value": 200
            },
            "sms": {
                "to": "8882298552",
                "to_name": null,
                "from": "8882298552",
                "by": null
            }
        },
        "user_account": {
            "username": "DemoAdmin",
            "first_name": "Demo",
            "last_name": "Admin",
            "email": "someone@discoveryloft.com",
            "phone": null
        },
        "source": {
            "type": "dashboard",
            "properties": {
                "api_name": "TESTOA-12-8",
                "dashboard_username": "DemoAdmin"
            }
        },
        "vehicle": null
    },

```


# User Session Lifecycle

![PAVE Capture UI User Session Lifecycle](/files/-MbIZYH0cKHx8TQjb5_v)

Tracking the PAVE Capture UI session lifecycle is managed through monitoring steps of two processes. Session Status identifies how far along the session is. The Session Stage determines what stage of the photo capture process the User is.

### Session Status

| Status          | Description                                                                                                                                                                                                         |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`IDLE`**      | The session\_key was generated but there is no User activity                                                                                                                                                        |
| **`STARTED`**   | The User has opened the session and clicked GET STARTED                                                                                                                                                             |
| **`PROCESS`**   | The User has captured at least one photo                                                                                                                                                                            |
| **`QC_PASSED`** | The User has captured all photos and they passed the QC process                                                                                                                                                     |
| **`CONFIRM`**   | The session results are complete and waiting for the User to confirm                                                                                                                                                |
| **`COMPLETE`**  | The User confirmed the inspection results and closed the session                                                                                                                                                    |
| **`EXPIRED`**   | The session did not reach QC\_PASSED within the expiration timeframe configured for that API Key. [LEARN MORE](https://guides.pave.ai/branch-dashboard/user-feature-walkthrough/inspection-status/expired-sessions) |
| **`INVALID`**   | The session was marked as invalid during inspection processing due to the presence of a vehicle that didn't match the captured VIN or a photo that did not meet the requirements to complete the inspection.        |

### Session Stage

| User Capture Step | Photo Code | Photo Type   | Nullable                                       |
| ----------------- | ---------- | ------------ | ---------------------------------------------- |
| 1                 | **`1`**    | VIN          | default image URL provided if manually entered |
| 2                 | **`2`**    | Interior     | no                                             |
| 3                 | **`3`**    | Cluster      | default image URL provided if manually entered |
| 4                 | **`4`**    | Left         | yes, if all other needed images are captured   |
| 5                 | **`10`**   | Front\_Left  | yes, if all other needed images are captured   |
| 6                 | **`5`**    | Front        | yes, if all other needed images are captured   |
| 7                 | **`11`**   | Front\_Right | yes, if all other needed images are captured   |
| 8                 | **`7`**    | Right        | yes, if all other needed images are captured   |
| 9                 | **`12`**   | Rear\_Right  | yes, if all other needed images are captured   |
| 10                | **`8`**    | Rear         | yes, if all other needed images are captured   |
| 11                | **`13`**   | Rear\_Left   | yes, if all other needed images are captured   |
| 12                | **`9`**    | Windshield   | no                                             |
| 13                | **`6`**    | Tires        | no                                             |


# Developer Testing

Your account, when activated, allows you to start testing on any vehicle in your primary account's region.&#x20;

However, suppose members of your engineering team are outside your immediate market region. In that case, they will not be able to test PAVE using any VINs specific to their location as the vehicle information required will not be available. To accommodate this, we designated the following VINs to be used for any similar body style of vehicles anywhere in the world. Therefore, please start your session by capturing the included VINs in the initial step of the capture process.&#x20;

Also, you will not be able to use the SMS functionality outside your market as this is a specific service to each region initially set up to your account licenses.

<figure><img src="/files/YWmiJA62glQS64ZHSNKv" alt=""><figcaption></figcaption></figure>


# API details


# POST Resend SMS

Send a reminder SMS with the original capture URL to the session’s recipient (Lithia use case). Allowed once per session within 7 days.

### Endpoint

```
POST https://openapi.paveapi.com/v2/capture/sessions/{{session_key}}/resend
```

Replace `session_key` with the unique key for the existing session to trigger an SMS resend.

### Path Parameters

| Name         | Type   | Description                                 |
| ------------ | ------ | ------------------------------------------- |
| session\_key | string | Unique session key (e.g., `TOA-XYCBCSR6DD`) |

### Header

| Name             | Type   | Description        |
| ---------------- | ------ | ------------------ |
| API-Access-Token | string | Your API key       |
| Content-Type     | string | `application/json` |

### Request Body (Optional)

```json
{
  "phone": "+84989137086"
}
```

| Field | Type   | Description                                                                |
| ----- | ------ | -------------------------------------------------------------------------- |
| phone | string | Override destination number. If omitted, PAVE uses the original recipient. |

**Business Rules**

* Session must exist and belong to your API key.
* Session cannot resend if status is QC\_PASSED, CONFIRM, COMPLETE, or EXPIRED ( Valid statuses for resend: PEDING, IN\_PROGRESS, SUBMITTED )
* Session age ≤ **7 days**
* Original SMS must have been logged as **delivered** (legacy sessions allowed during grace period).
* **One** resend per session.
* Subject to rate limiting.
* All attempts are audit-logged.

**Sample Request**

```bash
curl --location --request POST 'https://openapi.paveapi.com/v2/capture/sessions/TOA-XYCBCSR6DD/resend' \
  --header 'API-Access-Token: <your-token>' \
  --header 'Content-Type: application/json'
```

**Sample Request (with custom phone)**

```bash
curl --location --request POST 'https://openapi.paveapi.com/v2/capture/sessions/TOA-XYCBCSR6DD/resend' \
  --header 'API-Access-Token: <your-token>' \
  --header 'Content-Type: application/json' \
  --data-raw '{ "phone": "+84989137086" }'
```

**Sample Response (200: Ok)**

```json
{
  "status": "success",
  "message": "SMS resend has been processed",
  "session_key": "TOA-XYCBCSR6DD",
  "phone": "+18005550123",
  "session_age_days": 2,
  "days_remaining": 5
}
```

**Sample Response (404: Not Found)**

```json
{
  "status": "error",
  "message": "Session not found",
  "session_key": "TOA-INVALID"
}
```

**Sample Response (400: Finalized)**

```json
{
  "status": "error",
  "message": "Session is already finalized and cannot be resent",
  "session_key": "TOA-XYCBCSR6DD",
  "session_status": "QC_PASSED"
}
```

**Sample Response (400: Expired)**

```json
{
  "status": "error",
  "message": "Session has expired (older than 7 days)",
  "session_key": "TOA-XYCBCSR6DD",
  "age_days": 9,
  "max_days": 7
}
```

**Sample Response (400: Already Resent)**

```json
{
  "status": "error",
  "message": "SMS resend already attempted for this session",
  "session_key": "TOA-XYCBCSR6DD",
  "previous_resend_at": "2025-09-08T10:00:00Z",
  "total_attempts": 2
}
```

**Notes**

* “delivered” indicates the SMS was accepted by the provider (not handset confirmation).
* For sessions created before SMS logging, resend may pass during a limited grace period.


# Account Optional Add-ons


# Capture Only Theme (CAPT)

PAVE's Capture theme called CAPT enables a simple photo capture flow and a resulting CR for use cases that only require photo capture and not a full inspection.

### Overview

PAVE offers an add-on theme called CAPT that enables image capture only and generates a CR, without a PAVE inspection being processed for that session.&#x20;

### Setting up the CAPT theme

**Step 1- Request CAPT License**: Please request a CAPT-specific licence code from your PAVE customer support or product team representative to get started. A CAPT license is first configured on PAVE's end and then handed over to the client for further setup at an API Key level.

**Step 2-**  **Set up a CAPT-specific API Key:** Create an API Key, and select CAPT as the 'Default Theme'.

**Step 3- Select the Capture Flow**: Click the vehicle view(s) to select and customize the capture photos to be added to the Capture Flow. The images selected here will show up on the Capture process on the UI.

**Step 4- Select 'Allow Skippable' (Optional):** The 'Allow Skippable' function lets the user skip photos on the Capture UI, if required. Read more about the 'Allow Skippable' feature here&#x20;

&#x20;

<figure><img src="/files/OYRwCwsbdu6GwUlKRVDd" alt=""><figcaption><p>PAVE CAPT Theme - Setting Up A CAPT API Key</p></figcaption></figure>

| Setting                | Description                                                                                                                                         |
| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| Default Theme          | Select 'CAPT' for Capture Only Theme                                                                                                                |
| Customize Capture Flow | Click each view to select the photos that you want to include in the Capture Flow. Only the selected views will show on the Capture Flow            |
| Allow Skippable        | Once Toggled ON, you can skip any image during the capture flow if required. **Note**: A minimum of one picture is required to complete the session |

{% hint style="info" %}
**Note**: CAPT sessions include Image QC but no damage detection. ie. images are accepted or rejected on the basis of correctness of view, but there is no damage detection done for these sessions.
{% endhint %}


# Skip Pictures

Introducing the ability to skip a photo during inspection, if required                        (Available for PAVE CAPT theme only)

The new 'Skip Photo' feature allows the PAVE inspectors using the CAPT theme, the ability to skip one or more images during an inspection if the need so arises, and still complete an inspection and produce a condition report with the remaining images.

**Steps Involved**

Step 1: Set up a new [API Key ](broken://pages/bXlr6VQBbX5aAkWxHJqT)for CAPT (or use an existing CAPT theme API Key)

As this feature is only available for CAPT theme users, it will only apply to inspections done on an API key with the default theme set as CAPT. Therefore, first set up a new CAPT themed key or ensure an exiting CAPT themed key is used to start the inspection.&#x20;

Toggle ON the 'ALLOW SKIPPABLE' button to turn ON this feature. \
Similarly, toggle OFF the 'ALLOW SKIPPABLE' button to turn OFF this feature, if required in future.

<figure><img src="/files/XO5QHLJ3bbPNrNcDI6sy" alt=""><figcaption><p>Setting up the Skip Photo feature</p></figcaption></figure>

{% hint style="info" %}
This feature is optional and can be enabled by toggling ON the 'ALLOW SKIPPABLE' option
{% endhint %}

Step 2: 'Skip Picture' feature on the Capture Screen

Once an inspection is sent from a CAPT themed Key is started, the inspector will notice an option (icon is highlighted in yellow) to skip that photo

<figure><img src="/files/XPzEArl8XKo0BsvjG2jR" alt=""><figcaption><p>Click the 'Skip Photo' icon highlighted in Yellow</p></figcaption></figure>

When the 'Skip Photo' icon is selected, it presents a confirmation screen as shown below

<figure><img src="/files/LGFif4EXbg3wMwRmALt1" alt=""><figcaption><p>Click Confirm to Skip the Photo</p></figcaption></figure>

Selecting **'Confirm'** skips that photo and moves to the next photo to be capture, or ends the session in case this was the last image to be captured.&#x20;

Selecting **'Back'** closes the 'Confirm' screen and takes you back to the capture screen for this photo again.

{% hint style="info" %}
NOTE: At least one image is required to be captured
{% endhint %}

In case all capture images have been skipped , then the Capture UI will **not allow** the last image to be skipped too. This is done to prevent a blank condition report to be generated. \
\
The following prompt will be displayed on the last image if all prior images were skipped:

<figure><img src="/files/xYc0dZ18xeKA5lV8OxFI" alt=""><figcaption><p>At least one image is required to be Inspected</p></figcaption></figure>


# Right-Hand-Drive Capture Flow

PAVE's capture flow can also be configured for Right Hand Vehicles. Please contact your PAVE support manager for further details and a demo.&#x20;


# Your Guide to PAVE's Account and Enterprise Dashboards

Please refer PAVE's Account and Enterprise Dashboards guides [here](https://guides.pave.ai/)


# PAVE Hotspots API

Automate Damage Hotspots for 360˚-Vehicle Spins

<figure><img src="/files/pkLK0M6sQb2hmmYJrQzk" alt=""><figcaption></figcaption></figure>

Experience the ultimate in precision and transparency with PAVE Hotspots - the premier automated vehicle condition analysis service. Our cutting-edge platform empowers 360-vehicle spin providers to effortlessly submit their photos for expert analysis, generating comprehensive condition reports that pinpoint the exact location of any defects found.&#x20;

Utilizing advanced x and y percentage-based coordinate systems, PAVE Hotspots gives you the ability to automatically generate hotspots with damage details and links to cropped images, giving website visitors a crystal-clear understanding of every vehicle's condition.&#x20;

#### PAVE Hotspots Percentage-Based Coordinates System

PAVE Hotspots offers a cutting-edge solution for detecting damage with precision and ease to be included in any 360 vehicle spins. Our JSON object includes a position field that pinpoints the exact location of each damage found using a percentage-based coordinate system. The "x" value represents the damage's distance from the left edge of the image, while the "y" value represents the distance from the top edge. Plus, with each damage, you'll receive all the necessary information and a cropped photo to give you a clear visual of the hotspot.

<figure><img src="/files/T0ch5eeRVgCY1Kxk25Qx" alt=""><figcaption></figcaption></figure>

#### Integration Flow for Hotspots&#x20;

<figure><img src="/files/xVwmPY4qSrw3V6zXVEcq" alt=""><figcaption><p>Hotspots Flow</p></figcaption></figure>

1. First, 360-Spin Providers receive vehicle captures (images) from their client.
2. Then, the 360-Spin Providers submit select photos of this set to PAVE via an API call.
3. PAVE then inspects these select images for damages.
4. Lastly, the damage assessment report, damage co-ordinates, and cropped photos of the damages (URL) are sent back to the 360-Spin Provider through a Webhook or an API call made directly to PAVE's Hotspots API\ <br>


# Activating PAVE Hotspots

Activate PAVE Hotspots directly from the Dashboard with ease

### Activating Hotspots

Hotspots can be activated at an [API Key ](broken://pages/bXlr6VQBbX5aAkWxHJqT)level from the client dashboard.&#x20;

For an existing or new API Key, simply toggle ON the feature as shown below, to activate Hotspots

<figure><img src="/files/KOwpQN3IkMoMJfvN7ufl" alt=""><figcaption><p>Activating Hotspots</p></figcaption></figure>


# Developer Docs


# Authentication

The PAVE API requires authentication for all API calls, which is achieved through the use of an HMAC-SHA256 message hash as a header within the request.

### Introduction

This section provides the details on how to use the `curl` command to access the PAVE OpenAPI sessions endpoint using `API-Key`, `API-Token`, and `API-Timestamp` headers. The `API-Key` and `API-Token` are used for authentication purposes, and the `API-Timestamp` is used for ensuring the freshness of the request.

### Endpoint

```bash
https://openapi.paveapi.com/v1/sessions
```

### HMAC-SHA256

HMAC (Keyed-Hash Message Authentication Code) is a cryptographic technique that calculates a message authentication code by combining a cryptographic hash function with a secret key. In the case of the PAVE Capture API, the cryptographic hash function used is SHA256, resulting in the algorithm known as HMAC-SHA256.

### Prerequisites

* A valid API Key and API Token should be obtained before accessing the API endpoint.
* `curl` must be installed on your system.

### Steps to Use curl

1. Open a terminal or command prompt.
2. Use the following `curl` command to access the API endpoint:

```bash
curl -H "API-Key: <Your_API_Key>" \
     -H "API-Token: <Your_Generated_Access_Token>" \
     -H "API-Timestamp: <UTC_Datetime_String>" \
     https://openapi.paveapi.com/v1/sessions
```

3. Replace `<Your_API_Key>` with your API Key.
4. Replace `<Your_Generated_Access_Token>` with your API Token.
5. Replace `<UTC_Datetime_String>` with the UTC datetime in the format `YYYY-MM-DDTHH:MM:SSZ`. For example, `2023-02-11T12:00:00Z`.
6. Execute the `curl` command.
7. The API endpoint will return a JSON object containing the session data.

### Headers

The following headers are required for each API request:

| Header Name     | Description                                                                         |
| --------------- | ----------------------------------------------------------------------------------- |
| `API-Key`       | Your API Key, which is used to identify your account and provide access to the API. |
| `API-Token`     | A generated access token, which is used to authenticate your API request.           |
| `API-Timestamp` | The UTC datetime string, which is used to verify the freshness of your request.     |

### Note

* Make sure to replace the placeholders with the actual values before executing the `curl` command.
* Ensure that the UTC datetime string in the `API-Timestamp` header is accurate and up-to-date, as it is used for ensuring the freshness of the request.
* `API-Token`: will expire within 5 minutes.

### Response

If the request is successful, the API server will return a JSON object that contains the session information, including the session ID, expiration time, and the associated API Key and access token.

Example response:

```json
{
  "session_id": "f8f4e4c1-6416-4d4a-8b16-f15a4e4a1c2d",
  "expiration": "2023-02-11T12:00:00Z",
  "api_key": "abcd1234",
  "api_token": "efgh5678"
}
```

### Error Responses

If there is an error with the request, the API server will return a JSON object with an error message. Some possible error messages include:

* `Invalid API Key`: The provided API Key is invalid or does not match any existing accounts.
* `Invalid API Token`: The provided access token is invalid or has expired.
* `Invalid API Timestamp`: The provided UTC datetime string is invalid or the request is stale.

Example error response: **`403 Forbidden`**&#x20;

```json
 {
  "message": "Unable to validate the request, please recheck your API-Key and API-Token."
}
```

### Here are examples of how to make this API request using different programming languages:

#### JavaScript

```javascript
const axios = require('axios');

const apiKey = '<Your_API_Key>';
const apiToken = '<Your_Generated_Access_Token>';
const apiTimestamp = '<UTC_Datetime_String>';

axios({
  method: 'post',
  url: 'https://openapi.paveapi.com/v1/sessions',
  headers: {
    'API-Key': apiKey,
    'API-Token': apiToken,
    'API-Timestamp': apiTimestamp
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error.response.data);
  });
```

#### Python

```python
import requests

api_key = '<Your_API_Key>'
api_token = '<Your_Generated_Access_Token>'
api_timestamp = '<UTC_Datetime_String>'

headers = {
    'API-Key': api_key,
    'API-Token': api_token,
    'API-Timestamp': api_timestamp
}

response = requests.post(
    'https://openapi.paveapi.com/v1/sessions',
    headers=headers
)

if response.status_code == 200:
    print(response.json())
else:
    print(response.json()['error'])
```

#### Go

```go
package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"net/http"
)

const apiKey = "<Your_API_Key>"
const apiToken = "<Your_Generated_Access_Token>"
const apiTimestamp = "<UTC_Datetime_String>"

func main() {
	url := "https://openapi.paveapi.com/v1/sessions"

	client := &http.Client{}
	req, err := http.NewRequest("POST", url, nil)
	if err != nil {
		fmt.Println(err)
		return
	}

	req.Header.Set("API-Key", apiKey)
	req.Header.Set("API-Token", apiToken)
	req.Header.Set("API-Timestamp", apiTimestamp)

	resp, err := client.Do(req)
	if err != nil {
		fmt.Println(err)
		return
	}

	defer resp.Body.Close()

	var result map[string]interface{}
	json.NewDecoder(resp.Body).Decode(&result)

	fmt.Println(result)
}
```

#### Swift

```swift
import Foundation

let apiKey = "your_api_key"
let apiToken = "your_generated_access_token"
let url = URL(string: "https://openapi.paveapi.com/v1/sessions")!
let timestamp = DateFormatter().string(from: Date())

var request = URLRequest(url: url)
request.addValue(apiKey, forHTTPHeaderField: "API-Key")
request.addValue(apiToken, forHTTPHeaderField: "API-Token")
request.addValue(timestamp, forHTTPHeaderField: "API-Timestamp")

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data, let response = response as? HTTPURLResponse, error == nil else {
        print("Error: \(error?.localizedDescription ?? "Unknown error")")
        return
    }

    if response.statusCode == 200 {
        print(String(data: data, encoding: .utf8) ?? "Empty response")
    } else {
        print("Unexpected response code: \(response.statusCode)")
        print(String(data: data, encoding: .utf8) ?? "Empty response")
    }
}
task.resume()

```

#### Kotlin

```kotlin
import java.net.URL
import javax.net.ssl.HttpsURLConnection

fun main() {
    val apiKey = "<Your_API_Key>"
    val apiToken = "<Your_Generated_Access_Token>"
    val apiTimestamp = "<UTC_Datetime_String>"

    val url = URL("https://openapi.paveapi.com/v1/sessions")

    with(url.openConnection() as HttpsURLConnection) {
        requestMethod = "POST"
        setRequestProperty("API-Key", apiKey)
        setRequestProperty("API-Token", apiToken)
        setRequestProperty("API-Timestamp", apiTimestamp)

        inputStream.bufferedReader().use {
            val response = it.readText()
            println(response)
        }
    }
}
```


# Generate Access Token

Implementation Examples of Access Token Generation in Various Programming Languages

Create access token by using [**`HMAC-SHA256`**](https://en.wikipedia.org/wiki/HMAC)

An access token can be generated by combining the api\_key and timestamp string with the provided api\_secret.

| Attribute        | Description                                        |
| ---------------- | -------------------------------------------------- |
| **`api_key`**    | Get it from your PAVE Developer dashboard          |
| **`api_secret`** | Get it from your PAVE Developer dashboard          |
| **`timestamp`**  | UTC Datetime string, example: 2021-05-30T12:49:19Z |

### Examples in Different Languages:

{% tabs %}
{% tab title="PHP" %}

```php
$token = hash_hmac('sha256', '<username>:<api_key>@<timestamp>', '<api_secret');
// https://www.php.net/manual/en/function.hash-hmac.php
```

{% endtab %}

{% tab title="Javascript" %}

```javascript
const crypto = require('crypto');

const apiKey = 'your_api_key';
const apiSecret = 'your_api_secret';
const username = 'your_username';
const timestamp = Math.floor(Date.now() / 1000); // current Unix timestamp in seconds

const message = `${username}:${apiKey}@${timestamp}`;
const accessToken = crypto.createHmac('sha256', apiSecret).update(message).digest('hex');
```

{% endtab %}

{% tab title="Python" %}

```python
import hashlib
import hmac
import time

api_key = 'your_api_key'
api_secret = 'your_api_secret'
username = 'your_username'
timestamp = str(int(time.time())) # current Unix timestamp in seconds

message = f'{username}:{api_key}@{timestamp}'
access_token = hmac.new(api_secret.encode('utf-8'), msg=message.encode('utf-8'), digestmod=hashlib.sha256).hexdigest()
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
	"time"
)

func main() {
	apiKey := "your_api_key"
	apiSecret := "your_api_secret"
	username := "your_username"
	timestamp := time.Now().Unix()

	message := fmt.Sprintf("%s:%s@%d", username, apiKey, timestamp)
	hmac := hmac.New(sha256.New, []byte(apiSecret))
	hmac.Write([]byte(message))
	access_token := hex.EncodeToString(hmac.Sum(nil))

	fmt.Println(signature) // prints the HMAC-SHA256 signature
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
import CommonCrypto
import Foundation

func hmacSha256(message: String, key: String) -> String {
    let messageData = message.data(using: .utf8)!
    let keyData = key.data(using: .utf8)!
    var hmacData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))

    hmacData.withUnsafeMutableBytes { hmacPtr in
        CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), (keyData as NSData).bytes, keyData.count, (messageData as NSData).bytes, messageData.count, hmacPtr)
    }

    return hmacData.map { String(format: "%02hhx", $0) }.joined()
}

let apiKey = "your_api_key"
let apiSecret = "your_api_secret"
let username = "your_username"
let timestamp = String(Int(Date().timeIntervalSince1970))

let message = "\(username):\(apiKey)@\(timestamp)"
let accessToken = hmacSha256(message: message, key: apiSecret)
```

{% endtab %}

{% tab title="Kotlin" %}

```kotlin
import java.nio.charset.StandardCharsets
import java.security.Key
import java.security.MessageDigest
import javax.crypto.Mac
import javax.crypto.spec.SecretKeySpec

fun main() {
    val apiKey = "your_api_key"
    val apiSecret = "your_api_secret"
    val username = "your_username"
    val timestamp = (System.currentTimeMillis() / 1000).toString()

    val message = "$username:$apiKey@$timestamp"
    val accessToken = hmacSha256(message, apiSecret)    
}

fun hmacSha256(message: String, key: String): String {
    val secretKey = SecretKeySpec(key.toByteArray(StandardCharsets.UTF_8), "HmacSHA256")
    val mac = Mac.getInstance("HmacSHA256")
    mac.init(secretKey)
    val hmac = mac.doFinal(message.toByteArray(StandardCharsets.UTF_8))
    return bytesToHex(hmac)
}

fun bytesToHex(bytes: ByteArray): String {
    return bytes.joinToString("") { "%02x".format(it) }
}
```

{% endtab %}
{% endtabs %}

{% hint style="info" %}
To generate the correct token, please make sure the combination string you are using with the 1) api\_key, 2) timestamp and 3) api\_secret are arranged in this order.
{% endhint %}

{% hint style="info" %}
To generate the correct token, please ensure your timestamp is using UTC Datetime. And use the matching timestamp to the one included in your header when generating your token.
{% endhint %}

{% hint style="info" %}
Replace&#x20;

```php
<username>
```

&#x20;with the primary account name that your representative initially provided. Do not set this as one of the user names you created in your dashboard.
{% endhint %}


# Sessions


# POST Create Session

Create a new session for every User by generating a session\_key.

### Endpoint

```
POST https://openapi.paveapi.com/v1/sessions 
```

#### Headers

```makefile
Accept: application/json
Content-type: application/json
API-Key: Your_API_Key
API-Token: Your_Generated_Access_Token
API-Timestamp: UTC Datetime
```

| Headers       | Description                                                                                                           | Example                                   |
| ------------- | --------------------------------------------------------------------------------------------------------------------- | ----------------------------------------- |
| Accept        | Specifies the format in which the response should be returned. In this case, the response should be returned in JSON. | Accept: application/json                  |
| Content-type  | Specifies the format in which the request body should be sent. In this case, the request body should be sent in JSON. | Content-type: application/json            |
| API-Key       | The API Key for authentication.                                                                                       | API-Key: Your\_API\_Key                   |
| API-Token     | The Access Token generated for the API Key for authentication.                                                        | API-Token: Your\_Generated\_Access\_Token |
| API-Timestamp | The UTC Timestamp when the request was made.                                                                          | API-Timestamp: UTC Datetime               |

### Create New Session

To create a new session, post your related information to the PAVE endpoint to generate a **`session_key`**. A **`session_key`** is a unique identifier for each user that is used to create one-time-use links. The user can return to their link at any time to continue their session.

Providing a PAVE Capture Link to the user is a three-step process:

1. Use the POST Create Session endpoint to obtain a session\_key.
2. Add the session\_key to the PAVE Capture URL to create a unique link for the user.
3. Provide the user with the link.

####

#### **Sample** Request&#x20;

```
curl -H "Accept: application/json" \
     -H "Content-type: application/json" \
     -H "API-Key: Your_API_Key" \
     -H "API-Token: Your_Generated_Access_Token" \
     -H "API-Timestamp: UTC Datetime string, example: 2021-05-30T12:49:19Z" \
     -d '{
            "vehicle": {
                "vin":"JN1CV6AR9BMXXXXXX"
            }
        }' \
     -X POST https://openapi.paveapi.com/v1/session
```

### The following are the attributes of the Vehicle Object:

The attributes of the Vehicle Object serve two purposes: they allow you to skip the step of capturing the VIN for your end-user and provide PAVE with information about the vehicle that will be used in the session results. These attributes are represented as key/value pairs in a JSON format, where each attribute is given a name and corresponding value

| Attribute     | Data Type | Description                                                                       | Primary/Optional               |
| ------------- | --------- | --------------------------------------------------------------------------------- | ------------------------------ |
| vin           | string    | The unique identifier of the vehicle, represented as 17 characters                | Primary if skipping VIN decode |
| year          | numeric   | The model year of the vehicle                                                     | Primary if skipping VIN decode |
| make          | string    | The manufacturer of the vehicle                                                   | Primary if skipping VIN decode |
| model         | string    | The model of the vehicle                                                          | Primary if skipping VIN decode |
| body\_type    | string    | The type of body of the vehicle, such as sedan, SUV, etc.                         | Primary if skipping VIN decode |
| trim          | string    | The level of trim or features of the vehicle                                      | Optional                       |
| transmission  | string    | The type of transmission in the vehicle                                           | Optional                       |
| ext\_col      | string    | The color of the exterior of the vehicle                                          | Optional                       |
| int\_col      | string    | The color of the interior of the vehicle                                          | Optional                       |
| odom\_reading | numeric   | The odometer reading of the vehicle                                               | Optional                       |
| odom\_unit    | string    | The unit of measurement for the odometer reading, such as "KILOMETRES" or "MILES" | Optional                       |

{% code title="vehicle.json" %}

```json
"vehicle": {
                "vin":"JN1CV6AR9BMXXXXXX",
                "year":"2011",
                "make":"Infiniti",
                "model":"G37",
                "body_type":"Sedan",
                "trim":"Luxury",
                "transmission":"Automatic",
                "ext_col":"Malbec Black",
                "int_col":"Wheat",
                "odom_reading":330477,
                "odom_unit":"KILOMETRES"
}
```

{% endcode %}

### The following are the attributes of the SMS Object:

The SMS Object contains the information required to send notifications via SMS in a session. This information is stored as named key/value pairs in a straightforward JSON format, providing a convenient optional way for the end-user to receive their capture link. The following are the attributes of the SMS Object:

| Attribute                     | Description                                                                                                                                          | Optional                                                                                                                  |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
| to                            | The mobile number of the recipient to receive the PAVE Capture link as an SMS message.                                                               | Yes - if no "To" is provided, the "From" will get an SMS notification when the session only reaches the COMPLETE: STATUS. |
| to\_name                      | The contact name of the individual who will receive the SMS message.                                                                                 | Yes                                                                                                                       |
| from                          | The mobile number of an individual on your team who will receive the PAVE inspection results as a link by SMS when the User completes their capture. | Yes                                                                                                                       |
| by                            | The name used in the message sent to the User to indicate where the link was generated from.                                                         | Yes                                                                                                                       |
| send\_results\_to\_phototaker | Send the inspection result link to the person conducting the inspection                                                                              | Yes                                                                                                                       |

{% code title="sms.json" %}

```json
"sms": {
    "to": "647-455-XXXX",
    "to_name": "Jane Smith",
    "from": "647-422-XXXX",
    "by": "Steve's Test Dealer"
    "send_results_to_phototaker": "false"
}
```

{% endcode %}

### The following are the attributes of the Options Object:

The `options` object contains optional attributes that can be passed to customize the PAVE experience for each user. The object has the following properties:

| Property    | Description                                                   | Type   | Optional |
| ----------- | ------------------------------------------------------------- | ------ | -------- |
| client\_id  | A string that represents the client's identifier              | string | Yes      |
| contact     | An object that holds information about the user's contact     | object | Yes      |
| first\_name | A string that represents the first name of the user's contact | string | Yes      |
| last\_name  | A string that represents the last name of the user's contact  | string | Yes      |

### Example

```json
"options": {
    "client_id": "DLVNQC",
    "contact": {
      "first_name": "Luan",
      "last_name": "tran"
    }
}
```

### Need to Pass-Through Additional User or Session Information?&#x20;

The PAVE API allows you to pass additional information about specific users in the JSON results for a session. This is useful when you want to combine information from different sources in a single session, for example, from a lead form on a website to the results payload sent to your CRM.

Visit this section for more information:

{% content-ref url="/pages/-MhJMYmAnxmnb\_XiRrfr" %}
[Pass-Through Additional User Information](/integrations/developer-docs/pass-through-additional-user-information)
{% endcontent-ref %}

## Authentication

{% hint style="warning" %}
The PAVE Capture API requires authentication for all API calls, which is achieved through the use of an HMAC-SHA256 message hash as a header within the request.
{% endhint %}

Please read the [Authentication](/integrations/developer-docs/authentication) section to learn more:

{% content-ref url="/pages/-Mar28zApS\_Z-NIG2MhS" %}
[Authentication](/integrations/developer-docs/authentication)
{% endcontent-ref %}

## POST Create Session Response with Capture Link

This section describes the response format for the POST request to create a session for a vehicle inspection, which includes the capture link to provide to the end-user. The response is in JSON format and contains the following fields:

### Response Fields

| Property             | Description                                                                                                                                                                             | Type    | Optional |
| -------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------- |
| theme                | The theme of the vehicle inspection session. This field is optional and defaults to "LITE" if not provided.                                                                             | string  | Yes      |
| active               | A boolean value that indicates whether the session is active or not. This field is required and must be set to true.                                                                    | boolean | No       |
| status               | The status of the session. This field is optional and defaults to "IDLE" if not provided.                                                                                               | string  | Yes      |
| options              | An optional field that can be used to provide additional options for the session.                                                                                                       | null    | Yes      |
| language             | The language of the session. This field is optional and defaults to "en" (English) if not provided.                                                                                     | string  | Yes      |
| created\_at          | The date and time when the session was created in ISO 8601 format.                                                                                                                      | string  | No       |
| updated\_at          | The date and time when the session was last updated in ISO 8601 format.                                                                                                                 | string  | Yes      |
| capture\_url         | The capture link should be provided to the end user for starting the vehicle inspection. The URL is now branded to your account consisting of the account username and the session key. | string  | No       |
| session\_key         | A unique key that identifies the vehicle inspection session.                                                                                                                            | string  | No       |
| redirect\_url        | The URL the end-user will be redirected to after the vehicle inspection.                                                                                                                | string  | Yes      |
| inspect\_ended\_at   | An optional field that can specify the date and time when the vehicle inspection ended in ISO 8601 format.                                                                              | Null    | Yes      |
| inspect\_started\_at | An optional field that can specify the date and time when the vehicle inspection started in ISO 8601 format.                                                                            | Null    | Yes      |

### Example Response

Here is an example response for the POST request to create a vehicle inspection session with the capture link included:

#### **Sample** Response (201:Ok)

```
{
    "session_key": "XXX-ABCDE12345",
    "theme": "PRO",
    "active": true,
    "status": "IDLE",
    "redirect_url": "https://www.url-to-redirect-user-to.com",
    "inspect_started_at": null,
    "inspect_ended_at": null,
    "created_at": "2021-05-25T11:50:49.000000Z",
    "updated_at": "2021-05-25T11:50:49.000000Z",
    "language": "EN",
    "capture_url": "https://demoadmin.vehiclecapture.com/TCB-123...",
    "options": {
        "client_id": "SOUTH234889",
        "sms": {
            "to": "647-455-XXXX",
            "to_name": "Jane Smith",
            "from": "647-422-XXXX",
            "by": "Steve's Test Dealer",           
        }
    },
    "vehicle": {
        "vin": "JN1CV6AR9BMXXXXXX"
    }    
}
```

The "capture\_url" field contains the capture link that should be provided to the end user for starting the vehicle inspection. The "session\_key" field contains a unique key identifying the vehicle inspection session. The end-user will be redirected to the "redirect\_url" after completing the vehicle inspection.

#### **Sample** Response (400:Bad Request)

```
{
    "message": "Required fields are missing or invalid.",
    "errors": {
        "session.redirect_url": [
            "Invalid redirect url"
        ],
        "sms.to": [
            "Invalid phone number"
        ],
        "vehicle.vin": [
            "VIN is too short, it must be 17 characters"
        ]
    }
}
```


# POST Upload Photos

Upload Vehicle Photos to the Hotspots API

### Endpoint

```
POST https://openapi.paveapi.com/v1/hotspots/:session_key/photos-url
```

#### Headers

```makefile
API-Key: Your_API_Key
```

| Headers | Description                     | Example                              |
| ------- | ------------------------------- | ------------------------------------ |
| API-Key | The API Key for authentication. | 09bc91b9-76e5-4256-8e4g-7a41c1408014 |

#### Params

```makefile
session_key: Your_Session_Key
```

| Params       | Description        | Example        |
| ------------ | ------------------ | -------------- |
| session\_key | The Session ID Key | UCB-C3NPR4AGQZ |

#### **Sample** Request  &#x20;

````
{
    "photos": [
        {
            "photo_label": "VIN",
            "url": "https://i.ibb.co/b67cPzx/UDB-MPG1-GV1-IZO-01-GFE.jpg"
        },
        {
            "photo_label": "Interior",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_02_X7W.jpg"
        },
        {
            "photo_label": "Cluster",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_03_KSR.jpg"
        },
        {
            "photo_label": "Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_04_TVL.jpg"
        },
        {
            "photo_label": "Front",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_05_IC5.jpg"
        },
        {
            "photo_label": "Tires",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_06_VI9.jpg"
        },
        {
            "photo_label": "Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_07_R0Q.jpg"
        },
        {
            "photo_label": "Rear",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_08_U9T.jpg"
        },
        {
            "photo_label": "Windshield",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_09_GRA.jpg"
        },
        {
            "photo_label": "Front_Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_10_WQM.jpg"
        },
        {
            "photo_label": "Front_Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_11_6NG.jpg"
        },
        {
            "photo_label": "Rear_Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_12_FO3.jpg"
        },
        {
            "photo_label": "Rear_Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_13_VSB.jpg"
        }
    ]
}
```
````

#### **Sample** Confirmation Response (200 OK)

{% code title="" %}

```
{
    "data": [
        {
            "photo_label": "VIN",
            "url": "https://i.ibb.co/b67cPzx/UDB-MPG1-GV1-IZO-01-GFE.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Interior",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_02_X7W.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Cluster",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_03_KSR.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_04_TVL.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Front",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_05_IC5.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Tires",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_06_VI9.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_07_R0Q.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Rear",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_08_U9T.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Windshield",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_09_GRA.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Front_Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_10_WQM.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Front_Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_11_6NG.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Rear_Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_12_FO3.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        },
        {
            "photo_label": "Rear_Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_13_VSB.jpg",
            "success": true,
            "message": "Photo URL has been successfully submitted."
        }
    ]
}
```

{% endcode %}

#### **Sample** Response when the images have already been submitted

{% code title="" %}

```
{
    "data": [
        {
            "photo_label": "VIN",
            "url": "https://i.ibb.co/b67cPzx/UDB-MPG1-GV1-IZO-01-GFE.jpg",
            "success": false,
            "message": "Photo has been successfully processed and cannot be updated."
        },
        {
            "photo_label": "Interior",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_02_X7W.jpg",
            "success": false,
            "message": "Photo has been successfully processed and cannot be updated."
        },
        {
            "photo_label": "Cluster",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_03_KSR.jpg",
            "success": false,
            "message": "Photo has been successfully processed and cannot be updated."
        },
        {
            "photo_label": "Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_04_TVL.jpg",
            "success": false,
            "message": "Photo has been successfully processed and cannot be updated."
        },
        {
            "photo_label": "Front",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_05_IC5.jpg",
            "success": false,
            "message": "Photo has been successfully processed and cannot be updated."
        },
        {
            "photo_label": "Tires",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_06_VI9.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        },
        {
            "photo_label": "Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_07_R0Q.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        },
        {
            "photo_label": "Rear",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_08_U9T.jpg",
            "success": false,
            "message": "Photo has been successfully processed and cannot be updated."
        },
        {
            "photo_label": "Windshield",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_09_GRA.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        },
        {
            "photo_label": "Front_Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_10_WQM.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        },
        {
            "photo_label": "Front_Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_11_6NG.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        },
        {
            "photo_label": "Rear_Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_12_FO3.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        },
        {
            "photo_label": "Rear_Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_13_VSB.jpg",
            "success": false,
            "message": "Photo is still under processing and cannot be updated."
        }
    ]
}
```

{% endcode %}

#### **Sample Error** Responses

{% code title="Response: Missing API-KEY" %}

```
{
    "code": 400,
    "message": "Missing API-Key in authentication header.",
    "timestamp": {{time_stamp}}
}
```

{% endcode %}

{% code title="Response: Missing Header" %}

```
{
    "code": 404,
    "message": "Session cannot be found with the given API-Key.",
    "timestamp": {{time_stamp}}
}
```

{% endcode %}

{% code title="Response: Session Already Completed   " %}

```

{
    "code": 400,
    "message": "This session is already inspected or expired.",
    "timestamp": "2023-05-30T20:52:29.506948Z"
}
```

{% endcode %}


# GET Results

Retrieve the completed session results which include the damage details, damage co-ordinates, and the damage photos

### Endpoint

```
GET https://openapi.paveapi.com/v1/hotspots/:session_key
```

#### Headers

```makefile
API-Key: Your_API_Key
```

| Headers | Description                     | Example                              |
| ------- | ------------------------------- | ------------------------------------ |
| API-Key | The API Key for authentication. | 09bc91b9-76e5-4256-8e4g-7a41c1408014 |

#### Params

```makefile
session_key: Your_Session_Key
```

| Params       | Description        | Example        |
| ------------ | ------------------ | -------------- |
| session\_key | The Session ID Key | UCB-C3NPR4AGQZ |

#### **Sample** Request

This request does not have a body. Headers and Params will suffice.

#### **Sample** Response (200 OK) &#x20;

{% code title="" %}

```
{
    "success": true,
    "message": "27 damages found on the vehicle.",
    "data": [
        {
            "photo_code": 4,
            "photo_label": "Left",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_04_TVL.jpg",
            "inspection_data": [
                {
                    "damage_group": "WHEEL",
                    "component": "WHEEL_FRONT_LEFT",
                    "damage_name": "CURB_RASH_MINOR",
                    "description": "Curb Rash",
                    "tolerance": "1/8 to 1/2 inch - NAAA Acceptable",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 17.43,
                        "y": 27.37
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "DOOR_REAR_LEFT",
                    "damage_name": "SCRAPED_MEDIUM",
                    "description": "Scraped",
                    "tolerance": "5 to 6 inches",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 59.84,
                        "y": 24.76
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "DOOR_REAR_LEFT",
                    "damage_name": "DENTED_MEDIUM_THROUGH_PAINT",
                    "description": "Has Medium Dent - Through Paint",
                    "tolerance": "5 to 6 inches",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 60.88,
                        "y": 23.56
                    }
                }
            ]
        },
        {
            "photo_code": 5,
            "photo_label": "Front",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_05_IC5.jpg",
            "inspection_data": [
                {
                    "damage_group": "PART",
                    "component": "LIGHT_HEAD_FRONT_LEFT",
                    "damage_name": "FOGGY_MAJOR",
                    "description": "Foggy",
                    "tolerance": "Very Dull",
                    "repair_method": "Replace",
                    "coodrs": {
                        "x": 72.03,
                        "y": 21.54
                    }
                },
                {
                    "damage_group": "PART",
                    "component": "LIGHT_HEAD_FRONT_RIGHT",
                    "damage_name": "FOGGY_MAJOR",
                    "description": "Foggy",
                    "tolerance": "Very Dull",
                    "repair_method": "Replace",
                    "coodrs": {
                        "x": 27.52,
                        "y": 22.14
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "SCRAPED_MAJOR",
                    "description": "Scraped",
                    "tolerance": "9 inches to 10 inches",
                    "repair_method": "Repair & Refinish",
                    "coodrs": {
                        "x": 20.72,
                        "y": 37.92
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "SCRAPED_MEDIUM",
                    "description": "Scraped",
                    "tolerance": "5 to 6 inches",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 19.45,
                        "y": 23.49
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "SCRATCH_MINOR_NOT_THROUGH_PAINT",
                    "description": "Light Scratch",
                    "tolerance": "1/8 to 1/2 inch - NAAA Acceptable",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 47.25,
                        "y": 40.91
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "SCRATCH_MINOR_NOT_THROUGH_PAINT",
                    "description": "Light Scratch",
                    "tolerance": "1/8 to 1/2 inch - NAAA Acceptable",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 36.05,
                        "y": 26.93
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "MULTIPLE_SCRATCHES_MINOR_THROUGH_PAINT",
                    "description": "Multiple Scratches Heavy",
                    "tolerance": "2",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 50.11,
                        "y": 26.4
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "HOOD_FRONT_UNIQUE",
                    "damage_name": "MULTIPLE_DENTS_MINOR_NOT_THROUGH_PAINT",
                    "description": "Has Multiple Minor Dents - Not Through Paint",
                    "tolerance": "2",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 43.01,
                        "y": 12.86
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "HOOD_FRONT_UNIQUE",
                    "damage_name": "DENT_MINOR_SEAM_LINE",
                    "description": "Has Minor Dent on Seam Line - Not Through Paint",
                    "tolerance": "Minor dent 1/8 - 1 inch but on seam line",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 54.3,
                        "y": 13.76
                    }
                },
                {
                    "damage_group": "PART",
                    "component": "HOUSING_MIRROR_LEFT",
                    "damage_name": "MULTIPLE_SCRATCHES_MINOR_NOT_THROUGH_PAINT",
                    "description": "Multiple Scratches Light",
                    "tolerance": "2",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 70.16,
                        "y": 8.38
                    }
                }
            ]
        },
        {
            "photo_code": 7,
            "photo_label": "Right",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_07_R0Q.jpg",
            "inspection_data": [
                {
                    "damage_group": "BODY",
                    "component": "DOOR_FRONT_RIGHT",
                    "damage_name": "MULTIPLE_SCRATCHES_MINOR_THROUGH_PAINT",
                    "description": "Multiple Scratches Heavy",
                    "tolerance": "2",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 55.95,
                        "y": 22.29
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "SCRAPED_MEDIUM",
                    "description": "Scraped",
                    "tolerance": "5 to 6 inches",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 86.84,
                        "y": 26.1
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_FRONT_UNIQUE",
                    "damage_name": "SCRAPED_MAJOR",
                    "description": "Scraped",
                    "tolerance": "9 inches to 10 inches",
                    "repair_method": "Repair & Refinish",
                    "coodrs": {
                        "x": 87.88,
                        "y": 32.24
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "DOOR_REAR_RIGHT",
                    "damage_name": "SCRAPED_MAJOR",
                    "description": "Scraped",
                    "tolerance": "9 inches to 10 inches",
                    "repair_method": "Repair & Refinish",
                    "coodrs": {
                        "x": 42.11,
                        "y": 26.85
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "DOOR_REAR_RIGHT",
                    "damage_name": "DENTED_MAJOR_THROUGH_PAINT",
                    "description": "Has Major Dent - Through Paint",
                    "tolerance": "9 inches to 10 inches",
                    "repair_method": "Replace",
                    "coodrs": {
                        "x": 42.41,
                        "y": 24.38
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "ROCKER_PANEL_RIGHT",
                    "damage_name": "MISALIGNED_MAJOR",
                    "description": "Misaligned",
                    "tolerance": "Component is misaligned",
                    "repair_method": "Replace",
                    "coodrs": {
                        "x": 34.93,
                        "y": 32.01
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "QUARTER_PANEL_RIGHT",
                    "damage_name": "MULTIPLE_SCRATCHES_MEDIUM_NOT_THROUGH_PAINT",
                    "description": "Multiple Scratches Light",
                    "tolerance": "3",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 16.16,
                        "y": 22.51
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "QUARTER_PANEL_RIGHT",
                    "damage_name": "DENTED_MINOR_NOT_THROUGH_PAINT",
                    "description": "Has Minor Dent - Not Through Paint",
                    "tolerance": "1/8 to 1 inch - NAAA Acceptable",
                    "repair_method": "PDR Repair",
                    "coodrs": {
                        "x": 24.68,
                        "y": 13.16
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "QUARTER_PANEL_RIGHT",
                    "damage_name": "DENT_MINOR_SEAM_LINE",
                    "description": "Has Minor Dent on Seam Line - Not Through Paint",
                    "tolerance": "Minor dent 1/8 - 1 inch but on seam line",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 22.84,
                        "y": 23.98
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "QUARTER_PANEL_RIGHT",
                    "damage_name": "DENT_MINOR_SEAM_LINE",
                    "description": "Has Minor Dent on Seam Line - Not Through Paint",
                    "tolerance": "Minor dent 1/8 - 1 inch but on seam line",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 24.21,
                        "y": 20.73
                    }
                },
                {
                    "damage_group": "WHEEL",
                    "component": "WHEEL_REAR_RIGHT",
                    "damage_name": "CURB_RASH_MINOR",
                    "description": "Curb Rash",
                    "tolerance": "1/8 to 1/2 inch - NAAA Acceptable",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 22.9,
                        "y": 27.33
                    }
                }
            ]
        },
        {
            "photo_code": 8,
            "photo_label": "Rear",
            "url": "https://images-cdn.paveapi.com/UDB/UDB-512D3TASIY/UDB-512D3TASIY_08_U9T.jpg",
            "inspection_data": [
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_REAR_UNIQUE",
                    "damage_name": "MISALIGNED_MAJOR",
                    "description": "Misaligned",
                    "tolerance": "Component is misaligned",
                    "repair_method": "Replace",
                    "coodrs": {
                        "x": 76.36,
                        "y": 25.88
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "BUMPER_REAR_UNIQUE",
                    "damage_name": "DENT_MINOR_SEAM_LINE",
                    "description": "Has Minor Dent on Seam Line - Not Through Paint",
                    "tolerance": "Minor dent 1/8 - 1 inch but on seam line",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 67.46,
                        "y": 30.82
                    }
                },
                {
                    "damage_group": "BODY",
                    "component": "TRUNK_REAR_UNIQUE",
                    "damage_name": "OXIDIZED_MINOR",
                    "description": "Oxidized",
                    "tolerance": "1/8 to 1/2 inch - NAAA Acceptable",
                    "repair_method": "Refinish",
                    "coodrs": {
                        "x": 48.62,
                        "y": 28.35
                    }
                }
            ]
        }
    ],
    "session": {
        "session_key": "UDB-CJDQF4DJYM",
        "inspect_started_at": "2023-05-30T21:10:32+00:00",
        "inspect_ended_at": "2023-05-30T21:19:07+00:00",
        "condition_report": "https://reports.paveapi.com/api/report/UDB-CJDQF4DJYM",
        "landing_page": "https://dashboard.paveapi.com/park/UDB-CJDQF4DJYM/?l=en"
    },
    "vehicle": {
        "vin": "WBAPG73589A641024",
        "year": 2009,
        "make": "BMW",
        "model": "3 SERIES"
    }
}
```

{% endcode %}

#### **Sample Error Responses**

{% code title="No Damage Found" %}

```
{
    "success": false,
    "data": []
    "message”: “No damages found on the vehicle"
}
```

{% endcode %}

{% code title="When Inspection is in Progress" %}

```

{
    "code": 400,
    "message": "This session is not yet inspected.",
    "timestamp": "2023-05-30T21:13:41.576820Z"
}
```

{% endcode %}


# PAVE Capture Troubleshooting Guide

In order for your customer to use PAVE Inspect, you must rely on the assumption that their hardware (mobile phone) is in good working condition. Sometimes, people have unique settings or other hardware issues which make capturing a vehicle difficult. In this section, we provide you with some guidelines to help troubleshoot with any customers who are having difficulty completing the inspection.


# iPhone (iOS) Issues

Please use the left navigation pane to identify which issue you are having. *(NOTE: If you are on a mobile device, turn your screen sideways to landscape mode to reveal the navigation panel).*


# Does my mobile phone work with PAVE?

#### Some devices do not work with PAVE:

1\) Mobile phones made by Huawei.

2\) iPads and Tablets

#### Solution

Use any other iPhone or Android based mobile device.


# Can't Access Camera - Incorrect Web Browser Usage

## Problem

The phone indicates that it can't access the built-in camera for capturing images.

## Cause

You may not be using the correct web browser: Apple iPhones must open the PAVE link in Safari.&#x20;

## Solution

Only Safari has permission to use the camera. Other web browser's such as Firefox, Chrome, or Edge will not have permission to access the phone's camera. Make sure that when you click the link to begin the inspection that the inspection opens in Safari.

<figure><img src="/files/42kKLW3HTrE51114KnUx" alt=""><figcaption></figcaption></figure>


# Can't Access Camera - Camera Permission Not Enabled

##

## Problem <a href="#problem" id="problem"></a>

### You receive an error message indicating that you don't have permission to access the built-in camera for capturing images. <a href="#you-receive-an-error-message-indicating-that-you-dont-have-permission-to-access-the-built-in-camera" id="you-receive-an-error-message-indicating-that-you-dont-have-permission-to-access-the-built-in-camera"></a>

## Cause <a href="#cause" id="cause"></a>

### You may not have your camera permission enabled. <a href="#you-may-not-have-your-camera-permission-enabled." id="you-may-not-have-your-camera-permission-enabled."></a>

## Solution <a href="#solution" id="solution"></a>

## Checking if Your Camera Permission is enabled on an iPhone: <a href="#checking-if-your-camera-permission-is-enabled-on-an-iphone" id="checking-if-your-camera-permission-is-enabled-on-an-iphone"></a>

### **1) Click on the “Settings” App from your Home Screen** <a href="#id-1-click-on-the-settings-app-from-your-home-screen" id="id-1-click-on-the-settings-app-from-your-home-screen"></a>

![Select "Settings"](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FRZacWRVhWuJDUv0tFU6N%2Fimage.png?alt=media\&token=a4c4366b-b14e-4ca7-9e4c-ad32004375c4)

### **2) Scroll down and select “Safari”** <a href="#id-2-scroll-down-and-select-safari" id="id-2-scroll-down-and-select-safari"></a>

![Select "Safari"](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FqPvKOCIe3j3O8wxnOm8A%2Fimage.png?alt=media\&token=88f8aa0d-333f-4495-9c5b-4f87ab3afe66)

### **3) Scroll down and select “Camera”** <a href="#id-3-scroll-down-and-select-camera" id="id-3-scroll-down-and-select-camera"></a>

![Select "Camera"](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F8A4Y1aDV73FDPMleC2Oo%2Fimage.png?alt=media\&token=dcd56ae2-a9a6-43f1-b464-a509f7f2b918)

### **4) Confirm that "Ask" or "Allow" is checked** <a href="#id-4-confirm-that-ask-or-allow-is-checked" id="id-4-confirm-that-ask-or-allow-is-checked"></a>

![Make Sure either "Ask" or "Allow" is checked.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F5xWVzQ6QQk1o0pNAIeT0%2Fimage.png?alt=media\&token=186542ca-3a38-42b3-8aa3-72460811b11c)


# Camera Screen is Locked and won't Rotate

## Problem

### PAVE Inspect requires that the Portrait Orientation Lock feature on your iPhone be turned off, such that when turning the device sideways, the screen changes to landscape mode. You will not be able to capture images if the phone is in portrait mode.

<figure><img src="/files/HEOm3GySPhvQq2SbEYMW" alt=""><figcaption><p>If you turn the phone sideways and the screen stays the same, your Portrait Orientation Lock is likely on. </p></figcaption></figure>

## Cause

### The Portrait Orientation Lock feature is on causing the screen to stay in portrait mode.

## Solution

### 1) Swipe down from the top-right side of your iPhone screen to open the Control Center.

#### *<mark style="color:red;">**NOTE: If you have an iPhone with Touch ID instead of Face ID (iPhone 8 or prior), instead of swiping down from the top-right, swipe up from the bottom-center.**</mark>*&#x20;

<figure><img src="/files/hKGsmDSUIRjbDhPzDIff" alt=""><figcaption><p>For iPhone 10 and above, swipe down from the top-right to access your Control Center.</p></figcaption></figure>

### 2) Click on the Portrait Orientation Lock icon so that it is no longer highlighted and it says "Portrait Orientation Lock: Off".

<figure><img src="/files/batUafNaln7Pbn9hZfL7" alt=""><figcaption><p>When the "Portrait Orientation Lock" button is no longer highlighted, you have unlocked Portrait Orientation.</p></figcaption></figure>


# Inspection Get's Stuck

## Problem <a href="#problem" id="problem"></a>

### Capture won't advance or I get a black screen after each picture and have to start over. <a href="#capture-wont-advance-or-i-get-a-black-screen-after-each-picture-and-have-to-start-over." id="capture-wont-advance-or-i-get-a-black-screen-after-each-picture-and-have-to-start-over."></a>

## Cause <a href="#cause" id="cause"></a>

### It's possible that your website browser history (cache) needs to be cleared. <a href="#its-possible-that-your-website-browser-history-cache-needs-to-be-cleared." id="its-possible-that-your-website-browser-history-cache-needs-to-be-cleared."></a>

## Solution <a href="#solution" id="solution"></a>

### **1) Click on the "Settings" link from your Home Screen** <a href="#id-1-click-on-the-settings-link-from-your-home-screen" id="id-1-click-on-the-settings-link-from-your-home-screen"></a>

![Select "Settings" from the Home Screen](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FQlnSW5pV2bshEfbFLevG%2Fimage.png?alt=media\&token=6d601427-21e7-455d-9ac4-d499996731ef)

### **2) Click on "Safari"** <a href="#id-2-click-on-safari" id="id-2-click-on-safari"></a>

![Select "Safari"](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FaS7mvqAitSKiNImeC99x%2Fimage.png?alt=media\&token=35a5d3e8-13c7-4f4d-97f3-ac7fa6cbe67e)

### **3)** Scroll down and click on “Clear History and Website Data” <a href="#id-3-scroll-down-and-click-on-clear-history-and-website-data" id="id-3-scroll-down-and-click-on-clear-history-and-website-data"></a>

![Select "Clear History and Website Data"](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FoWGcoGe4BzFR2jSbJQVq%2Fimage.png?alt=media\&token=a344ae0c-2146-4b83-845c-96caf3c7652a)


# Inspection Won't Begin or Complete

## Problem

### You may be having a problem accessing the internet.&#x20;

## Cause

### Your phone may not have an adequate Wi-Fi or cellular signal.&#x20;

<figure><img src="/files/PKeaklt9Fky0i0cUeYz4" alt=""><figcaption></figcaption></figure>

## Solution

### 1) Make sure that your mobile phone has a strong signal (Wi-Fi or cellular) before beginning capture.&#x20;

### 2) At the completion of capture, make sure that you have or have returned to a strong signal and wait for the inspection processing to complete.

### 3) Some Wi-Fi connections have a firewall that prevents PAVE from functioning properly. Try disabling your Wi-Fi connection and use cellular instead.&#x20;


# Getting Back to an In-Progress Inspection

## Problem

### I exited the inspection during the capture and I don't know how to get back to where I was?

## Cause

### You were interrupted during the inspection capture by a phone call, text, email, or some other disruption that caused you to close the inspection.

## Solution

### 1) Click on the link again in the SMS text message that you used to begin the inspection.&#x20;

<figure><img src="/files/8iKYpa890R7de1K6yUv2" alt=""><figcaption><p><strong>Even though it says Get Started, it will take you back to the next picture in the sequence.</strong></p></figcaption></figure>

### 2) Click on Get Started. The system will take you back to where you were in the inspection and ask for the next image in the sequence.


# Why do I keep getting asked to retake pictures?

## Problem <a href="#problem" id="problem"></a>

### During the inspection capture, I keep getting asked to retake the same picture multiple times. <a href="#during-the-inspection-capture-i-keep-getting-asked-to-retake-the-same-picture-multiple-times." id="during-the-inspection-capture-i-keep-getting-asked-to-retake-the-same-picture-multiple-times."></a>

## Cause <a href="#cause" id="cause"></a>

### If the image of the car isn’t clear or a piece is cut off or obstructed, PAVE will ask you to take the picture again. <a href="#if-the-image-of-the-car-isnt-clear-or-a-piece-is-cut-off-or-obstructed-pave-will-ask-you-to-take-the" id="if-the-image-of-the-car-isnt-clear-or-a-piece-is-cut-off-or-obstructed-pave-will-ask-you-to-take-the"></a>

![A Blurry photo will be rejected as damage can't be properly detected. ](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F5QmPMyYWpOLi6hnsL7Ci%2Fimage.png?alt=media\&token=331cb8a5-3180-4b75-98cf-383fa9bea8a7)

![If a part of the vehicle is cut off, damage can't be properly detected.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F34E78BAcaoOGTlPNIVqu%2Fimage.png?alt=media\&token=a7bc4863-67e6-4b6c-9a4a-da748204da90)

![If any part of the vehicle is obstructed, damage can't be properly detected.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FD0Sej4Z40FwEZDLgDNWX%2Fimage.png?alt=media\&token=5a3f9091-9feb-4f80-9fe1-8ef219056e41)

## Solution <a href="#solution" id="solution"></a>

### 1) Ensure you have sufficient space (minimum of 2 meters or 6 feet) to walk around and capture the vehicle from all angles safely. <a href="#id-1-ensure-you-have-sufficient-space-minimum-of-2-meters-or-6-feet-to-walk-around-and-capture-the-vehi" id="id-1-ensure-you-have-sufficient-space-minimum-of-2-meters-or-6-feet-to-walk-around-and-capture-the-vehi"></a>

![Make sure you can walk around the vehicle with at least 6 feet (2 meters) of clearance.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FeOxeZACSSDVXJsUPSSJG%2Fimage.png?alt=media\&token=d80e7224-fda2-4da2-b020-57b4f6e157ca)

![Make sure you can walk around the vehicle with at least 6 feet (2 meters) of clearance.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FLWBvnaaTTYcU63Pi3FBg%2Fimage.png?alt=media\&token=81745b02-9cbb-4a3a-9679-6dac77d2a3a5)

### 2) Try aligning the vehicle with the "cage" lines as closely as possible. It doesn't have to be exact. <a href="#id-2-try-aligning-the-vehicle-with-the-cage-lines-as-closely-as-possible.-it-doesnt-have-to-be-exact" id="id-2-try-aligning-the-vehicle-with-the-cage-lines-as-closely-as-possible.-it-doesnt-have-to-be-exact"></a>

![Use the cage to help guide you, but is okay if it isn't exactly perfect: make sure that the entire vehicle is in the camera frame.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F7E2OK96dVrHB8lh9hPXB%2Fimage.png?alt=media\&token=d5bbb4ce-e24c-440c-80c1-0b75cf126f6a)

### 3) Be conscious of the sun: the glare from the angle and reflection might make capture difficult. You may need to move the car or try to complete the capture at a different time when there is less sun interference. <a href="#id-3-be-conscious-of-the-sun-the-glare-from-the-angle-and-reflection-might-make-capture-difficult.-you" id="id-3-be-conscious-of-the-sun-the-glare-from-the-angle-and-reflection-might-make-capture-difficult.-you"></a>

![The glare from the sun can make pictures unusable.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FiGO4xJbPFgT3GJYdeHqV%2Fimage.png?alt=media\&token=5585bd5b-4b21-4d8a-8024-292368eabaa0)


# Android Phone Issues

### Please use the left navigation pane to identify which issue you are having. *(NOTE: If you are on a mobile device, turn your screen sideways to landscape mode to reveal the navigation panel).*


# Does my mobile phone work with PAVE?

## Some devices do not work with PAVE:

### 1) Mobile phones made by Huawei

### 2) iPads and Tablets

### 3) Folding phones such as the Galaxy Z Fold Series


# Can't Access Camera - Incorrect Web Browser Usage

## Problem <a href="#problem" id="problem"></a>

### The phone indicates that it can't access the built-in camera for capturing images. <a href="#the-phone-indicates-that-it-cant-access-the-built-in-camera-for-capturing-images." id="the-phone-indicates-that-it-cant-access-the-built-in-camera-for-capturing-images."></a>

## Cause <a href="#cause" id="cause"></a>

### You may not be using the correct web browser: Android phones must open the PAVE link in Google Chrome. <a href="#you-may-not-be-using-the-correct-web-browser-android-phones-must-open-the-pave-link-in-google-chrome" id="you-may-not-be-using-the-correct-web-browser-android-phones-must-open-the-pave-link-in-google-chrome"></a>

## Solution <a href="#solution" id="solution"></a>

### Only Google Chrome has permission to use the camera. Other web browser's such as Firefox or Edge will not have permission to access the phone's camera. Make sure that when you click the link to begin the inspection that the inspection opens in Google Chrome. <a href="#only-google-chrome-has-permission-to-use-the-camera.-other-web-browsers-such-as-firefox-or-edge-will" id="only-google-chrome-has-permission-to-use-the-camera.-other-web-browsers-such-as-firefox-or-edge-will"></a>

![Always use Google Chrome for inspection capture.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F3oqFfHR9RNaz1h4z4gDJ%2Fimage.png?alt=media\&token=cd7ce984-1776-484d-b727-422f03cfde6a)


# Can't Access Camera - Camera Permission Not Enabled

## Problem

### You receive an error message indicating that you don't have permission to access the built-in camera for capturing images.

## Cause

### You may not have your camera permission enabled.&#x20;

## Solution

## Checking if Your Camera Permission is enabled on an Android phone:&#x20;

### **1) Click on the “Settings” Icon from your Home Screen**

<figure><img src="/files/2KJL9eD2Vh2IpOJaGjGd" alt=""><figcaption><p><strong>Select "Settings"</strong></p></figcaption></figure>

### **2) Click on "Apps"**

<figure><img src="/files/eoMR8BYdztbIMwVrAwsJ" alt=""><figcaption><p><strong>Select "Apps"</strong></p></figcaption></figure>

### **3) Click on "Chrome"**

<figure><img src="/files/gzVrilg4MyZyaImtSWKg" alt=""><figcaption><p><strong>Select "Chrome"</strong></p></figcaption></figure>

### **4) Click on "Permissions"**

<figure><img src="/files/rc6hVHUgs4a5Iar2hTFC" alt=""><figcaption><p><strong>Select "Permissions"</strong></p></figcaption></figure>

### **5) Click on "Camera"**

<figure><img src="/files/BTAHQNPg5WX0pv5TBcUs" alt=""><figcaption><p><strong>Select "Camera"</strong></p></figcaption></figure>

### 6) **Make sure that  “Allow only while using the app” is selected**

<figure><img src="/files/uljZbBn1VdeVQlv8Mmi2" alt=""><figcaption><p><strong>Select "Allow only while using the app"</strong></p></figcaption></figure>


# Camera Screen is Locked and won't Rotate

## Problem

### PAVE Inspect requires that the Portrait Orientation Lock feature on your Android phone be turned off **so that when you** turn the phone sideways, the screen changes to landscape mode. You will not be able to capture images if the phone is in portrait mode.

<figure><img src="/files/TvVjQSF8Gz0XceefD0D4" alt=""><figcaption><p>If you turn the phone sideways and the screen stays the same, your Portrait Orientation Lock is likely on. </p></figcaption></figure>

## Cause

### The Portrait Orientation Lock feature is on causing the screen to stay in portrait mode.

## Solution

### 1) **Click on the “Settings” Icon from your Home Screen**

<figure><img src="/files/njKHqdNwOEWWmdHPuhKt" alt=""><figcaption><p><strong>Select "Settings"</strong></p></figcaption></figure>

### **2) Scroll down and select "Home Screen"**

<figure><img src="/files/xcQs6DPzSSvzjUSZBvDi" alt=""><figcaption><p>Select "HOME SCREEN"</p></figcaption></figure>

### 3) Locate the "Rotate to Landscape Mode" button and ensure that it is in the "ON" position, which is to the right.

<figure><img src="/files/R7de8menqi9avKLCr8P7" alt=""><figcaption><p>Make sure "Rotate to landscape mode" is set to "ON".</p></figcaption></figure>


# Inspection Gets Stuck

## Problem

### Capture won't advance or I get a black screen after each picture and have to start over.

## Cause

### It's possible that your website browser history (cache) needs to be cleared.

## Solution

### **1) Click on the Chrome Icon from your Home Screen**

<figure><img src="/files/r4EsulL4QRiAKwRMOX9n" alt=""><figcaption><p><strong>Select "Chrome"</strong></p></figcaption></figure>

### **2) Tap the vertical three-dot icon at the top right, to open a dropdown menu.**

<figure><img src="/files/l5BNJwzChncJz0bF8PHi" alt=""><figcaption></figcaption></figure>

### **3) Tap History, then Clear browsing data.**

<figure><img src="/files/1I9LcVi9UCk85dtt6I5m" alt=""><figcaption></figcaption></figure>

### **4)** Select the Advanced Tab. Select Cached images and files. Click “CLEAR DATA”

<figure><img src="/files/smw8FYYkT6yjHgf8DdR7" alt=""><figcaption></figcaption></figure>


# Inspection Won't Begin or Complete

## Problem

### You may be having a problem accessing the internet.&#x20;

## Cause

### Your phone may not have an adequate Wi-Fi or cellular signal.&#x20;

## Solution&#x20;

### Your phone may not have an adequate Wi-Fi or cellular signal.&#x20;

<figure><img src="/files/Dx0NLKlc04HOGWcdxQeX" alt=""><figcaption></figcaption></figure>

### 1) Make sure that your mobile phone has a strong signal (Wi-Fi or cellular) before beginning capture.&#x20;

### 2) At the completion of capture, make sure that you have or have returned to a strong signal and wait for the inspection processing to complete.

### 3) Some Wi-Fi connections have a firewall that prevents PAVE from functioning properly. Try disabling your Wi-Fi connection and use cellular instead.&#x20;


# Getting Back to an In-Progress Inspection

## Problem

### I exited the inspection during the capture and I don't know how to get back to where I was?

## Cause

### You were interrupted during the inspection capture by a phone call, text, email, or some other disruption that caused you to close the inspection.

## Solution

### 1) Click on the link again in the SMS text message that you used to begin the inspection.&#x20;

<figure><img src="/files/ezxxzeam3THTaERikQoc" alt=""><figcaption><p><strong>Even though it says Get Started, it will take you back to the next picture in the sequence.</strong></p></figcaption></figure>

### 2) Click on Get Started. The system will take you back to where you were in the inspection and ask for the next image in the sequence.


# Why do I keep getting asked to retake pictures?

## Problem <a href="#problem" id="problem"></a>

### During the inspection capture, I keep getting asked to retake the same picture multiple times. <a href="#during-the-inspection-capture-i-keep-getting-asked-to-retake-the-same-picture-multiple-times." id="during-the-inspection-capture-i-keep-getting-asked-to-retake-the-same-picture-multiple-times."></a>

## Cause <a href="#cause" id="cause"></a>

### If the image of the car isn’t clear or a piece is cut off or obstructed, PAVE will ask you to take the picture again. <a href="#if-the-image-of-the-car-isnt-clear-or-a-piece-is-cut-off-or-obstructed-pave-will-ask-you-to-take-the" id="if-the-image-of-the-car-isnt-clear-or-a-piece-is-cut-off-or-obstructed-pave-will-ask-you-to-take-the"></a>

![A Blurry photo will be rejected as damage can't be properly detected.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F5QmPMyYWpOLi6hnsL7Ci%2Fimage.png?alt=media\&token=331cb8a5-3180-4b75-98cf-383fa9bea8a7)

![If a part of the vehicle is cut off, damage can't be properly detected.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F34E78BAcaoOGTlPNIVqu%2Fimage.png?alt=media\&token=a7bc4863-67e6-4b6c-9a4a-da748204da90)

![If any part of the vehicle is obstructed, damage can't be properly detected.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FD0Sej4Z40FwEZDLgDNWX%2Fimage.png?alt=media\&token=5a3f9091-9feb-4f80-9fe1-8ef219056e41)

## Solution <a href="#solution" id="solution"></a>

### 1) Ensure you have sufficient space (minimum of 2 meters or 6 feet) to walk around and capture the vehicle from all angles safely. <a href="#id-1-ensure-you-have-sufficient-space-minimum-of-2-meters-or-6-feet-to-walk-around-and-capture-the-vehi" id="id-1-ensure-you-have-sufficient-space-minimum-of-2-meters-or-6-feet-to-walk-around-and-capture-the-vehi"></a>

![Make sure you can walk around the vehicle with at least 6 feet (2 meters) of clearance.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FeOxeZACSSDVXJsUPSSJG%2Fimage.png?alt=media\&token=d80e7224-fda2-4da2-b020-57b4f6e157ca)

![Make sure you can walk around the vehicle with at least 6 feet (2 meters) of clearance.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FLWBvnaaTTYcU63Pi3FBg%2Fimage.png?alt=media\&token=81745b02-9cbb-4a3a-9679-6dac77d2a3a5)

### 2) Try aligning the vehicle with the "cage" lines as closely as possible. It doesn't have to be exact. <a href="#id-2-try-aligning-the-vehicle-with-the-cage-lines-as-closely-as-possible.-it-doesnt-have-to-be-exact" id="id-2-try-aligning-the-vehicle-with-the-cage-lines-as-closely-as-possible.-it-doesnt-have-to-be-exact"></a>

![Use the cage to help guide you, but is okay if it isn't exactly perfect: make sure that the entire vehicle is in the camera frame.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2F7E2OK96dVrHB8lh9hPXB%2Fimage.png?alt=media\&token=d5bbb4ce-e24c-440c-80c1-0b75cf126f6a)

### 3) Be conscious of the sun: the glare from the angle and reflection might make capture difficult. You may need to move the car or try to complete the capture at a different time when there is less sun interference. <a href="#id-3-be-conscious-of-the-sun-the-glare-from-the-angle-and-reflection-might-make-capture-difficult.-you" id="id-3-be-conscious-of-the-sun-the-glare-from-the-angle-and-reflection-might-make-capture-difficult.-you"></a>

![The glare from the sun can make pictures unusable.](https://4104388249-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MlLgcZ-rE81_McmcRrV%2Fuploads%2FiGO4xJbPFgT3GJYdeHqV%2Fimage.png?alt=media\&token=5585bd5b-4b21-4d8a-8024-292368eabaa0)


# Policies


# Service Level Agreement and Standards

The scope of this Service Level Agreement and Standards section is to help answer these frequently asked questions:

*“Detail your operating hours, support model, SLAs for managing inquiries or incidents, and SLOs (service level objectives) for service accessibility/availability/capacity. Please also describe how planned/unplanned downtime is handled internally and communicated to customers.”*

### <mark style="color:blue;">**Service Level Agreement**</mark>

#### *Service Overview*

The PAVE service (PAVE) provides Android and iPhone users a simple Progressive Web Application (PWA) as a browser-based or native (if using our SDKs) guided experience to capture appropriate vehicle images to perform an automated inspection report. Discovery Loft customers initiate this service by generating session requests via HTTPS through a REST API for their end-users. The API also returns the vehicle details, images and inspection results as JSON-encoded responses.

PAVE's inspection results are processed separately depending on the use case parameters established between Discovery Loft and our customer. For Just in Time Results, PAVE delivers near-real-time results, and for 24HR Queued Results, these results may be delayed for up to 24 hours (coming Fall 2022).

PAVE's SLA and SLOs are based on a three-month rolling window

***Service Levels***

Discovery Loft will make commercially reasonable efforts to provide the PAVE services between the hours of (a) Monday to Friday from 9:00 am to 11:59 pm EST; and (b) Saturday to Sunday from 9:00 am to 11:00 pm EST, in each case, excluding statutory and civic holidays observed in Toronto, Ontario (the "Inspection Hours") to achieve at least 99.*9*0% availability for each calendar month during the Term, excluding downtime or suspension of the PAVE services following (the "Uptime Commitment"). If Discovery Loft fails to meet its Availability Service Level in any calendar month during the Term, the Customer will be entitled to credits as follows:

#### Table #1– Uptime Commitment

| Availability Service Level | Credit Against the Monthly Minimum Fee |
| -------------------------- | -------------------------------------- |
| >99.9%                     | N/A                                    |
| >99.5% - <99.9%            | 2%                                     |
| >99% - <99.5%              | 3%                                     |
| >99.5% - <99%              | 4%                                     |
| <99.5%                     | 5%                                     |

Uptime is the percentage of total possible minutes PAVE was available during a fiscal quarter. Our commitment is to maintain at least 99.9% Uptime: \[(total minutes in quarter - Downtime) / total minutes in quarter] > 99.9%\
\
The payment of the credits towards the Customer's account is Discovery Loft's sole liability and entire obligation and the Customer's exclusive remedy for any breach by Discovery Loft following (the Uptime Commitment).

### <mark style="color:blue;">**Service Level Objectives**</mark>

**Table #2 - SLOs and SLIs**

| Category                                      | SLI                                                                                                                                                                                                                                                                                                                                                                                                                                   | SLO                                                          |
| --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| **API**                                       |                                                                                                                                                                                                                                                                                                                                                                                                                                       |                                                              |
| Availability                                  | <p>The load balancer metrics measure the proportion of requests that receive a successful HTTP status other than 500-599.</p><p></p><p> <em><code>\[count of "api" http\_requests which do not have a 5XX status code divided by the count of all "api" http\_requests]</code></em></p>                                                                                                                                               | 99.9%                                                        |
| Latency                                       | <p>The load balancer metrics measure the proportion of adequately short amount of time for a call to reach a destination and a call to come back to the API. Adequately short amount of time is defined as <150 ms.</p><p></p><p><em><code>\[count of "api" http\_requests with a duration less than or equal to "0.15" seconds divided by count of all "api" http\_requests]</code></em></p>                                         | <p>90% of requests <150 ms</p><p>99% of requests <300 ms</p> |
| **Inspection Results (Just in Time Results)** |                                                                                                                                                                                                                                                                                                                                                                                                                                       |                                                              |
| Correctness                                   | <p>The proportion of vehicle inspection condition reports returned 83% correct as measured during a side-by-side professional inspection comparison. Correctness is not missing or falsely identifying exterior cosmetic damages visible in the captured images that are >150USD to repair.</p><p></p><p><em><code>\[count of all completed results which were correct divided by the count of all completed results]</code></em></p> | 83% correct                                                  |
| Completion Response Time                      | <p>The proportion of vehicle inspection condition reports returned in an adequately short time after the final required image has been captured and has passed the system QA. An adequately short time is defined as <150 seconds.</p><p></p><p><em><code>\[count of all completed results with a duration less than or equal to "150" seconds divided by the count of all completed results]</code></em></p>                         | 150 seconds                                                  |
| **Inspection Results (24HR Queued Results)**  |                                                                                                                                                                                                                                                                                                                                                                                                                                       |                                                              |
| Correctness                                   | <p>The proportion of vehicle inspection condition reports returned 83% correct as measured during a side-by-side professional inspection comparison. Correctness is not missing or falsely identifying exterior cosmetic damages visible in the captured images that are >150USD to repair.</p><p></p><p><em><code>\[count of all completed results which were correct divided by the count of all completed results]</code></em></p> | 83% correct                                                  |
| Completion Response Time                      | <p>The proportion of vehicle inspection condition reports returned in a limited delayed time after the final required image has been captured and has passed the system QA. A limited delayed time is defined as <24 hours.</p><p></p><p><em><code>\[count of all completed results with a duration less than or equal to "24" hours divided by the count of all completed results]</code></em></p>                                   | <24 hours                                                    |

### <mark style="color:blue;">**Service Interruptions Handling and Communication Policy**</mark>

**Suspension of Access; Scheduled Downtime; Modifications**

Discovery Loft may, from time to time and at its discretion, without limiting any of its other rights or remedies at law or in equity, under the Agreement with its clients: suspend Customer's access to or use of the PAVE services in whole or in part:

* for scheduled maintenance;&#x20;
* due to a Force Majeure;&#x20;
* if Provider believes in good faith that Customer or any Permitted User has violated any provision of this Agreement;&#x20;
* to address any emergency security concerns;&#x20;
* or if required by a regulatory body or as a result of a change in applicable law;&#x20;
* and make any Modifications to the PAVE services.

To the extent reasonably practicable, Discovery Loft will provide the Customer with advance notice of such suspension.

#### Service Incident Response Times

Following written notification to the Customer of any inability to access the PAVE services (during the Inspection Hours), Discovery Loft will correctly classify such Service Incident into one of the severity levels described below. Based on such severity level classification, we will use commercially reasonable efforts to respond to the Customer following the below-set frames.

**Table #4 - Service Incident Response Times**

| Level       | Severity                                                                                                                                                                                                                                       | Initial Response Time                                                                      | Ongoing Updates Provided                |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | --------------------------------------- |
| **Level 1** | **Critical**                                                                                                                                                                                                                                   | <ul><li>Regular business workday: 1 hour</li><li>Weekends or off hours: 2 hours</li></ul>  | <ul><li>Every 4 hours</li></ul>         |
| Description | When an issue is affecting user flow and data                                                                                                                                                                                                  |                                                                                            |                                         |
| Examples    | <ul><li>User cannot access the PAVE Service, preventing them from using PAVE</li><li>Server down</li><li>Missing user data</li></ul>                                                                                                           |                                                                                            |                                         |
| **Level 2** | **Medium**                                                                                                                                                                                                                                     | <ul><li>Regular business workday: 3 hours</li><li>Weekends or off hours: 4 hours</li></ul> | <ul><li>Every 12 hours</li></ul>        |
| Description | <ul><li>When an issue is affecting the flow but can be handled manually by the user or PAVE agent/dev</li></ul>                                                                                                                                |                                                                                            |                                         |
| Examples    | <ul><li>PAVE UI stuck at loading, users can manually reload PAVE, reopen the app</li><li>PAVE result data is not loading or sending to client endpoint; can be done manually by PAVE Dashboard to resend or PAVE agent/dev to resend</li></ul> |                                                                                            |                                         |
| **Level 3** | **Low**                                                                                                                                                                                                                                        | <ul><li>Within 5 business days</li></ul>                                                   | <ul><li>Every 7 business days</li></ul> |
| Description | When an issue can be seen but not affecting the flow                                                                                                                                                                                           |                                                                                            |                                         |
| Examples    | <ul><li>UI design input</li><li>Mismatch text between PAVE UI like web app vs SDK</li><li>Glitchy UI</li></ul>                                                                                                                                 |                                                                                            | <p><br><br><br></p>                     |

The following terms will have the meanings set forth below:

* **"Critical"** means any complete inability to access the PAVE services by the Customer unless such failure to access PAVE services results from any Excluded Outage.
* **"Medium"** means any partial degradation in the functionality or performance of the PAVE services unless such degradation is the result of any Excluded Outage.
* **"Low"** means any routine or non-critical problem or issue with the PAVE services that does not impair the underlying functioning of the PAVE services, unless such problem or issue is the result of any Excluded Outage.
* **"Excluded Outage"** means any outage or unavailability affecting the PAVE services that is caused by: (i) any act or omission of Customer or any Permitted User; or (ii) an event of Force Majeure.
* **"Service Incident"** means any outage, service degradation, malfunction or other issue relating to the PAVE services.


# Service Delivery Sub-Processors & Processors

The scope of this Service Delivery Sub-Processors & Processors section is to help answer these frequently asked questions:

*“Is your product dependent upon any third-party platforms or services to operate successfully? If so, please describe these dependencies and how you manage third-party service disruptions.”*

### <mark style="color:blue;">**Subprocessors & Processors**</mark>

Discovery Loft may use third-party data processors who may have access to specific customer data (a sub-processor) in operational and functional activities to provide support and deliver the PAVE services.

Due Diligence Discovery Loft undertakes a thorough review of each potential vendor's access to customer data. This review ensures levels of privacy and security are at a minimum equivalent to those provided by Discovery Loft in our Information Security Policy which includes minimizing the amount of customer data processed.

**Table #1 -** **Infrastructure Sub-processors – Service Data Storage and Processing**

| Entity Name               | Purpose                | Service Disruption Backup                                    | Entity Country                         |
| ------------------------- | ---------------------- | ------------------------------------------------------------ | -------------------------------------- |
| Google Inc.               | Cloud Service Provider | Deploy new clusters or utilize AWS.                          | United States                          |
| Amazon Web Services, Inc. | Cloud Service Provider | Backups only, use Google Cloud for backup as an alternative. | United States, Ireland, Germany, Japan |

**Table #2 -** **Service Specific Sub-processors**

| Entity Name                                          | Purpose                                                                                                                                                                                      | Service Disruption Backup                                                                                                                   | Entity Country                         |
| ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| Twilio, Inc.                                         | Twilio’s development platform provides the APIs that PAVE uses to facilitate SMS and text functionality.                                                                                     | Send a link as an email instead using SES services.                                                                                         | United States                          |
| Amazon Web Services, Inc                             | PAVE uses Amazon Simple Email Service (SES) to send transactional emails generated by the PAVE services.                                                                                     | N/A                                                                                                                                         | United States, Ireland, Germany, Japan |
| Google Inc.                                          | Discovery Loft’s Email Provider, including Google Analytics, Data Storage                                                                                                                    | N/A                                                                                                                                         | United States                          |
| Hubspot, Inc.                                        | CRM and customer support software                                                                                                                                                            | N/A                                                                                                                                         | United States                          |
| Stripe, Inc.                                         | Stripe development platform provides APIs for PAVE to utilize secure credit card processing for subscription service users.                                                                  | N/A                                                                                                                                         | United States, Ireland                 |
| Slack Technologies, LLC, a Salesforce company        | Slack provides direct communication channels for PAVE’s client teams and our customers, PAVE also uses Slack for automated notifications for system monitoring.                              | N/A                                                                                                                                         | United States                          |
| Zoom Video Communications, Inc.                      | Video communication & collaboration solution                                                                                                                                                 | Google                                                                                                                                      | United States                          |
| Auth0, Inc.                                          | PAVE's optional authentication mechanism for OAuth2-based logins during Connector registration.                                                                                              | System registration process.                                                                                                                | United States                          |
| Datadog, Inc. (“Datadog”)                            | Datadog provides PAVE with content distribution, security and abuse prevention and DNS services for traffic transmitted to and from the services.                                            | N/A                                                                                                                                         | United States                          |
| Snyk Limited                                         | Sync finds and automatically fixes vulnerabilities in code, open source dependencies, containers, and infrastructure as code — all powered by Snyk’s industry-leading security intelligence. | N/A                                                                                                                                         | United Kingdom                         |
| BrowserStack, Inc                                    | BrowserStack provides PAVE’s QA team with an automated testing platform for testing websites and mobile apps.                                                                                | N/A                                                                                                                                         | India                                  |
| Kelly Blue Book (Cox Automotive, Dealertrack Canada) | Kelly Blue Book provides PAVE with an API service to obtain vehicle valuations in Canada and USA Only.                                                                                       | N/A                                                                                                                                         | United States, Canada                  |
| vAuto (Cox Automotive)                               | vAuto is an alternative integration that can be initiated by PAVE customers to send session information to their vAuto service in Canada and USA Only.                                       | N/A                                                                                                                                         | United States                          |
| Solera - Carweb Limited,                             | Carweb provides PAVE with an API service to identify the vehicle information by PAVE passing the vehicle’s registration number or VIN. (only available for UK and Europe)                    | PAVE resorts to its own information it collects during the session. Limited data is returned until the provider’s service becomes restored. | United Kingdom                         |
| Autodata, Inc. dba Chrome Data (“Chrome Data”)       | Autodata provides PAVE with an API service to identify the vehicle information by PAVE passing the vehicle’s VIN in Canada and USA Only.                                                     | PAVE resorts to its own information it collects during the session. Limited data is returned until the provider’s service becomes restored. | United States                          |


# API Strategy and Architecture

The scope of this PAVE API Strategy and Architecture section is to help answer these frequently asked questions:

*“Describe your API architecture (REST, SOAP). Also, describe the technology stack and hosting model for your system including the APIs.”*

*“How often are changes to customer-facing APIs, UI, or dashboards implemented and what is your process for notifying customers of changes?”*

### <mark style="color:blue;">**PAVE API Architecture**</mark>

The PAVE API is organized around the RESTful (REST) construction on the PHP Laravel Framework with PHP 8.X. It serves requests via HTTPS using Laravel Octane with Swoole library (an event-driven asynchronous & coroutine-based concurrency C++ engine for PHP). Our API returns JSON-encoded responses and uses the OpenAPI Specification (OAS) that defines a language-agnostic interface to REST APIs.

Repository and Unit of Work classes are used for decoupling the infrastructure to access databases and utilizing event-driven and queue-job architecture with RabbitMQ and Redis.

The PAVE API services are deployed on Google Cloud Kubernetes.

### <mark style="color:blue;">**PAVE API Change Management**</mark>

We always avoid making any "Breaking Changes" to our production APIs. However, we can make these changes for any specified license on request (when any customer-specific customization becomes required) without impacting other accounts. By "Breaking Changes," we mean any structural change that would break any customer's application. In contrast, we will frequently add functionality and new objects that support our continuous improvements and new product features.

When we evolve the API such that it requires changes to our Data Contracts and requires migration by our customer (by implementing "Breaking Changes"), we will always deploy this as a new version of our API to allow customers to migrate at their own discretion and schedule. We manage this using the URI Path by putting a number in the path of the URI with the prefix "v." This allows our customer to use both versions simultaneously as they complete their development and UAT testing on the newly released version.

**For Example, Our current endpoint is:**

```
https://openapi.paveapi.com/v1/sessions 
```

**When we need to make breaking changes, we would reversion this to become:**

```
https://openapi.paveapi.com/v2/sessions 
```

The PAVE product team includes a complete QA department that tests all functionality in staging and, when approved, to go to production, these same tests get completed again once released.

Each function of our API constantly gets tested for:&#x20;

* Send the request with necessary input data
* Get the response having output data
* &#x20;Verify that the response returned as expected in the requirement


# Information Security Policy


# Data Quality Guideline

Discovery Loft applies the seven data quality dimensions specified in (5.1) Figure #1 across all operations for PAVE. These dimensions span all measurable quality aspects for defining critical and shared data assets.

When assessing and improving data quality in each of the following dimensions, quality issues are often related to the people, process, technology, or a combination.

**Figure #1 - Data Quality Dimensions**

<figure><img src="/files/NK6Tv9yhgy62dozsaO0E" alt=""><figcaption></figcaption></figure>

Each dimension gets divided into properties (sub-sections). These properties define specific characteristics being considered in the evaluation of each dimension. Each property represents a singular, testable measure of quality. The seven dimensions and the associated properties are described in this section. Use the appropriate asset to populate the assessment template found in this Data Quality Management Plan. These dimensions should be consistently applied across all of Discovery Loft's operations to allow for accurate census between our teams, our users, partners and our customer.

### <mark style="color:blue;">**Accuracy**</mark>

*Is the data accurate, valid, and to what level?*

**Accuracy** refers to how the data correctly portrays the real-world situation it originally was designed to measure. Data must be meaningful and helpful to correctly and accurately interpret and analyze. Data must also be valid to be considered accurate, which means it conforms to a defined format and adheres to specific business rules.

#### **Accuracy Properties:**

**Data collection:**  Errors at the source of the collection can occur at multiple stages in the collection process, usually by data providers or during data entry. Various factors may cause these errors during the process, including; poor form design, providers not having a clear understanding of the concept or form, and human entry errors. As a result, poor data collection often misrepresents findings and leads to inaccurate conclusions or gaps in a data asset.

**Data is commonly understood:** Understanding how the information is to be used and what the data represents by everyone collecting and using it reduces the risk of errors in entry and misinterpretation of the data. In addition, document formats and standards and the intent of each defined data field being collected will ensure the data collected is well understood and accurate.

**Process:** This relates to any method of collecting or manipulating data, such as changing the data format or moving data's location. This may be done automatically by a system or manually by a person. In addition, business processes to monitor and improve data quality should be created. These procedures should be documented, discoverable, and automated to remove human error and reduce errors.

**People:** All staff involved with data collection and processing must be aware of the importance of data quality and their role in ensuring quality is maintained or improved. For example, suppose a user has to correct a data asset manually repeatedly. In that case, this feedback should be sent to the Product Team or data collection provider to fix any issues in the collection mechanism or data asset. It also relates to the Collection dimension.

**Validation:** Validations verify that data fits specific criteria and standards specified for that record type. Validation rules should be documented and accessible by all staff. Automated validations should be implemented in data collection and processing systems to help in reducing errors. For example, using validation in forms or fields used at the collection point to ensure that only allowable values are entered. Rules should be reviewed to ensure accuracy throughout the lifecycle of all data assets.

**Format:** Format relates to the structure of data. Generalized formats like large open text fields often increase the risk of errors and decrease the validity of the data. Structured data should be entered in a way that, when collected, it's easier to interpret and use. For example, it is easier to process an address when it is structured as separate parts - street number, name, city, state, zip code - instead of a single text field. When possible, data should also be validated against format rules (e.g. specific data must not contain numbers or special characters) and based on known standards (e.g. VIN data ISO standards).

### <mark style="color:blue;">Completeness</mark>

*How complete is the data? Are there apparent gaps?*

**Completeness** relates to what extent is the data complete. The Completeness dimension also reflects the ability to determine what data elements are missing and whether these omissions are acceptable (optional data). Departments must evaluate and understand whether a data asset contains unacceptable gaps. These may limit the data, leading to an increased reliance on assumptions and estimations or precluding the asset for use altogether. It is also helpful to note the level of completeness, which is relevant in cases where 100% completeness is not required to meet the original purpose of the dataset and if the dataset is considered complete at a particular point in time, e.g. beginning or end of a month.

#### Completeness Properties:

**Process:**  As with the Accuracy dimension, procedures must be in place to ensure that the data entered is as complete as possible. A review and feedback process should be implemented to assist in discovery and resolutions to ensure there are no gaps or coverage issues. This may be done automatically by a system or manually by a person. These procedures should be documented, discoverable, and automated to remove human error and reduce errors.

**Gaps:** This property relates to determining if any known gaps are in the data. Often these gaps occur from a breakdown in the system or our processes or when data is being collected for a defined period. Sometimes, for some data to fit the purpose, 100% completeness may not be required, and this should be noted. However, to allow users to compensate, any known gaps in data should be documented.

### <mark style="color:blue;">**Representative**</mark>

*Is the dataset representative of the situation or conditions that it refers to?*

**Representativeness** relates to the relevance of data to meet the initial defined purpose for its collection or creation. For data to be representative, it must represent the environment in which it was collected or created and reflect the situation it is attempting to describe. Raw data may not always be representative. However, this can also be achieved using analytical techniques such as weighting.

#### Representative Properties:

**Coverage:** Coverage relates to the proportion of the sample that has been incorrectly included or excluded. To discover this, compare the final results with the expected results or response rates and totals. The coverage should always represent a sufficient sample size and breadth of the conditions needed to use the data. For example, having only a  small sample of a large overall population may not yield a valid result.

**Relevance:** This is how the data reflects the real-world situation to meet users' needs. Working with data of high relevance tells you what you want to know without sorting through irrelevant data and information. The data should be relevant to the situation or environment it intends to measure or analyze. Customer feedback should be collected and measured to determine if the data meets their needs by being relevant.

### <mark style="color:blue;">**Timeliness/Currency**</mark>

*Is the timeliness and has the appropriate currency of the data?*

**Timeliness**  refers to the speed at which the required data is made available and what delay is there between the reference period and when the information is released. Factors that often impact timeliness are the method used for collection and how it is processed. Data should always be discoverable, available and accessible throughout the data asset lifecycle for greater internal and external use. The currency and reliability may be impacted when delays occur during the provision of data.

#### **Timeliness/Currency Properties:**

**Availability:** Any data must be made available as soon as possible, both internally to PAVE and externally (where applicable). Most delays occur between the release date of the data and the reference period it spans. Data must be available quickly and frequently to support information needs, meet contract terms and reporting deadlines, and support product or management decisions. In addition, when any findings are released that data was used to support the data should be made available.

**Currency:**  Based on the user's needs, if data is no longer current, it may no longer be fit for its intended use, data for activities occurring within a set period. When data references specific periods, it should be current and released before it is superseded. This may happen with data assets collected on a one-off basis or infrequently. Metadata, including collection dates, collection periods, coverage and the expiry date of the data should be provided with the data asset.

### <mark style="color:blue;">**Collection**</mark>

*What was the collection method used, and was it consistent?*

**Data collection** methods should always be appropriate for the collected data type. For example, a survey may be a more appropriate collection method than using data entry software to collect specific data. In addition, collection must be consistent, especially if the same data is continuously collected or is to be compared to other data assets.

#### **Collection Properties:**

**Data is commonly understood:**  Having an understanding of the use and meaning of data by those collecting and using it minimizes the risk of any data collection errors. Defining the data itself, the data collection and the processing methods used should be made available organization-wide to provide a consistent understanding. This definition should include what data was collected, how it was collected, who collected it, how it was processed (system or person) and any details if it was ever edited or manipulated. When these details are documented over time, data collection remains consistent independent of any person or system being used to collect it.

**Appropriateness:** The most appropriate method possible should be used for recording the data. Some possible data collection methods include third-party service providers, forms, and data feeds. Any collection method is to be chosen based on the required level of data quality needed for analysis and risk level. For example, conducting a  survey may be suitable to collect general information from users, but collecting system data may be more appropriate for analytical use. In addition, it is essential to consider the associated risk, e.g. implications of collecting sensitive or personal data. Finally, the method selected should be documented.

**Duplication:** Data should never be duplicated in other data assets. When duplication does exist, it should always get identified and managed. Maintaining a glossary of terms and context that is documented helps to reduce duplication and ensures data comparison is appropriate.

### <mark style="color:blue;">**Consistency**</mark>

*Is the data consistent with other related datasets, standards and formats?*

Consistency of data means the data was collected, grouped, structured and stored in a consistent and standardized way. This requires implementing standard concepts, definitions, and classifications across departments with agreed-upon meanings and interpretations. Data must also be consistent for all its potential uses. For example, some data may appear similar but have very different meanings or uses in various departments. Duplication, or different meanings for similar data, often results in confusion or misinterpretation of data and makes it unsuitable for comparison with related assets. It may also be challenging to determine if trends are due to an actual effect or problems with inconsistent data collection.

#### **Consistency Properties:**

**Comparison** with similar data assets: It is essential to have the capacity to make comparisons across multiple data assets. Having common data definitions and standards helps achieve this ability to make comparisons. Common data definitions should be agreed upon and shared across PAVE and our external partners, and manage any inconsistencies.

**Consistency over time:** This refers to tracking a data asset over time. Data must remain consistent even when changes may be made in scope, definition and collection so it can still be compared with previous data assets. For example, track any changes if data was collected over a period of time. To determine if comparisons are appropriate, documentation of any changes and the frequency or timing of any updates must occur.

**Documentation:** Any changes to data and the related processes should be documented to be traceable. Maintaining data dictionaries that specify all business rules, specifications, and validations, as well as a glossary of terms, should be available and regularly maintained, including any changes made to data. These can include the definition, naming conventions, or scope of data collected and periodically, these may change over time. Documentation of this related information should be recorded and include the time and date, the reason for the change, and the person's name who made the changes to the data asset. This allows for mapping these variations between any versions to allow for traceability, which is needed for retrospective analysis. This documentation becomes a Data Quality Statement - that is, a summary of known characteristics that may affect a data asset's quality - that informs any users of the data asset and enables them to make decisions about its us&#x65;**.**

**Data is commonly understood:** Documentation of data definitions, collection, groupings, and terminology help form an understanding of data maintaining continuity and consistency. Wherever possible, any synonyms for terms should be included when more than one term may have the same meaning (e.g. “client” and “customer”) but may mean the same in one context but could be different in another. Technical definitions may also be included when this is important.

### <mark style="color:blue;">**Fit for Purpose**</mark>

*Is the data fit for the purpose it originally was intended to be used?*

Data is considered fit for purpose when appropriate for the intended use. For example, the purpose could include decision making, developing a policy, service delivery, product functionality, reporting, or administrative. The purpose the data is measured against is always the original intended purpose. However, some future uses of the data may not have been apparent at the time the original data was collected. Knowing who the users of the data will be and what their expectations of data quality must always align with the original business intent of the data asset. Consulting with potential users in a data asset's development or planning phase can ensure that the data collected meets their quality and relevance expectations. Fitness for purpose is often subjective and difficult to measure, and no specific properties are suggested for the Fitness for purpose dimension. However, a statement may be made against the overall data asset’s Fitness for purpose as it is a critical part of data quality across all dimensions.


# Data Retention Policy

At Discovery Loft, we believe that protecting our user's and our customer's organizational and personal data is essential. Therefore, we endeavor constantly to minimize and protect any personal data that we hold. Additionally, we never share personal data with other companies other than to provide the service itself.

We have strict policies on how that data is stored and how long we will retain it for the information that we do hold. This page documents our general data retention policies.

| Data Description                  | Retention Period                                                                                                                                                                                             | Request Deletion | Request Access |
| --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------- | -------------- |
| Client Account Data               | Permanent                                                                                                                                                                                                    | No               | Yes            |
| Client Financial Data             | 7 Years                                                                                                                                                                                                      | No               | Yes            |
| Client Communication              | 3 Years                                                                                                                                                                                                      | Yes              | Yes            |
| Network Connections (logs)        | 3 Years                                                                                                                                                                                                      | No               | No             |
| Message Submission (logs)         | 3 Years                                                                                                                                                                                                      | No               | No             |
| Message Delivery (logs)           | 3 Years                                                                                                                                                                                                      | No               | No             |
| Client’s Account User’s Data      | 2 Years after inactive                                                                                                                                                                                       | Yes              | Yes            |
| Session User Data                 | 2 Years after account inactive                                                                                                                                                                               | Yes              | Yes            |
| Session Images                    | Retained while the organization remains a customer of Discovery Loft or anonymized and retained indefinitely for statistical or other purposes after the customer no longer requires access..                | No               | Yes            |
| Session Vehicle Condition Reports | Retained while the organization remains a customer of Discovery Loft or anonymized and retained indefinitely for statistical or other purposes after the customer no longer requires access.                 | Yes              | Yes            |
| Session Data                      | Retained while the organization remains a customer of Discovery Loft or deleted by request. Once a user/organization requests record/s to be deleted, data will be removed from the back-ups within 6 months | Yes              | Yes            |

**Disclaimer**

We have not included a description of every element of data that we store in this policy. However, they are subject to variation for technical reasons, but the data retention policies per category will still apply to any data elements not documented in this policy.

**Changes to This Policy**

This policy is effective as of ​the 22nd of April 2022. It will remain in effect except concerning any changes in its provisions, which will be in effect immediately after being edited in this document’s latest version. Discovery Loft reserves the right to update or change the policy, and the user/organization should check for latest versions of this policy periodically. The continued use of the Service after Discovery Loft posts any modifications to the policy in the latest version of this document will constitute the user/organization acknowledgment of the changes and consent to abide by and be bound by the modified policy. If the Discovery Loft makes any material changes to the policy, we will notify all customers by placing a prominent notice on the user/organization’s PAVE Dashboard.


# Backup and Disaster Recovery

Discovery Loft values reliability and simplicity in its infrastructure. Therefore, PAVE's services are hosted in multiple regions. These regional zones are designed to improve service speeds and availability while being able to fail independently allowing the service to remain available if any specific region fails.

PAVE's recovery and backup is tested every six months to simulate the requirement to move the services to different regions completely if a complete failure would occur.


# Data Residency

PAVE's system data is hosted on the Google Cloud Platform. PAVE currently has two clusters that are located in regions:

#### Table #1 - **Data Residency Regions**

| Cluster                 | Location                        |
| ----------------------- | ------------------------------- |
| northamerica-northeast1 | Montréal, Québec, North America |
| asia-southeast1         | Jurong West, Singapore, APAC    |

PAVE's system data is also regularly backed up on Google Cloud and AWS. PAVE's backup data is hosted on two Google Cloud clusters, and some session data is often backed up on AWS.

#### Table #2 - **Data Backup Regions**

| Cluster                 | Location                        |
| ----------------------- | ------------------------------- |
| northamerica-northeast1 | Montréal, Québec, North America |
| asia-southeast1         | Jurong West, Singapore, APAC    |
| us-east-2               | US East (Ohio) Region           |

PAVE's data can be accessed and processed from Canada and Vietnam by authorized Discovery Loft Inc. (Canada) or Discovery Loft LTD (Vietnam) employees with appropriate credentials.


# Data Access Control

Customer and user data are restricted to Discovery Loft, engineering, accounting and customer success team members with credentials to access such data within PAVE's reporting systems only. Additionally, Discovery Loft personnel are not authorized to retain or store any customer and user data on any portable devices or computers outside of the company's data center. Instead, authorized employees can only access non-sensitive user data via web-based tools managed centrally by the company with their credentials that can be revoked.


