Get started
Reference inputs
Upload photos, videos, and audio, then use their ordered URLs within each model's published limits.
Follow the selected model
Read each model's references block first. A zero means that kind is unavailable. Counts, byte limits, video duration, and the audio visual requirement come from the same model registry used by Cinema. Direct, signed, and verification calls share one limit of 10 uploads per minute and 500 per day per API key.
Upload a photo, then generate with @image1
Uploads belong to the API-key account. A signed PUT remains a staging object until verification; only the URL returned by verify can be used as a reference. Verify replaces any PUT Content-Type with the detected file type. Preserve array order: the first URL is @image1, the first video is @video1, and the first audio file is @audio1.
SIGNED=$(curl -X POST "https://reviral.ai/api/v1/uploads/sign" \
-H "Authorization: Bearer $REVIRAL_API_KEY" \
-H "Content-Type: application/json" \
--data '{"kind":"video","contentType":"video/mp4","bytes":8000000,"filename":"clip.mp4"}')
UPLOAD_ID=$(printf '%s' "$SIGNED" | jq -r '.data.id')
UPLOAD_URL=$(printf '%s' "$SIGNED" | jq -r '.data.uploadUrl')
curl -X PUT "$UPLOAD_URL" --data-binary @clip.mp4
VIDEO_URL=$(curl -X POST "https://reviral.ai/api/v1/uploads/verify" \
-H "Authorization: Bearer $REVIRAL_API_KEY" -H "Content-Type: application/json" \
--data '{"id":"'"$UPLOAD_ID"'"}' | jq -r '.data.url')
PHOTO_URL=$(curl -X POST "https://reviral.ai/api/v1/uploads" \
-H "Authorization: Bearer $REVIRAL_API_KEY" \
-F "kind=image" -F "file=@product.jpg" | jq -r '.data.url')
curl -X POST "https://reviral.ai/api/v1/generate-media" \
-H "Authorization: Bearer $REVIRAL_API_KEY" \
-H "Content-Type: application/json" \
--data '{"model":"seedance-2","prompt":"Reveal @image1 and @video1","referenceImageUrls":["'"$PHOTO_URL"'"],"referenceVideoUrls":["'"$VIDEO_URL"'"]}'