Pular para o conteúdo
Decoding Chat API

Memes

Um meme é um recurso de imagem, vídeo ou áudio salvo como favorito. O Decoding Chat armazena uma cópia da mídia junto com o meme. A cópia permanece disponível mesmo após a URL ou a mensagem de origem ser excluída.

As rotas aqui são de uso exclusivo do usuário e operam na própria coleção do autor da chamada. O Decoding Chat rejeita um token de bot com 403 ACCESS_DENIED. Criar mensagem envia um meme armazenado através do campo favorite_meme_id, e a API de provedor de GIFs pesquisa no provedor configurado por um GIF a ser salvo.

O Decoding Chat limita uma coleção ao teto configurado na instância pelo limite max_favorite_memes, com fallback de 50. Ambas as operações de criação verificam a contagem antes de consultar o canal ou a mensagem e antes de buscar a URL de origem, portanto uma conta que atingiu seu limite é recusada com 400 MAX_FAVORITE_MEMES mesmo que o restante da solicitação apresentasse erro. O corpo do erro informa em max_favorite_memes o teto atingido.

Um meme possui no máximo max_favorite_meme_tags tags, com fallback de 10. O Decoding Chat rejeita uma lista mais longa com 400 INVALID_FORM_BODY e o código de validação MAX_FAVORITE_MEME_TAGS_EXCEEDED no caminho tags.

O Decoding Chat normaliza e remove espaços das bordas de uma tag antes de contá-la, e o resultado deve ter de 1 a 30 caracteres. Uma tag que normaliza para uma string vazia falha com 400 INVALID_FORM_BODY e STRING_LENGTH_INVALID.

Um meme é identificado pelo hash de conteúdo dos seus bytes armazenados. Os mesmos bytes alcançados por meio de uma URL diferente ou de uma mensagem diferente ainda são considerados duplicados. Salvar um recurso cujo hash já existe na coleção da conta retorna 400 INVALID_FORM_BODY com o código de validação MEDIA_ALREADY_IN_FAVORITE_MEMES no caminho media. O meme existente não é retornado e nada é criado.

Um recurso de mídia pertencente a uma conta. O Decoding Chat resolve todos os campos de mídia no momento da criação, e apenas o nome, o texto alternativo (alt text) e as tags podem mudar depois.

CampoTipoDescrição
idsnowflakeO ID do meme
user_idsnowflakeO ID da conta proprietária
name1stringO nome de exibição do meme (1-100 caracteres)
alt_text2?stringA descrição de acessibilidade da mídia, ou nulo quando nenhuma foi definida
tagsarray[string]As tags de busca armazenadas no meme, cada uma com 1-30 caracteres
attachment_id3snowflakeO ID do anexo que guarda a cópia durável no Decoding Chat
filenamestringO nome de arquivo da cópia armazenada
content_typestringO tipo MIME da cópia armazenada
content_hash?stringO hash de conteúdo usado para deduplicação, ou nulo quando não estiver disponível
sizeintegerO tamanho armazenado da cópia em bytes
width?integerA largura da mídia em pixels, ou nulo quando não aplicável ou desconhecido
height?integerA altura da mídia em pixels, ou nulo quando não aplicável ou desconhecido
duration?numberA duração da mídia em segundos, ou nulo quando não aplicável ou desconhecido
url3stringA URL de anexo no Decoding Chat da cópia armazenada
is_gifv4booleanSe a mídia armazenada é animada ou um vídeo convertido a partir de um GIF
gif_slug5?stringO slug emitido pelo provedor de onde este meme se originou, ou nulo
gif_provider5?stringO nome do provedor de GIF que emitiu gif_slug, ou nulo
media6?map[string, objeto formato de mídia GIF]O mapa de formatos do provedor para um meme originado de GIF, ou nulo
placeholder?stringO placeholder thumbhash compacto registrado no momento do salvamento, ou nulo

1 Obrigatório em Salvar meme da mensagem. Salvar meme a partir de URL o deriva do filename, truncado para 100 caracteres, quando for omitido ou nulo

2 Salvar meme da mensagem utiliza como fallback a descrição do próprio anexo selecionado caso o corpo não forneça um alt text não vazio

3 url é o endpoint de mídia seguido por attachments/{user_id}/{attachment_id}/{filename}, e o Decoding Chat a assina a cada leitura como uma URL de anexo assinada

