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:
- Go
- TypeScript
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)
}
}
import { SilentWitnessClient } from "@silentwitness/typescript-sdk";
import fs from "fs";
async function main() {
// Initialize the API client
const client = new SilentWitnessClient({
apiKey: "sk_test_your_api_key"
});
try {
// Step 1: Create a case
const caseResp = await client.cases.createCase({
name: "Smith v. Johnson - Intersection Collision",
clientName: "Jane Smith"
});
const caseId = caseResp.case?.id!;
console.log(`Created case: ${caseId}`);
// Step 2: Upload vehicle photos
const photoData = fs.readFileSync("vehicle-damage-front.jpg");
const upload = await client.files.uploadFile({
content: photoData,
filename: "vehicle-damage-front.jpg",
purpose: "crash_analysis_plaintiff",
caseId: caseId
});
console.log(`Uploaded file: ${upload.fileId}`);
// Step 3: Create technical report
const report = await client.reports.createReport({
caseId: caseId,
plaintiff: {
imageFileIds: [upload.fileId],
vehicleMaker: "Toyota",
vehicleModel: "Camry",
vehicleYear: "2020",
seatbelt: true,
airbagsDeployed: "FRONT_ONLY"
},
accidentDescription: "Rear-end collision at intersection",
accidentDate: "2024-03-15"
});
console.log(`Report created: ${report.reportId}`);
// Step 4: Poll for completion
while (true) {
const status = await client.reports.getResult({ reportId: report.reportId });
console.log(`Status: ${status.status}`);
if (status.status === "completed") {
console.log(`✅ Report ready: ${status.reportUrl}`);
break;
} else if (status.status === "failed") {
throw new Error("Report generation failed");
}
await new Promise(resolve => setTimeout(resolve, 5000));
}
} catch (error) {
console.error("Error:", error);
}
}
main();
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 vehiclecrash_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 identifierplaintiff.imageFileIds- At least one photo
Optional fields:
plaintiff.vehicleMaker,vehicleModel,vehicleYearplaintiff.seatbelt,airbagsDeployeddefendant- 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 processingprocessing- Currently generatingcompleted- Report ready atreportUrlfailed- 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
- API Reference - See all available report fields
- File Management - Learn about file operations
- Case Management - Organize your work with cases