Vídeos do produto
Lista, adiciona (YouTube, Vimeo, arquivo ou trecho de live), edita, reordena e remove os vídeos da galeria de um produto.
Além das imagens, a galeria de um produto pode ter até 3 vídeos. Eles aparecem como slides ao lado das fotos na página do produto. Cada vídeo tem um tipo, uma miniatura (sempre obrigatória, é o que o cliente vê antes de dar play) e uma posição.
Todas as rotas desta página exigem o privilégio view_catalog (leitura) ou manage_catalog (escrita).
Listar os vídeos
/api/v1/admin/products/{id}/videosAdminLista os vídeos de um produto
Devolve os vídeos do produto em ordem de posição.
Path parameters
iduuidobrigatórioExemplo de requisição
curl "$BASE_URL/api/v1/admin/products/$PRODUCT_ID/videos" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"videos": [
{
"id": "7c0d3b52-6e1f-4f8a-9d57-0a4b1c2e8f31",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"video_type": "youtube",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"thumbnail_url": "https://img.youtube.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
"title": "Demonstração",
"position": 0
},
{
"id": "b19e4a07-3c85-42d0-8e6b-5f7a9c1d2e44",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"video_type": "vimeo",
"url": "https://vimeo.com/76979871",
"thumbnail_url": "https://cdn.minhaloja.com.br/p/video-capa.jpg",
"title": "Detalhes",
"position": 1
}
]
}Response fields
videosarrayVídeos em ordem de position. Lista vazia quando não há vídeos.
iduuidproduct_iduuidvideo_typestringuploadyoutubevimeolive_clipurlstringyoutube e vimeo é a forma canônica do link (https://www.youtube.com/watch?v=ID, https://vimeo.com/ID). Para upload é o endereço do arquivo hospedado pela plataforma.thumbnail_urlstringtitlestringpositionintegerlive_session_iduuidlive_clip: a transmissão de origem.clip_start_sintegerlive_clip: segundo em que o trecho começa.clip_end_sintegerlive_clip: segundo em que o trecho termina.size_bytesintegerupload: tamanho do arquivo em bytes.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 | Sem token. | {"error":"missing authorization header"} |
| 403 | Sem view_catalog nem manage_catalog. | {"error":"insufficient privileges","privilege_required_any":["manage_catalog","view_catalog"]} |
| 500 | O id não é um UUID válido. | {"error":"failed to get product videos","detail":"..."} |
Um UUID de produto que não existe devolve 200 com "videos": [].
Adicionar um vídeo
/api/v1/admin/products/{id}/videosAdminAdiciona um vídeo (link ou clipe ao vivo, em JSON)
Exige manage_catalog. O corpo é JSON para os tipos youtube, vimeo e live_clip. Para enviar um arquivo (upload) use a variante multipart logo abaixo.
Path parameters
iduuidobrigatórioRequest body (JSON)
video_typestringobrigatórioyoutubevimeolive_clipinvalid video_type. Para enviar um arquivo (upload) use a variante multipart abaixo.urlstringobrigatórioyoutube.com/watch?v=..., youtube.com/embed/..., youtube.com/shorts/... ou youtu.be/.... Vimeo: vimeo.com/ID ou vimeo.com/video/ID. A plataforma troca o link pela forma canônica. Em live_clip pode ser omitido quando você envia live_session_id (veja abaixo).thumbnail_urlstringvimeo e live_clip. Em youtube, se omitido, a plataforma usa a miniatura do próprio YouTube.titlestringlive_session_iduuidlive_clip: a transmissão ao vivo de origem. Quando você a envia sem url, a plataforma copia o endereço da gravação (a transmissão precisa estar encerrada e ter gravação; senão 422 invalid live clip).clip_start_sintegerlive_clip, obrigatório: segundo em que o trecho começa (0 ou mais).clip_end_sintegerlive_clip, obrigatório: segundo em que o trecho termina. Precisa ser maior que clip_start_s.Exemplo de requisição (link do YouTube)
curl -X POST "$BASE_URL/api/v1/admin/products/$PRODUCT_ID/videos" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"video_type": "youtube",
"url": "https://youtu.be/dQw4w9WgXcQ",
"title": "Demonstração"
}'Resposta
{
"id": "7c0d3b52-6e1f-4f8a-9d57-0a4b1c2e8f31",
"product_id": "c3f92551-9dda-4fc7-b518-353d1c4e4035",
"video_type": "youtube",
"url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"thumbnail_url": "https://img.youtube.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
"title": "Demonstração",
"position": 0
}O vídeo entra na última posição. Os campos são os da listagem.
Enviar um arquivo (multipart)
Para um vídeo upload, a mesma rota recebe multipart/form-data (o Content-Type com boundary é montado pela sua biblioteca HTTP; não o escreva à mão).
Request body (multipart/form-data)
filefileobrigatóriothumbnailfileobrigatóriotitlestringcurl -X POST "$BASE_URL/api/v1/admin/products/$PRODUCT_ID/videos" \
-H "Authorization: Bearer $TOKEN" \
-F "file=@demo.mp4;type=video/mp4" \
-F "thumbnail=@capa.jpg;type=image/jpeg" \
-F "title=Demonstração"A resposta é a mesma (201), com video_type "upload", url apontando para o arquivo hospedado pela plataforma e size_bytes preenchido.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo JSON inválido, ou multipart ilegível. | {"error":"invalid request body","detail":"..."} / {"error":"failed to parse upload","detail":"..."} |
| 400 | Upload sem o campo file. | {"error":"file is required","detail":"..."} |
| 404 | Produto não encontrado. | {"error":"product not found"} |
| 422 | Já há 3 vídeos. Esta checagem vem antes das demais: com 3 vídeos, qualquer envio responde isto. | {"error":"max 3 videos per product"} |
| 422 | video_type desconhecido. | {"error":"invalid video_type"} |
| 422 | Link que não é do YouTube ou do Vimeo. | {"error":"invalid youtube url"} ou {"error":"invalid vimeo url"} |
| 422 | url vazia. | {"error":"url is required"} |
| 422 | Sem miniatura (Vimeo, live_clip, upload). | {"error":"thumbnail is required"} |
| 422 | live_clip com clip_start_s ausente ou não menor que clip_end_s. | {"error":"live clip requires 0 <= start_s < end_s"} |
| 422 | Transmissão sem gravação, ou ainda no ar. | {"error":"invalid live clip","detail":"session has no replay"} |
| 422 | Arquivo que não é MP4/WebM, ou acima de 200 MB. | {"error":"invalid video file","detail":"unrecognized video container (only mp4/webm allowed)"} |
| 401 / 403 | Sem token / sem manage_catalog. | {"error":"insufficient privileges","required":"manage_catalog"} |
Editar título e posição
/api/v1/admin/products/{id}/videos/{videoId}AdminAltera o título ou a posição de um vídeo
Exige manage_catalog. Atualização parcial: envie só o que muda. Não troca o link nem o arquivo: para isso, remova o vídeo e adicione outro.
Path parameters
iduuidobrigatóriovideoIduuidobrigatórioCorpo da requisição
titlestringpositionintegerExemplo de requisição
curl -X PUT "$BASE_URL/api/v1/admin/products/$PRODUCT_ID/videos/$VIDEO_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"title": "Novo título"
}'Resposta
{ "message": "updated" }Um corpo sem title nem position também responde 200 e não altera nada.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo inválido. | {"error":"invalid request body","detail":"..."} |
| 404 | O vídeo não existe. | {"error":"video not found"} |
| 401 / 403 | Sem token / sem manage_catalog. | {"error":"insufficient privileges","required":"manage_catalog"} |
Reordenar os vídeos
/api/v1/admin/products/{id}/videos/reorderAdminDefine a ordem de exibição dos vídeos
Exige manage_catalog. Envie os ids na ordem desejada; o primeiro fica na posição 0. É um POST (e não PUT) nesta rota.
Path parameters
iduuidobrigatórioCorpo da requisição
video_idsarrayobrigatório200.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/products/$PRODUCT_ID/videos/reorder" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"video_ids": [
"b19e4a07-3c85-42d0-8e6b-5f7a9c1d2e44",
"7c0d3b52-6e1f-4f8a-9d57-0a4b1c2e8f31"
]
}'Resposta
{ "message": "reordered" }Para ver a ordem nova, chame a listagem de novo.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Corpo inválido. | {"error":"invalid request body","detail":"..."} |
| 500 | Um id não é um UUID. | {"error":"failed to reorder videos","detail":"..."} |
| 401 / 403 | Sem token / sem manage_catalog. | {"error":"insufficient privileges","required":"manage_catalog"} |
Remover um vídeo
/api/v1/admin/products/{id}/videos/{videoId}AdminRemove a video
Exige manage_catalog. Remove o vídeo da galeria. Se ele era um upload, a plataforma também apaga o arquivo hospedado.
Path parameters
iduuidobrigatóriovideoIduuidobrigatórioExemplo de requisição
curl -X DELETE "$BASE_URL/api/v1/admin/products/$PRODUCT_ID/videos/$VIDEO_ID" \
-H "Authorization: Bearer $TOKEN"Resposta
{ "message": "deleted" }Erros
| Status | Quando | Corpo |
|---|---|---|
| 404 | O vídeo não existe (inclusive ao repetir o DELETE). | {"error":"video not found"} |
| 401 / 403 | Sem token / sem manage_catalog. | {"error":"insufficient privileges","required":"manage_catalog"} |
Veja também
- Mídia do produto: visão geral, limites e o mapa das rotas.
- Imagens do produto
- Anexos do produto
- Consultar produto