4 Definido quando o anexo ou incorporação (embed) de origem já era animado, e quando o Proxy de Mídia relata a cópia armazenada como animada

5 Ambos os campos ficam nulos juntos. klipy é o único valor registrado em novos memes, e tenor aparece apenas em registros legados

6 Indexado pelo nome de formato de mídia GIF. Armazenado apenas por Salvar meme a partir de URL, sendo nulo em qualquer meme originado de mensagem

Um meme originado de mensagem registra um slug somente quando o embed selecionado for do tipo gifv cuja URL é reconhecida pelo provedor configurado. Uma seleção de anexo nunca registra um slug.

O horário de criação é o timestamp embutido no id, conforme definido em Snowflakes.

{
"id": "1501314428688998182",
"user_id": "1501314428688990000",
"name": "party_parrot.gif",
"alt_text": null,
"tags": ["parrot", "party"],
"attachment_id": "1501314428688998183",
"filename": "party_parrot.gif",
"content_type": "image/gif",
"size": 40213,
"width": 320,
"height": 240,
"is_gifv": true,
"gif_slug": "party-parrot-1234",
"gif_provider": "klipy",
"placeholder": "3PcNNYYONWQPFxrsUeUcRh4"
}

Um descritor que define uma codificação de um GIF do provedor. Um provedor retorna diversas variantes do mesmo GIF para que o cliente possa escolher a menor codificação que conseguir decodificar.

CampoTipoDescrição
srcstringA URL direta da mídia deste formato
proxy_srcstringA URL do Proxy de Mídia deste formato
width1integerA largura deste formato em pixels
height1integerA altura deste formato em pixels

1 Um valor não negativo de no máximo 2147483647. Um descritor com src ou proxy_src vazio, ou dimensão zero, é ignorado quando o Decoding Chat escolhe o formato de pré-visualização para Resolver URLs de GIF

Um cliente que envia um mapa de formatos para Salvar meme a partir de URL deve fornecer todos os membros de cada descritor; qualquer descritor incompleto falha na validação com 400 INVALID_FORM_BODY.

ValorDescrição
webmVídeo WebM em tamanho total
mp4Vídeo MP4 em tamanho total
webpImagem WebP em tamanho total
gifImagem GIF em tamanho total
mediumwebmVídeo WebM médio
mediummp4Vídeo MP4 médio
mediumwebpImagem WebP média
mediumgifImagem GIF média
tinywebmVídeo WebM pequeno
tinymp4Vídeo MP4 pequeno
tinywebpImagem WebP pequena
tinygifImagem GIF pequena
nanowebmMenor vídeo WebM
nanomp4Menor vídeo MP4
nanowebpMenor imagem WebP
nanogifMenor imagem GIF
loopedmp4Vídeo MP4 em loop contínuo

Um mapa contém apenas os formatos retornados pelo provedor, portanto nenhuma chave é garantida. O cliente deve percorrer uma lista de prioridades até encontrar uma chave disponível no mapa. Clientes que não puderem decodificar formatos de vídeo DEVEM preferir tinywebp, tinygif, mediumwebp, mediumgif, webp, gif, nanowebp e nanogif, nessa ordem.

Uma entrada que descreve uma URL submetida a Resolver URLs de GIF.

CampoTipoDescrição
url1stringA URL do GIF de origem
proxy_urlstringA URL assinada do Proxy de Mídia para o formato de pré-visualização
width2integerA largura do formato de pré-visualização em pixels
height2integerA altura do formato de pré-visualização em pixels
media3map[string, objeto formato de mídia GIF]Os formatos disponíveis para a URL, indexados pelo nome de formato de mídia GIF
content_type4stringO tipo MIME da mídia apontada por proxy_url
placeholder?stringO placeholder thumbhash compacto, ou nulo se o Proxy de Mídia não tiver emitido nenhum

1 A URL canônica do próprio provedor caso a URL submetida tenha sido resolvida através do provedor de GIF configurado, ou a própria URL submetida caso contrário

2 Zero caso as dimensões não tenham sido determinadas

3 Vazio quando a URL não pertencer a nenhum provedor de GIF registrado e nenhum formato direto individual puder ser derivado dela

4 Uma string vazia indica tipo desconhecido, e o cliente deve tratar como image/gif

