Skip to main content

Complete Technical Report

This guide walks you through generating a complete technical report, from uploading vehicle photos to retrieving the final PDF.

What You'll Learn

  • Upload vehicle damage photos
  • Create a technical report with vehicle details
  • Monitor report generation progress
  • Download the completed report

Prerequisites

  • Valid Silent Witness API key
  • Vehicle damage photos (JPEG/PNG format)
  • Vehicle information (make, model, year)

Complete Example

Here's a complete workflow from start to finish:

package main

import (
"context"
"fmt"
"log"
"os"
"time"

"github.com/silentwitness/go-sdk"
)

func main() {
ctx := context.Background()
silentwitness.Key = "sk_test_your_api_key"

// Step 1: Create a case
caseResp, err := silentwitness.Cases.Create(ctx, &silentwitness.CreateCaseRequest{
Name: silentwitness.String("Smith v. Johnson - Intersection Collision"),
ClientName: silentwitness.String("Jane Smith"),
})
if err != nil {
log.Fatalf("Failed to create case: %v", err)
}
caseID := caseResp.Case.Id
fmt.Printf("Created case: %s\n", caseID)

// Step 2: Upload vehicle photos
photoData, _ := os.ReadFile("vehicle-damage-front.jpg")
upload, err := silentwitness.Files.Upload(ctx, &silentwitness.UploadFileRequest{
Content: photoData,
Filename: silentwitness.String("vehicle-damage-front.jpg"),
Purpose: silentwitness.String("crash_analysis_plaintiff"),
CaseId: silentwitness.String(caseID),
})
if err != nil {
log.Fatalf("Upload failed: %v", err)
}
fmt.Printf("Uploaded file: %s\n", upload.FileId)

// Step 3: Create technical report
report, err := silentwitness.Reports.Create(ctx, &silentwitness.CreateCrashReportRequest{
CaseId: silentwitness.String(caseID),
Plaintiff: &silentwitness.VehicleData{
ImageFileIds: []string{upload.FileId},
VehicleMaker: silentwitness.String("Toyota"),
VehicleModel: silentwitness.String("Camry"),
VehicleYear: silentwitness.String("2020"),
Seatbelt: silentwitness.Bool(true),
AirbagsDeployed: silentwitness.AirbagsDeployed(silentwitness.AirbagsDeployedYes),
},
AccidentDescription: silentwitness.String("Rear-end collision at intersection"),
AccidentDate: silentwitness.String("2024-03-15"),
})
if err != nil {
log.Fatalf("Report creation failed: %v", err)
}
fmt.Printf("Report created: %s\n", report.ReportId)

// Step 4: Poll for completion
for {
status, err := silentwitness.Reports.GetResult(ctx, &silentwitness.GetResultRequest{
ReportId: report.ReportId,
})
if err != nil {
log.Fatalf("Failed to check status: %v", err)
}

fmt.Printf("Status: %s\n", status.Status)

if status.Status == "completed" {
fmt.Printf("✅ Report ready: %s\n", *status.ReportUrl)
break
} else if status.Status == "failed" {
log.Fatal("Report generation failed")
}

time.Sleep(5 * time.Second)
}
}

Understanding the Workflow

1. Create a Case

Create a case to organize your files and reports:

const caseResp = await createCase({
name: "Smith v. Johnson - Intersection Collision",
clientName: "Jane Smith"
});

2. Upload Photos

Upload vehicle damage photos associated with the case:

const upload = await uploadFile({
content: photoData,
filename: "vehicle-damage-front.jpg",
purpose: "crash_analysis_plaintiff",
caseId: caseId
});

Purpose values:

  • crash_analysis_plaintiff - Photos of the plaintiff's vehicle
  • crash_analysis_defendant - Photos of the defendant's vehicle (optional)

3. Create Report

Submit vehicle details and photos to generate the report:

const report = await createReport({
caseId: caseId,
plaintiff: {
imageFileIds: [fileId1, fileId2],
vehicleMaker: "Toyota",
vehicleModel: "Camry",
vehicleYear: "2020",
seatbelt: true,
airbagsDeployed: AirbagsDeployed.YES
},
accidentDescription: "Rear-end collision at intersection",
accidentDate: "2024-03-15"
});

Required fields:

  • caseId - Case identifier
  • plaintiff.imageFileIds - At least one photo

Optional fields:

  • plaintiff.vehicleMaker, vehicleModel, vehicleYear
  • plaintiff.seatbelt, airbagsDeployed
  • defendant - Second vehicle data (for two-vehicle crashes)
  • accidentDescription, accidentDate, accidentTime, accidentLocation

4. Monitor Progress

Poll the report status every 3-5 seconds:

const status = await getReportResult({ reportId: report.reportId });

if (status.status === "completed") {
console.log(`Report ready: ${status.reportUrl}`);
}

Status values:

  • pending - Queued for processing
  • processing - Currently generating
  • completed - Report ready at reportUrl
  • failed - Generation failed

Report Contents

The completed PDF includes:

  • Delta-V calculations - Change in velocity for each vehicle
  • Principal Direction of Force (PDOF) - Impact angle analysis
  • Biomechanics analysis - HIC-15, NIJ, chest acceleration
  • Injury risk assessment - Probability of injury by severity
  • Vehicle damage analysis - Photo-based damage assessment

Troubleshooting

File Upload Issues

  • Maximum file size: 50MB per file
  • Supported formats: JPEG, PNG
  • Ensure the case exists before uploading files

Report Creation Issues

  • At least one plaintiff photo is required
  • Vehicle year must be 4 digits (e.g., "2020")
  • Date format: YYYY-MM-DD (e.g., "2024-03-15")

Polling Tips

  • Poll every 3-5 seconds
  • Reports typically complete in 2-5 minutes
  • Implement exponential backoff for production use

Next Steps