@oficialapi/sdk 9.0.2 → 9.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -20,9 +20,9 @@ import { OficialAPISDK } from '@oficialapi/sdk';
20
20
  const sdk = new OficialAPISDK({
21
21
  clientId: 'seu-client-id',
22
22
  clientSecret: 'seu-client-secret',
23
- timeout: 30000, // opcional, padrão: 30000ms
24
- maxRetries: 3, // opcional, padrão: 3
25
- retryDelay: 1000, // opcional, padrão: 1000ms
23
+ timeout: 30000,
24
+ maxRetries: 3,
25
+ retryDelay: 1000,
26
26
  });
27
27
  ```
28
28
 
@@ -53,7 +53,7 @@ console.log(result.data.messageId);
53
53
  #### Enviar Mídia
54
54
 
55
55
  ```typescript
56
- // Enviar imagem
56
+
57
57
  await sdk.whatsapp.sendMedia({
58
58
  token: 'sk_live_...',
59
59
  sender: '5511999999999',
@@ -62,14 +62,14 @@ await sdk.whatsapp.sendMedia({
62
62
  caption: 'Veja esta imagem!'
63
63
  }, accessToken);
64
64
 
65
- // Enviar documento com nome de arquivo
65
+
66
66
  await sdk.whatsapp.sendMedia({
67
67
  token: 'sk_live_...',
68
68
  sender: '5511999999999',
69
69
  fileUrl: 'https://example.com/documento.pdf',
70
70
  type: 'document',
71
71
  caption: 'Confira este documento',
72
- fileName: 'meu_documento.pdf' // Opcional: se não fornecido, será extraído da URL
72
+ fileName: 'meu_documento.pdf'
73
73
  }, accessToken);
74
74
  ```
75
75
 
@@ -620,23 +620,23 @@ await sdk.whatsapp.sendOrderStatus({
620
620
  token: 'sk_live_...',
621
621
  sender: '5511999999999',
622
622
  bodyText: 'Seu pedido foi enviado!',
623
- footerText: 'Obrigado!', // Opcional
624
- reference_id: 'pedido_12345_1704067200', // Mesmo ID usado em sendOrderDetails
625
- order_status: 'shipped', // pending, processing, partially-shipped, shipped, completed, canceled
626
- status_description: 'Sua encomenda foi despachada pelos Correios', // Opcional
627
- payment_status: 'captured', // Opcional: pending, captured, failed
628
- payment_timestamp: 1722445231 // Opcional: timestamp do pagamento em segundos
623
+ footerText: 'Obrigado!',
624
+ reference_id: 'pedido_12345_1704067200',
625
+ order_status: 'shipped',
626
+ status_description: 'Sua encomenda foi despachada pelos Correios',
627
+ payment_status: 'captured',
628
+ payment_timestamp: 1722445231
629
629
  }, accessToken);
630
630
  ```
631
631
 
632
632
  #### Enviar Sticker
633
633
 
634
634
  ```typescript
635
- // Requer upload prévio da mídia para obter o mediaId
635
+
636
636
  await sdk.whatsapp.sendSticker({
637
637
  token: 'sk_live_...',
638
638
  sender: '5511999999999',
639
- mediaId: '798882015472548' // ID da mídia após upload (.webp até 500KB para animado, 100KB para estático)
639
+ mediaId: '798882015472548'
640
640
  }, accessToken);
641
641
  ```
642
642
 
@@ -647,8 +647,8 @@ await sdk.whatsapp.sendLocationRequest({
647
647
  token: 'sk_live_...',
648
648
  sender: '5511999999999',
649
649
  bodyText: 'Por favor, compartilhe sua localização para entregarmos seu pedido.',
650
- headerText: 'Confirme sua entrega', // Opcional (máximo 60 caracteres)
651
- footerText: 'Sua privacidade é importante' // Opcional (máximo 60 caracteres)
650
+ headerText: 'Confirme sua entrega',
651
+ footerText: 'Sua privacidade é importante'
652
652
  }, accessToken);
653
653
  ```
654
654
 
@@ -659,14 +659,14 @@ await sdk.whatsapp.sendCtaUrl({
659
659
  token: 'sk_live_...',
660
660
  sender: '5511999999999',
661
661
  bodyText: 'Confira nosso site!',
662
- buttonText: 'Acessar', // Máximo 20 caracteres
662
+ buttonText: 'Acessar',
663
663
  url: 'https://example.com',
664
- header: { // Opcional: cabeçalho com mídia
665
- type: 'image', // ou 'video', 'document', 'text'
666
- link: 'https://example.com/banner.jpg' // Para image/video/document
667
- // ou text: 'Título' para tipo text
664
+ header: {
665
+ type: 'image',
666
+ link: 'https://example.com/banner.jpg'
667
+
668
668
  },
669
- footerText: 'Ofertas válidas até 30/11' // Opcional (máximo 60 caracteres)
669
+ footerText: 'Ofertas válidas até 30/11'
670
670
  }, accessToken);
671
671
  ```
672
672
 
@@ -676,14 +676,14 @@ await sdk.whatsapp.sendCtaUrl({
676
676
  await sdk.whatsapp.sendMediaCarousel({
677
677
  token: 'sk_live_...',
678
678
  sender: '5511999999999',
679
- bodyText: 'Confira nossas ofertas da semana!', // Obrigatório
680
- cards: [ // 2 a 10 cartões
679
+ bodyText: 'Confira nossas ofertas da semana!',
680
+ cards: [
681
681
  {
682
682
  cardIndex: 0,
683
- headerType: 'image', // ou 'video'
683
+ headerType: 'image',
684
684
  headerLink: 'https://example.com/image1.jpg',
685
- bodyText: 'Oferta especial!', // Máximo 160 caracteres
686
- buttonText: 'Comprar agora', // Máximo 20 caracteres
685
+ bodyText: 'Oferta especial!',
686
+ buttonText: 'Comprar agora',
687
687
  url: 'https://example.com/product1'
688
688
  },
689
689
  {
@@ -706,11 +706,11 @@ const media = await sdk.whatsapp.downloadMedia({
706
706
  url: 'https://lookaside.fbsbx.com/whatsapp_business/attachment/?mid=...'
707
707
  }, accessToken);
708
708
 
709
- // A mídia retorna em base64
710
- console.log(media.data.buffer); // Base64 string
711
- console.log(media.data.mimeType); // image/jpeg, video/mp4, etc.
712
- console.log(media.data.filename); // Nome do arquivo
713
- console.log(media.data.size); // Tamanho em bytes
709
+
710
+ console.log(media.data.buffer);
711
+ console.log(media.data.mimeType);
712
+ console.log(media.data.filename);
713
+ console.log(media.data.size);
714
714
  ```
715
715
 
716
716
  #### Responder Mensagem
@@ -718,10 +718,10 @@ console.log(media.data.size); // Tamanho em bytes
718
718
  ```typescript
719
719
  await sdk.whatsapp.replyMessage({
720
720
  token: 'sk_live_...',
721
- sender: '5511999999999', // Obrigatório
721
+ sender: '5511999999999',
722
722
  messageText: 'Esta é uma resposta!',
723
- replyMessageId: 'wamid.xxx', // Opcional: ID da mensagem a responder
724
- preview_url: false // Opcional: se true, mostra preview de URLs no texto
723
+ replyMessageId: 'wamid.xxx',
724
+ preview_url: false
725
725
  }, accessToken);
726
726
  ```
727
727
 
@@ -730,22 +730,22 @@ await sdk.whatsapp.replyMessage({
730
730
  ```typescript
731
731
  await sdk.whatsapp.reactMessage({
732
732
  token: 'sk_live_...',
733
- sender: '5511999999999', // Obrigatório
734
- emoji: '👍', // Emoji da reação
735
- message_id: 'wamid.xxx' // Opcional: ID da mensagem específica a reagir
733
+ sender: '5511999999999',
734
+ emoji: '👍',
735
+ message_id: 'wamid.xxx'
736
736
  }, accessToken);
737
737
  ```
738
738
 
739
739
  #### Gerenciar Templates
740
740
 
741
741
  ```typescript
742
- // Listar templates
742
+
743
743
  const templates = await sdk.whatsapp.listTemplates('sk_live_...', accessToken);
744
744
 
745
- // Obter detalhes de um template
745
+
746
746
  const template = await sdk.whatsapp.getTemplate('sk_live_...', 'template_id', accessToken);
747
747
 
748
- // Criar template
748
+
749
749
  await sdk.whatsapp.createTemplate({
750
750
  token: 'sk_live_...',
751
751
  name: 'welcome_message',
@@ -760,8 +760,7 @@ await sdk.whatsapp.createTemplate({
760
760
  }, accessToken);
761
761
 
762
762
  #### Upload de Mídia
763
-
764
- O método `uploadMedia` é usado para fazer upload de arquivos (imagens, vídeos, áudios, documentos) que serão usados em templates ou enviados via `sendAudio`, `sendVideo`, `sendDocument` ou `sendSticker`.
763
+
765
764
 
766
765
  **Exemplo 1: Upload de imagem sem filename (opcional)**
767
766
 
@@ -774,7 +773,7 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
774
773
  token: 'sk_live_...',
775
774
  file: fileBuffer,
776
775
  mediaType: 'image'
777
- // filename é opcional
776
+
778
777
  }, accessToken);
779
778
 
780
779
  const mediaId = uploadResult.data.handle; // "4::aW1hZ2UtMTIzNDU2Nzg5MGCE..."
@@ -810,7 +809,7 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
810
809
  filename: 'meu_video.mp4'
811
810
  }, accessToken);
812
811
 
813
- // Use o mediaId para enviar o vídeo
812
+
814
813
  await sdk.whatsapp.sendVideo({
815
814
  token: 'sk_live_...',
816
815
  sender: '5511999999999',
@@ -846,11 +845,11 @@ const stickerBuffer = fs.readFileSync('./sticker.webp');
846
845
  const uploadResult = await sdk.whatsapp.uploadMedia({
847
846
  token: 'sk_live_...',
848
847
  file: stickerBuffer,
849
- mediaType: 'image', // Stickers são tratados como imagem
848
+ mediaType: 'image',
850
849
  filename: 'sticker.webp'
851
850
  }, accessToken);
852
851
 
853
- // Use o mediaId para enviar o sticker
852
+
854
853
  await sdk.whatsapp.sendSticker({
855
854
  token: 'sk_live_...',
856
855
  sender: '5511999999999',
@@ -861,11 +860,11 @@ await sdk.whatsapp.sendSticker({
861
860
  **Exemplo 7: Upload em ambiente Browser (Frontend)**
862
861
 
863
862
  ```typescript
864
- // Em ambiente Browser
863
+
865
864
  const fileInput = document.querySelector('input[type="file"]');
866
865
  const file = fileInput.files[0];
867
866
 
868
- // Determine o mediaType baseado no tipo do arquivo
867
+
869
868
  const getMediaType = (file: File): 'image' | 'video' | 'document' => {
870
869
  if (file.type.startsWith('image/')) return 'image';
871
870
  if (file.type.startsWith('video/')) return 'video';
@@ -876,7 +875,7 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
876
875
  token: 'sk_live_...',
877
876
  file: file,
878
877
  mediaType: getMediaType(file),
879
- filename: file.name // Opcional
878
+ filename: file.name
880
879
  }, accessToken);
881
880
 
882
881
  const mediaId = uploadResult.data.handle;
@@ -885,7 +884,7 @@ const mediaId = uploadResult.data.handle;
885
884
  **Exemplo 8: Upload usando Blob (Browser)**
886
885
 
887
886
  ```typescript
888
- // Criar um Blob a partir de dados
887
+
889
888
  const blob = new Blob(['conteúdo do arquivo'], { type: 'text/plain' });
890
889
 
891
890
  const uploadResult = await sdk.whatsapp.uploadMedia({
@@ -909,10 +908,10 @@ const uploadResult = await sdk.whatsapp.uploadMedia({
909
908
  token: 'sk_live_...',
910
909
  file: imageBuffer,
911
910
  mediaType: 'image'
912
- // filename não é necessário para templates
911
+
913
912
  }, accessToken);
914
913
 
915
- // Use o handle no template
914
+
916
915
  await sdk.whatsapp.createTemplate({
917
916
  token: 'sk_live_...',
918
917
  name: 'product_launch',
@@ -923,7 +922,7 @@ await sdk.whatsapp.createTemplate({
923
922
  type: 'HEADER',
924
923
  format: 'IMAGE',
925
924
  example: {
926
- header_handle: [uploadResult.data.handle] // Use o handle aqui
925
+ header_handle: [uploadResult.data.handle]
927
926
  }
928
927
  },
929
928
  {
@@ -1447,22 +1446,25 @@ const media = await sdk.telegram.downloadMedia({
1447
1446
  fileId: 'AgACAgEAAxkBAAItNmlmklyYNCEtvaFphVfSSO7CrEOjAALUC2sbh9owR9hT7MhQnTGfAQADAgADcwADOAQ'
1448
1447
  }, accessToken);
1449
1448
 
1450
- // A mídia retorna em base64
1451
- console.log(media.data.buffer); // Base64 string
1452
- console.log(media.data.mimeType); // image/jpeg, video/mp4, etc.
1453
- console.log(media.data.filename); // Nome do arquivo
1454
- console.log(media.data.size); // Tamanho em bytes
1449
+
1450
+ console.log(media.data.buffer);
1451
+ console.log(media.data.mimeType);
1452
+ console.log(media.data.filename);
1453
+ console.log(media.data.size);
1455
1454
  ```
1456
1455
 
1457
1456
  ### WebChat
1457
+
1458
1458
 
1459
1459
  #### Enviar Mensagem de Texto
1460
1460
 
1461
1461
  ```typescript
1462
1462
  await sdk.webchat.sendText({
1463
- token: 'sk_live_...',
1464
- sender: 'user123',
1465
- messageText: 'Olá!'
1463
+ channelToken: 'sk_live_...',
1464
+ chatId: 'chat_123456789',
1465
+ messageText: 'Olá!',
1466
+ typing: true, // Opcional: mostrar indicador de digitação
1467
+ typingTime: 2000 // Opcional: tempo de digitação em ms
1466
1468
  }, accessToken);
1467
1469
  ```
1468
1470
 
@@ -1470,18 +1472,22 @@ await sdk.webchat.sendText({
1470
1472
 
1471
1473
  ```typescript
1472
1474
  await sdk.webchat.sendCard({
1473
- token: 'sk_live_...',
1474
- sender: 'user123',
1475
+ channelToken: 'sk_live_...',
1476
+ chatId: 'chat_123456789',
1475
1477
  title: 'Produto',
1476
1478
  description: 'Descrição do produto',
1477
1479
  imageUrl: 'https://example.com/image.jpg',
1478
1480
  buttons: [
1479
1481
  {
1480
- type: 'url',
1481
- title: 'Ver Mais',
1482
+ id: 'btn_1', // Opcional: ID único do botão
1483
+ text: 'Ver Mais',
1484
+ type: 'url', // 'text' | 'url' | 'phone' | 'postback'
1485
+ url: 'https://example.com/product',
1482
1486
  value: 'https://example.com/product'
1483
1487
  }
1484
- ]
1488
+ ],
1489
+ typing: true,
1490
+ typingTime: 3000
1485
1491
  }, accessToken);
1486
1492
  ```
1487
1493
 
@@ -1489,11 +1495,13 @@ await sdk.webchat.sendCard({
1489
1495
 
1490
1496
  ```typescript
1491
1497
  await sdk.webchat.sendMedia({
1492
- token: 'sk_live_...',
1493
- sender: 'user123',
1498
+ channelToken: 'sk_live_...',
1499
+ chatId: 'chat_123456789',
1494
1500
  fileUrl: 'https://example.com/image.jpg',
1495
- type: 'image',
1496
- caption: 'Veja esta imagem!'
1501
+ type: 'image', // 'image' | 'video' | 'audio' | 'file'
1502
+ caption: 'Veja esta imagem!',
1503
+ typing: true,
1504
+ typingTime: 2500
1497
1505
  }, accessToken);
1498
1506
  ```
1499
1507
 
@@ -1501,26 +1509,39 @@ await sdk.webchat.sendMedia({
1501
1509
 
1502
1510
  ```typescript
1503
1511
  await sdk.webchat.sendCarousel({
1504
- token: 'sk_live_...',
1505
- sender: 'user123',
1512
+ channelToken: 'sk_live_...',
1513
+ chatId: 'chat_123456789',
1506
1514
  cards: [
1507
1515
  {
1508
1516
  title: 'Produto 1',
1509
- description: 'Descrição do produto 1',
1517
+ subtitle: 'Descrição do produto 1',
1510
1518
  imageUrl: 'https://example.com/product1.jpg',
1511
1519
  buttons: [
1512
- { type: 'url', title: 'Ver Mais', value: 'https://example.com/product1' }
1520
+ {
1521
+ id: 'btn_1',
1522
+ text: 'Ver Mais',
1523
+ type: 'url',
1524
+ url: 'https://example.com/product1',
1525
+ value: 'https://example.com/product1'
1526
+ }
1513
1527
  ]
1514
1528
  },
1515
1529
  {
1516
1530
  title: 'Produto 2',
1517
- description: 'Descrição do produto 2',
1531
+ subtitle: 'Descrição do produto 2',
1518
1532
  imageUrl: 'https://example.com/product2.jpg',
1519
1533
  buttons: [
1520
- { type: 'url', title: 'Ver Mais', value: 'https://example.com/product2' }
1534
+ {
1535
+ id: 'btn_2',
1536
+ text: 'Comprar',
1537
+ type: 'postback',
1538
+ value: 'BUY_PRODUCT_2'
1539
+ }
1521
1540
  ]
1522
1541
  }
1523
- ]
1542
+ ],
1543
+ typing: true,
1544
+ typingTime: 4000
1524
1545
  }, accessToken);
1525
1546
  ```
1526
1547
 
@@ -1528,24 +1549,40 @@ await sdk.webchat.sendCarousel({
1528
1549
 
1529
1550
  ```typescript
1530
1551
  await sdk.webchat.sendForm({
1531
- token: 'sk_live_...',
1532
- sender: 'user123',
1533
- title: 'Formulário de Contato',
1552
+ channelToken: 'sk_live_...',
1553
+ chatId: 'chat_123456789',
1554
+ id: 'form_contact', // Opcional: ID único do formulário
1555
+ title: 'Formulário de Contato', // Opcional
1534
1556
  fields: [
1535
1557
  {
1536
- type: 'text',
1537
- name: 'name',
1558
+ id: 'name', // Opcional: se não fornecido, usa 'name'
1559
+ name: 'name', // Opcional: mantido para compatibilidade
1560
+ type: 'text', // 'text' | 'email' | 'number' | 'tel' | 'date' | 'select'
1538
1561
  label: 'Nome',
1562
+ placeholder: 'Digite seu nome',
1539
1563
  required: true
1540
1564
  },
1541
1565
  {
1566
+ id: 'email',
1542
1567
  type: 'email',
1543
- name: 'email',
1544
1568
  label: 'E-mail',
1569
+ placeholder: 'Digite seu e-mail',
1545
1570
  required: true
1571
+ },
1572
+ {
1573
+ id: 'subject',
1574
+ type: 'select',
1575
+ label: 'Assunto',
1576
+ required: true,
1577
+ options: [
1578
+ { value: 'support', label: 'Suporte' },
1579
+ { value: 'sales', label: 'Vendas' }
1580
+ ]
1546
1581
  }
1547
1582
  ],
1548
- submitButtonText: 'Enviar'
1583
+ submitButtonText: 'Enviar', // Opcional
1584
+ typing: true,
1585
+ typingTime: 3000
1549
1586
  }, accessToken);
1550
1587
  ```
1551
1588
 
@@ -1553,14 +1590,23 @@ await sdk.webchat.sendForm({
1553
1590
 
1554
1591
  ```typescript
1555
1592
  await sdk.webchat.sendQuickReplies({
1556
- token: 'sk_live_...',
1557
- sender: 'user123',
1593
+ channelToken: 'sk_live_...',
1594
+ chatId: 'chat_123456789',
1558
1595
  messageText: 'Como podemos ajudar?',
1559
1596
  quickReplies: [
1560
- { type: 'text', title: 'Suporte', payload: 'SUPPORT' },
1561
- { type: 'text', title: 'Vendas', payload: 'SALES' },
1562
- { type: 'location', title: 'Compartilhar Localização' }
1563
- ]
1597
+ {
1598
+ id: 'qr_1', // Opcional: ID único
1599
+ text: 'Suporte',
1600
+ value: 'SUPPORT' // Opcional: valor para identificar a resposta
1601
+ },
1602
+ {
1603
+ id: 'qr_2',
1604
+ text: 'Vendas',
1605
+ value: 'SALES'
1606
+ }
1607
+ ],
1608
+ typing: true,
1609
+ typingTime: 2000
1564
1610
  }, accessToken);
1565
1611
  ```
1566
1612
 
@@ -1568,13 +1614,26 @@ await sdk.webchat.sendQuickReplies({
1568
1614
 
1569
1615
  ```typescript
1570
1616
  await sdk.webchat.sendButtons({
1571
- token: 'sk_live_...',
1572
- sender: 'user123',
1617
+ channelToken: 'sk_live_...',
1618
+ chatId: 'chat_123456789',
1573
1619
  messageText: 'Escolha uma opção:',
1574
1620
  buttons: [
1575
- { type: 'url', title: 'Visitar Site', value: 'https://example.com' },
1576
- { type: 'postback', title: 'Falar com Atendente', value: 'HUMAN_AGENT' }
1577
- ]
1621
+ {
1622
+ id: 'btn_1',
1623
+ text: 'Visitar Site',
1624
+ type: 'url',
1625
+ url: 'https://example.com',
1626
+ value: 'https://example.com'
1627
+ },
1628
+ {
1629
+ id: 'btn_2',
1630
+ text: 'Falar com Atendente',
1631
+ type: 'postback',
1632
+ value: 'HUMAN_AGENT'
1633
+ }
1634
+ ],
1635
+ typing: true,
1636
+ typingTime: 2500
1578
1637
  }, accessToken);
1579
1638
  ```
1580
1639
 
@@ -1734,11 +1793,11 @@ const media = await sdk.facebook.downloadMedia({
1734
1793
  url: 'https://lookaside.fbsbx.com/ig_messaging_cdn/...'
1735
1794
  }, accessToken);
1736
1795
 
1737
- // A mídia retorna em base64
1738
- console.log(media.data.buffer); // Base64 string
1739
- console.log(media.data.mimeType); // image/jpeg, video/mp4, etc.
1740
- console.log(media.data.filename); // Nome do arquivo
1741
- console.log(media.data.size); // Tamanho em bytes
1796
+
1797
+ console.log(media.data.buffer);
1798
+ console.log(media.data.mimeType);
1799
+ console.log(media.data.filename);
1800
+ console.log(media.data.size);
1742
1801
  ```
1743
1802
 
1744
1803
  ### Instagram
@@ -1879,21 +1938,21 @@ await sdk.instagram.sendButtonTemplate({
1879
1938
  #### Enviar Ação do Remetente (Typing, Seen)
1880
1939
 
1881
1940
  ```typescript
1882
- // Mostrar "digitando..."
1941
+
1883
1942
  await sdk.instagram.sendSenderAction({
1884
1943
  token: 'sk_live_...',
1885
1944
  recipientId: 'user_id',
1886
1945
  action: 'typing_on'
1887
1946
  }, accessToken);
1888
1947
 
1889
- // Parar de mostrar "digitando..."
1948
+
1890
1949
  await sdk.instagram.sendSenderAction({
1891
1950
  token: 'sk_live_...',
1892
1951
  recipientId: 'user_id',
1893
1952
  action: 'typing_off'
1894
1953
  }, accessToken);
1895
1954
 
1896
- // Marcar como visualizado
1955
+
1897
1956
  await sdk.instagram.sendSenderAction({
1898
1957
  token: 'sk_live_...',
1899
1958
  recipientId: 'user_id',
@@ -1939,11 +1998,229 @@ const media = await sdk.instagram.downloadMedia({
1939
1998
  url: 'https://lookaside.fbsbx.com/ig_messaging_cdn/...'
1940
1999
  }, accessToken);
1941
2000
 
1942
- // A mídia retorna em base64
1943
- console.log(media.data.buffer); // Base64 string
1944
- console.log(media.data.mimeType); // image/jpeg, video/mp4, etc.
1945
- console.log(media.data.filename); // Nome do arquivo
1946
- console.log(media.data.size); // Tamanho em bytes
2001
+
2002
+ console.log(media.data.buffer);
2003
+ console.log(media.data.mimeType);
2004
+ console.log(media.data.filename);
2005
+ console.log(media.data.size);
2006
+ ```
2007
+
2008
+ #### Publicar Conteúdo no Instagram
2009
+
2010
+
2011
+
2012
+ **1. Criar Contêiner de Mídia**
2013
+
2014
+ ```typescript
2015
+ // Publicar imagem
2016
+ const container = await sdk.instagram.createMediaContainer({
2017
+ token: 'sk_live_...',
2018
+ image_url: 'https://example.com/image.jpg',
2019
+ media_type: 'IMAGE',
2020
+ caption: 'Nossa nova coleção chegou! #moda #verao',
2021
+ alt_text: 'Foto de um produto de moda' // Opcional: texto alternativo
2022
+ }, accessToken);
2023
+
2024
+ const creationId = container.data.data.id; // ID do contêiner criado
2025
+ ```
2026
+
2027
+ ```typescript
2028
+ // Publicar vídeo
2029
+ const container = await sdk.instagram.createMediaContainer({
2030
+ token: 'sk_live_...',
2031
+ video_url: 'https://example.com/video.mp4',
2032
+ media_type: 'VIDEO',
2033
+ caption: 'Vídeo especial para nossos seguidores'
2034
+ }, accessToken);
2035
+ ```
2036
+
2037
+ ```typescript
2038
+ // Publicar Reel
2039
+ const container = await sdk.instagram.createMediaContainer({
2040
+ token: 'sk_live_...',
2041
+ video_url: 'https://example.com/reel.mp4',
2042
+ media_type: 'REELS',
2043
+ caption: 'Confira nosso novo Reel!',
2044
+ trial_params: { // Opcional: para reels de teste
2045
+ graduation_strategy: 'MANUAL'
2046
+ }
2047
+ }, accessToken);
2048
+ ```
2049
+
2050
+ ```typescript
2051
+ // Publicar Story
2052
+ const container = await sdk.instagram.createMediaContainer({
2053
+ token: 'sk_live_...',
2054
+ video_url: 'https://example.com/story.mp4',
2055
+ media_type: 'STORIES'
2056
+ }, accessToken);
2057
+ ```
2058
+
2059
+ ```typescript
2060
+ // Criar carrossel (até 10 itens)
2061
+ // Primeiro, criar os contêineres filhos
2062
+ const child1 = await sdk.instagram.createMediaContainer({
2063
+ token: 'sk_live_...',
2064
+ image_url: 'https://example.com/image1.jpg',
2065
+ media_type: 'IMAGE',
2066
+ is_carousel_item: true
2067
+ }, accessToken);
2068
+
2069
+ const child2 = await sdk.instagram.createMediaContainer({
2070
+ token: 'sk_live_...',
2071
+ image_url: 'https://example.com/image2.jpg',
2072
+ media_type: 'IMAGE',
2073
+ is_carousel_item: true
2074
+ }, accessToken);
2075
+
2076
+ // Depois, criar o contêiner pai do carrossel
2077
+ const carousel = await sdk.instagram.createMediaContainer({
2078
+ token: 'sk_live_...',
2079
+ media_type: 'CAROUSEL',
2080
+ caption: 'Balas de frutas',
2081
+ children: [
2082
+ child1.data.data.id,
2083
+ child2.data.data.id
2084
+ ]
2085
+ }, accessToken);
2086
+ ```
2087
+
2088
+ **2. Verificar Status do Contêiner** (para vídeos grandes)
2089
+
2090
+ ```typescript
2091
+ const status = await sdk.instagram.getContainerStatus({
2092
+ token: 'sk_live_...',
2093
+ container_id: '17841465415913137'
2094
+ }, accessToken);
2095
+
2096
+ // Status possíveis: EXPIRED, ERROR, FINISHED, IN_PROGRESS, PUBLISHED
2097
+ console.log(status.data.data.status_code);
2098
+
2099
+ // Para vídeos grandes, aguarde até o status ser 'FINISHED' antes de publicar
2100
+ if (status.data.data.status_code === 'FINISHED') {
2101
+ // Pronto para publicar
2102
+ }
2103
+ ```
2104
+
2105
+ **3. Publicar Mídia**
2106
+
2107
+ ```typescript
2108
+ const published = await sdk.instagram.publishMedia({
2109
+ token: 'sk_live_...',
2110
+ creation_id: '17841465415913137' // ID retornado ao criar o contêiner
2111
+ }, accessToken);
2112
+
2113
+ console.log(published.data.data.id); // ID da publicação criada
2114
+ ```
2115
+
2116
+ **4. Verificar Limite de Publicação**
2117
+
2118
+ ```typescript
2119
+ const limit = await sdk.instagram.getPublishingLimit({
2120
+ token: 'sk_live_...'
2121
+ }, accessToken);
2122
+
2123
+ console.log(`Usado: ${limit.data.data.quota_used} de ${limit.data.data.quota_total}`);
2124
+ console.log(`Período: ${limit.data.data.quota_duration} segundos (24 horas)`);
2125
+ ```
2126
+
2127
+ **5. Upload de Vídeo Grande (Sessão Retomável)**
2128
+
2129
+ Para vídeos grandes que podem ter interrupções de rede:
2130
+
2131
+ ```typescript
2132
+ // 1. Criar contêiner com upload_type=resumable
2133
+ const container = await sdk.instagram.createMediaContainer({
2134
+ token: 'sk_live_...',
2135
+ video_url: 'https://example.com/large-video.mp4',
2136
+ media_type: 'VIDEO',
2137
+ upload_type: 'resumable',
2138
+ caption: 'Vídeo grande com upload retomável'
2139
+ }, accessToken);
2140
+
2141
+ // 2. Fazer upload do vídeo
2142
+ const upload = await sdk.instagram.uploadVideo({
2143
+ token: 'sk_live_...',
2144
+ container_id: container.data.data.id,
2145
+ file_url: 'https://example.com/large-video.mp4',
2146
+ file_size: 10485760, // Tamanho em bytes (opcional se file_url fornecido)
2147
+ offset: 0 // Opcional: para retomar upload (padrão: 0)
2148
+ }, accessToken);
2149
+
2150
+ // 3. Verificar status periodicamente até ser 'FINISHED'
2151
+ // 4. Publicar quando status for 'FINISHED'
2152
+ ```
2153
+
2154
+ **Exemplo Completo: Publicar Imagem**
2155
+
2156
+ ```typescript
2157
+ // 1. Criar contêiner
2158
+ const container = await sdk.instagram.createMediaContainer({
2159
+ token: 'sk_live_...',
2160
+ image_url: 'https://example.com/image.jpg',
2161
+ media_type: 'IMAGE',
2162
+ caption: 'Nossa nova coleção chegou! #moda #verao',
2163
+ alt_text: 'Foto de um produto de moda',
2164
+ location_id: '123456789', // Opcional: ID da localização
2165
+ user_tags: [ // Opcional: marcar usuários
2166
+ { username: 'usuario1', x: 0.5, y: 0.5 }
2167
+ ]
2168
+ }, accessToken);
2169
+
2170
+ const creationId = container.data.data.id;
2171
+
2172
+ // 2. Publicar imediatamente (imagens são processadas rapidamente)
2173
+ const published = await sdk.instagram.publishMedia({
2174
+ token: 'sk_live_...',
2175
+ creation_id: creationId
2176
+ }, accessToken);
2177
+
2178
+ console.log(`Publicação criada com ID: ${published.data.data.id}`);
2179
+ ```
2180
+
2181
+ **Exemplo Completo: Publicar Vídeo com Verificação de Status**
2182
+
2183
+ ```typescript
2184
+ // 1. Criar contêiner de vídeo
2185
+ const container = await sdk.instagram.createMediaContainer({
2186
+ token: 'sk_live_...',
2187
+ video_url: 'https://example.com/video.mp4',
2188
+ media_type: 'VIDEO',
2189
+ caption: 'Vídeo especial para nossos seguidores'
2190
+ }, accessToken);
2191
+
2192
+ const containerId = container.data.data.id;
2193
+
2194
+ // 2. Verificar status periodicamente (vídeos podem demorar)
2195
+ let status = 'IN_PROGRESS';
2196
+ let attempts = 0;
2197
+ const maxAttempts = 10;
2198
+
2199
+ while (status === 'IN_PROGRESS' && attempts < maxAttempts) {
2200
+ await new Promise(resolve => setTimeout(resolve, 5000)); // Aguardar 5 segundos
2201
+
2202
+ const statusCheck = await sdk.instagram.getContainerStatus({
2203
+ token: 'sk_live_...',
2204
+ container_id: containerId
2205
+ }, accessToken);
2206
+
2207
+ status = statusCheck.data.data.status_code;
2208
+ attempts++;
2209
+
2210
+ console.log(`Status: ${status} (tentativa ${attempts})`);
2211
+ }
2212
+
2213
+ // 3. Publicar quando status for 'FINISHED'
2214
+ if (status === 'FINISHED') {
2215
+ const published = await sdk.instagram.publishMedia({
2216
+ token: 'sk_live_...',
2217
+ creation_id: containerId
2218
+ }, accessToken);
2219
+
2220
+ console.log(`Vídeo publicado com ID: ${published.data.data.id}`);
2221
+ } else {
2222
+ console.error(`Erro: Status final é ${status}`);
2223
+ }
1947
2224
  ```
1948
2225
 
1949
2226
  ### Canais