Um formato direto é derivado somente para video/webm, video/mp4, image/webp e image/gif, e apenas se ambas as dimensões forem positivas.

O formato de pré-visualização é o primeiro descritor utilizável na ordem: tinywebm, tinymp4, mediumwebm, mediummp4, webm, mp4, loopedmp4, nanowebm, nanomp4, tinywebp, tinygif, mediumwebp, webp, mediumgif, gif, nanowebp, nanogif. Caso nenhuma chave dessa lista seja utilizável, o Decoding Chat seleciona o primeiro descritor utilizável na ordem do mapa. Se o mapa não contiver nada utilizável, seleciona a mídia de nível superior do próprio provedor.

GET/v1/users/@me/memes

Retorna todos os objetos de meme da conta atual, em ordem decrescente de ID, de modo que o salvo mais recentemente apareça primeiro.

O limite da coleção da conta restringe quantos itens o array contém.

StatusCorpoCondição
200array[objeto meme]A coleção foi retornada, possivelmente como um array vazio
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY

60 requisições a cada 10 segundos por usuário autenticado, no bucket favorite_meme:list.

POST/v1/users/@me/memes

Busca uma URL de mídia absoluta, armazena uma cópia durável no Decoding Chat e retorna o objeto de meme criado. Emite um evento de Gateway Favorite Meme Create.

CampoTipoDescrição
urlstringA URL absoluta da mídia a ser obtida e armazenada
name?1?stringO nome de exibição do meme (1-100 caracteres)
alt_text??stringA descrição de acessibilidade da mídia (0-500 caracteres)
tags?2?array[string]As tags de busca a armazenar, cada uma com 1-30 caracteres
gif_slug?3?stringO slug emitido pelo provedor ou token slug-id para o GIF (1-300 caracteres)
gif_provider?3?stringO nome estável do provedor que emitiu gif_slug (1-32 caracteres)
media?4?map[string, objeto formato de mídia GIF]O mapa de formatos do provedor capturado pelo cliente no momento do salvamento

1 Quando omitido ou nulo, o nome será o filename armazenado truncado em 100 caracteres

2 Um valor omitido ou nulo resulta em uma lista de tags vazia

3 O Decoding Chat usa o par fornecido apenas quando ambos estão presentes e gif_provider corresponde ao provedor configurado. Caso contrário, extrai um slug da url usando o provedor configurado

4 Armazenado apenas quando a solicitação for resolvida para um GIF de provedor e o mapa não for vazio; descartado caso contrário

O nome do arquivo é derivado da URL e do tipo de mídia. Utilize o filename retornado em vez de gerar um manualmente.

Uma URL que não resolva para nenhuma mídia utilizável falha com 400 MEDIA_METADATA_ERROR. Salvar uma mídia já presente na coleção falha conforme descrito em Deduplicação.

StatusCorpoCondição
201objeto memeO meme foi criado
400resposta de erroO corpo falha na validação com INVALID_FORM_BODY5
400resposta de erroA URL não resolve para nenhuma mídia utilizável com MEDIA_METADATA_ERROR
400resposta de erroA coleção atingiu seu limite máximo com MAX_FAVORITE_MEMES
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY

5 Incluindo MAX_FAVORITE_MEME_TAGS_EXCEEDED no caminho tags e MEDIA_ALREADY_IN_FAVORITE_MEMES no caminho media

A operação emite um evento Favorite Meme Create com o objeto criado para as sessões do próprio autor da chamada.

20 requisições por minuto por usuário autenticado, no bucket favorite_meme:create:url.

POST/v1/channels/{channel_id}/messages/{message_id}/memes

Copia um anexo ou recurso de incorporação (embed) de uma mensagem legível para a coleção do próprio usuário e retorna o objeto de meme criado. Requer VIEW_CHANNEL em canais de servidor. Emite um evento de Gateway Favorite Meme Create.

Um autor de chamada em servidor sem READ_MESSAGE_HISTORY só pode selecionar mídias de mensagens enviadas a partir do limite de histórico de mensagens do servidor. Anexos e incorporações presentes em mensagens encaminhadas podem ser selecionados juntamente com os da própria mensagem.

