Explaining API and Webhook Response
Sample Response:
{
  "vin": "M64QSUZG39P400000",
  "source": "console",
  "dealerId": "e2adca58-66bc-4d56-ad16-f73823af9ba1",
  "dealerVinID": "e2adca58-66bc-4d56-ad16-f73823af9ba1",
  "mediaData": {
    "image": {
            "aiStatus": "DONE",
            "qcStatus": "qc_done",
            "rejectReason": null,
            "failReason": null,
            "imageData": [
                {
                    "angle": 270,
                    "status": "Done",
                    "frameNo": "1",
                    "imageId": "img-736d959a-00b3-40cb-9c96-31eafec2e73d",
                    "imageName": "74ccc7e1-4ad9-44b4-a9f0-a671d4807d99",
                    "inputImage": "https://spyne-media.s3.amazonaws.com/2025-01-22/ebc8485a-eda7-432d-b20a-98a61264bf51.jpeg",
                    "outputImage": "https://spyne-media.s3.amazonaws.com/2025-01-22/car_replace_bg_4af789dd-8667-489b-a45d-cda94be7833d.jpg",
                    "backgroundId": "85879",
                    "rejectReason": null,
                    "category": "Exterior",
                    "clientMetaData": {}
                },
                {
                    "angle": 320,
                    "status": "Done",
                    "frameNo": "2",
                    "imageId": "img-c0d1294e-cc1c-4181-9282-d13c3049c7a7",
                    "imageName": "a36d65a4-7cb5-4600-b572-cf78961247f9",
                    "inputImage": "https://spyne-media.s3.amazonaws.com/2025-01-22/0b22d7d4-252a-4039-b99a-53976995ce6b.jpeg",
                    "outputImage": "https://spyne-media.s3.amazonaws.com/2025-01-22/car_replace_bg_650da078-416f-4ef4-9f5d-0865cff77137.jpg",
                    "backgroundId": "85879",
                    "rejectReason": null,
                    "category": "Exterior",
                    "clientMetaData": {}
                }
            ]
        },
    "spin": {
      "aiStatus": "DONE",
      "qcStatus": "qc_done",
      "rejectReason": null,
      "failReason": null,
      "irameUrl": "https://assets.spyne.ai/360?sku_id=174797042a304189ade91903c9bb909a&hotspot=false&hideConfig=true",
      "thumbnailUrl": "https://spyne-media.s3.amazonaws.com/2025-01-20/0afba6f9-e56a-45ac-9f08-ef893ac3c8aa.jpg"
    },
    "video":{
      "videoId": "vid-ce92c677d67e4772be2ab39ee28b285f",
      "aiStatus": "DONE",
      "qcStatus": "qc_done",
      "rejectReason": null,
      "failReason": null,
      "iFrameUrl": "https://assets.spyne.ai/sku_id=f032881b823f42438862ce306c29b6f4&version=v2"
    }
  }
}Top-Level Fields
| Field | Description | 
|---|---|
| vin | Vehicle Identification Number submitted for transformation | 
| source | The origin of the request, such as console,sdk, orapi | 
| dealerId | Unique ID of the dealer who initiated the transformation. Also known as team id in spyne's ecosystem. | 
| dealerVinID | Internal Spyne ID assigned to this transformation session. This is a unique id for each vehicle. | 
| mediaData | Contains media output sections: image,spin, andvideo | 
mediaData.image
mediaData.image| Field | Description | 
|---|---|
| aiStatus | AI processing result: DONE,PROCESSING, orFAILED | 
| qcStatus | Manual Quality Check status: qc_done,pending, orrejected | 
| rejectReason | Explanation if image QC failed, otherwise null | 
| imageData[] | Array of images with transformation metadata | 
imageData[] Entry:
imageData[] Entry:| Field | Description | 
|---|---|
| angle | Shooting angle of the image (e.g., 270) | 
| frameNo | Sequence number of the frame | 
| imageId | Internal Spyne's ID for the image | 
| inputImage | URL of the original uploaded image | 
| outputImage | URL of the AI-processed studio-quality image | 
| backgroundId | ID of the background used | 
| category | Image classification (e.g., Exterior,Interior,Misc) | 
🔁 mediaData.spin
mediaData.spin| Field | Description | 
|---|---|
| aiStatus | AI processing result | 
| qcStatus | Manual QC result | 
| iframeUrl | URL to embed the 360 spin viewer | 
| thumbnailUrl | Thumbnail preview of the 360 spin | 
| rejectReason | Reason for rejection if any | 
mediaData.video
mediaData.video| Field | Description | 
|---|---|
| videoId | Unique ID assigned to the video | 
| aiStatus | AI processing result | 
| qcStatus | Manual QC result | 
| iframeUrl | Embeddable player URL for the feature video | 
| rejectReason | Reason for rejection if applicable | 
Status Field Reference
| Field | Possible Values | Meaning | 
|---|---|---|
| aiStatus | DONE,PROCESSING,FAILED | AI lifecycle status of media transformation | 
| qcStatus | qc_done,pending,rejected | Manual QC lifecycle status | 
| rejectReason | String or null | If present, describes why media was rejected | 
🧠 Developer Tips
- Only the media types originally submitted (image,spin,video) will appear.
- Always check both aiStatusandqcStatusbefore using or displaying media.
- Use iframeUrlandthumbnailUrlfields for embedding media in UIs.
- Log or display rejectReasonto help users understand rejections.
- Poll this API until you receive aiStatus = DONEfor all assets or set up a webhook.
Updated 5 months ago
