Errors and FAQs

Every Studio Promote error comes back with "success": false and a code. Decide what to do from code; message is written for people and can change.

{
  "success": false,
  "statusCode": 400,
  "code": "VEHICLE_NOT_FOUND",
  "message": "1 vehicle(s) could not be found in inventory",
  "data": { "notFound": ["NOT-A-VIN"] }
}

Error codes

CodeStatusWhat happenedWhat to do
INVALID_REQUEST400Something in the request is wrong. details.errors lists every problem at once.Fix each one and send again.
UNAUTHORIZED401The API key is missing or wrong.Send Authorization: Bearer YOUR_API_KEY. If a key that works gets this once, retry.
TEAM_NOT_RESOLVED400The key isn't linked to a rooftop.Generate a key for the rooftop in Developer Hub.
VEHICLE_NOT_FOUND400A vehicle isn't in this rooftop's inventory, or an entry has no usable identifier. data.notFound lists which.Check the VIN or stock number.
VEHICLE_AMBIGUOUS400One value matches two different vehicles. data.ambiguous shows them.Send the VIN instead.
VEHICLE_IN_OTHER_PROMOTION409A vehicle is already in another hand-picked promotion. data.conflicts names it.Complete or delete that promotion, or leave the vehicle out.
ASSET_NOT_FOUND400An image id can't be used, or a link matches an image that was deleted.Pick an id from List images, or change the link (for example, add ?v=2).
INVALID_ASSET_URL400An image link is malformed, private or internal, doesn't resolve, or didn't answer within 30 seconds.Use a public link to a PNG or JPG.
PROMOTION_NOT_FOUND404There's no such promotion for this rooftop.Check the id.
INVALID_STATUS_CHANGE409That action, or a delete, isn't allowed in the current status.See the table in Change status.
VALIDATION_FAILED400Spyne refused the request; details or message explains why.Fix what it describes.
RATE_LIMITED429Too many calls this minute.Wait the seconds in the Retry-After header, then retry.
SERVICE_UNAVAILABLE502 or 503A Spyne service is briefly unavailable.Wait a moment and retry.

An unexpected server error can also return a bare 500 with no body. Retry it like SERVICE_UNAVAILABLE.

Rate limits

CallsLimit per rooftop
Changes: create (including dry runs), change status, delete, add an image30 a minute
Reads: list and retrieve promotions, list images120 a minute

The limit is shared by everyone using the rooftop and resets at the start of each clock minute (:00). Invalid requests count too.

Common questions

Can I change a promotion after creating it? Not yet: there's no edit call. Complete or delete it, then create a new one with your changes.

Why don't the photos change straight away? They're updated in the background over the next few minutes. Retrieve the promotion to see its status.

What's the difference between pause and complete? Pause stops the promotion and lets you resume it with activate. Complete ends it for good and can't be undone.

Can a vehicle be in two promotions? A vehicle shows one promotion at a time, and priority decides which. A vehicle already in another hand-picked promotion is refused with 409: complete or delete that promotion first. Moving it across automatically (allowReassignment) isn't supported yet.

Why did I get 429 after only a few calls? Calls made earlier in the same clock minute count, including other people's calls for the same rooftop. Wait the seconds in Retry-After.

Why does Transform a vehicle refuse my banner? While the rooftop has a promotion that is active, scheduled or paused, a Transform a vehicle request carrying its own mediaKitConfig.banner or billboard is refused, because the promotion would override it. Complete the promotion first; pausing isn't enough.

Can I delete an image I uploaded? Not through this API. Reuse it in other promotions with its assetId.

How do I test safely? Use dry runs while you build. Create test promotions as drafts ("draft": true), then delete them when you're done.


Did this page help you?