CampoTipoDescrição
channel_idsnowflakeO ID do canal que contém a mensagem
message_idsnowflakeO ID da mensagem que contém a mídia selecionada
CampoTipoDescrição
namestringO nome de exibição do meme (1-100 caracteres)
attachment_id?1?snowflakeO ID de um anexo na mensagem ou em seus encaminhamentos
embed_index?1 2?integerO índice baseado em zero de um embed na mensagem ou em seus encaminhamentos
alt_text?3?stringA descrição de acessibilidade da mídia (0-500 caracteres)
tags??array[string]As tags de busca a serem armazenadas, cada uma com 1-30 caracteres

1 Pelo menos uma das chaves deve estar presente; corpo sem nenhuma falha na validação. Ambas podem ser nulas, o que não seleciona nada explicitamente

2 embed_index tem precedência quando ambos possuem valor, e um índice fora dos limites falha com EMBED_INDEX_OUT_OF_BOUNDS

3 Obtido a partir da descrição do próprio anexo selecionado caso o valor fornecido seja omitido, nulo, vazio ou somente espaços em branco

Quando nenhuma chave seleciona algo explicitamente, o Decoding Chat escolhe o primeiro anexo da mensagem. Ele escolhe o primeiro embed utilizável se a mensagem não possuir anexos, ou se o anexo não tiver um tipo de mídia suportado. Uma seleção de embed não possui alt text próprio.

Apenas recursos image/*, video/* ou audio/* podem ser salvos. attachment_id só é validado se a mensagem contiver ao menos um anexo. Um ID que não coincida com nenhum falha com ATTACHMENT_ID_NOT_FOUND_IN_MESSAGE no caminho attachment_id. Caso a mensagem não tenha nenhum anexo, o Decoding Chat ignora o ID e seleciona o primeiro embed utilizável. Apenas o anexo selecionado é testado; caso possua tipo não suportado, a busca passa para os embeds. Uma seleção que não resulte em nenhuma mídia suportada falha com NO_VALID_MEDIA_IN_MESSAGE no caminho media.

A seleção de embed utiliza imagem, vídeo ou thumbnail, nessa ordem. Mídias cujos metadados não puderem ser resolvidos falham com 400 MEDIA_METADATA_ERROR.

StatusCorpoCondição
201objeto memeO meme foi criado
400resposta de erroO corpo ou a seleção falham na validação com INVALID_FORM_BODY4
400resposta de erroMetadados da mídia externa não puderam ser resolvidos com MEDIA_METADATA_ERROR
400resposta de erroA coleção atingiu seu limite máximo com MAX_FAVORITE_MEMES
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY
403resposta de erroO autor da chamada não é membro do servidor ou não possui VIEW_CHANNEL, retornando MISSING_PERMISSIONS
403resposta de erroO canal exige verificação de idade não concluída pela conta e retorna NSFW_CONTENT_AGE_RESTRICTED
404resposta de erroO canal não está disponível ou o autor não tem acesso a ele com UNKNOWN_CHANNEL
404resposta de erroA mensagem não está disponível ou não é legível com UNKNOWN_MESSAGE

4 O código de validação é ATTACHMENT_ID_NOT_FOUND_IN_MESSAGE, EMBED_INDEX_OUT_OF_BOUNDS, NO_VALID_MEDIA_IN_MESSAGE, MEDIA_ALREADY_IN_FAVORITE_MEMES ou MAX_FAVORITE_MEME_TAGS_EXCEEDED

O meme recebe sua própria cópia do recurso selecionado. Ler a mensagem de origem renova seu prazo de expiração de anexo quando o decaimento estiver ativado. A mensagem de origem permanece inalterada em todos os outros aspectos.

A operação emite um evento Favorite Meme Create com o objeto criado para as sessões do próprio autor da chamada.

10 requisições por minuto por usuário autenticado, no bucket favorite_meme:create:message.

GET/v1/users/@me/memes/{meme_id}

Retorna um objeto de meme pertencente à conta atual.

CampoTipoDescrição
meme_idsnowflakeO ID do meme
StatusCorpoCondição
200objeto memeO meme foi retornado
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY
404resposta de erroO meme é desconhecido ou pertence a outra conta com UNKNOWN_FAVORITE_MEME

100 requisições a cada 10 segundos por usuário autenticado, no bucket favorite_meme:get.

PATCH/v1/users/@me/memes/{meme_id}

Altera o nome, alt text ou tags de um meme pertencente à conta atual e retorna o objeto de meme atualizado. Emite um evento de Gateway Favorite Meme Update.

CampoTipoDescrição
meme_idsnowflakeO ID do meme
CampoTipoDescrição
name?stringO nome de exibição substituto (1-100 caracteres)
alt_text?1?stringA descrição de acessibilidade substituta (0-500 caracteres), ou nulo para limpá-la
tags?2?array[string]As tags substitutas, cada uma com 1-30 caracteres

1 Um campo omitido preserva o valor já armazenado, e um valor nulo explícito o limpa

2 Um valor omitido ou nulo preserva as tags já armazenadas

O Decoding Chat verifica a cota de tags em relação à lista resultante, portanto uma solicitação que omitir tags verifica novamente as tags já armazenadas. Um meme que exceda uma cota reduzida posteriormente falha com 400 INVALID_FORM_BODY e MAX_FAVORITE_MEME_TAGS_EXCEEDED até que o chamador envie uma lista menor.

StatusCorpoCondição
200objeto memeO meme foi atualizado
400resposta de erroRota, nome, alt text ou comprimento de tag falham na validação com INVALID_FORM_BODY3
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY
404resposta de erroO meme é desconhecido ou pertence a outra conta com UNKNOWN_FAVORITE_MEME

3 Incluindo MAX_FAVORITE_MEME_TAGS_EXCEEDED no caminho tags

A operação modifica os campos fornecidos e preserva todos os campos omitidos. Emite um evento Favorite Meme Update com o objeto atualizado para as sessões do próprio usuário.

30 requisições a cada 10 segundos por usuário autenticado, no bucket favorite_meme:update.

DELETE/v1/users/@me/memes/{meme_id}

Exclui um meme pertencente à conta atual e retorna 204 com corpo vazio. Emite um evento de Gateway Favorite Meme Delete.

Um meme desconhecido, ou pertencente a outra conta, é considerado um sucesso sem ação operacional (no-op).

CampoTipoDescrição
meme_idsnowflakeO ID do meme
StatusCorpoCondição
204vazioO meme foi excluído, ou não existia meme próprio associado
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY

O meme é removido da coleção mesmo que sua cópia armazenada não possa ser excluída.

Emite um evento Favorite Meme Delete com meme_id para as sessões do próprio usuário. Uma solicitação para um meme que a conta não possui não emite nenhum evento.

30 requisições a cada 10 segundos por usuário autenticado, no bucket favorite_meme:delete.

POST/v1/users/@me/favorite-gifs/resolve

Resolve um lote de URLs de GIF em objetos de entrada de GIF resolvido com URLs assinadas do Proxy de Mídia e metadados de pré-visualização.

Um cliente utiliza essa rota para transformar URLs de GIFs favoritos armazenadas em opções renderizáveis no seletor de mídia sem precisar salvá-las previamente.

CampoTipoDescrição
Accept-Language?1stringA localidade preferida usada para consulta no provedor de GIF

1 O Decoding Chat usa a localidade salva da conta caso exista. Caso contrário, compara este cabeçalho com o registro de localidades suportadas, com fallback para en-US

O Decoding Chat deriva um código de país de duas letras a partir do endereço de IP requisitante via geolocalização, com US como fallback.

CampoTipoDescrição
urlsarray[string]As URLs absolutas de GIF a resolver (1-200)
CampoTipoDescrição
entries1array[objeto entrada de GIF resolvido]Uma entrada para cada URL enviada

1 Exatamente uma entrada por URL enviada, na ordem enviada, permitindo ao cliente indexar o resultado por posição

Uma URL não resolvida ainda retorna uma entrada contendo sua URL de proxy assinada e um mapa media vazio. Dimensões indisponíveis são reportadas como zero e um content_type desconhecido é reportado como string vazia. A falha de uma URL não invalida o lote inteiro.

StatusCorpoCondição
200corpo da respostaUma entrada foi retornada para cada URL, incluindo URLs não resolvidas
403resposta de erroO autor da chamada é um bot ou apresenta credencial bearer e a requisição retorna ACCESS_DENIED
403resposta de erroA conta possui uma ação pendente obrigatória e a requisição retorna ACCOUNT_SUSPICIOUS_ACTIVITY

30 requisições por minuto por usuário autenticado, no bucket favorite_gif:resolve.