# TypeScript / JavaScript URL: /docs/examples/typescript.mdx Exemplos de integração da API brapi.dev usando TypeScript e JavaScript com fetch nativo e Axios. Aprenda a buscar cotações de ações da B3 em aplicações web e Node.js. *** title: 'TypeScript / JavaScript' description: >- Exemplos de integração da API brapi.dev usando TypeScript e JavaScript com fetch nativo e Axios. Aprenda a buscar cotações de ações da B3 em aplicações web e Node.js. full: false keywords: brapi, api, typescript, javascript, fetch, axios, node.js, web openGraph: title: Integração TypeScript/JavaScript - brapi.dev description: >- Exemplos práticos de integração com fetch e Axios para buscar cotações da B3 type: website locale: pt\_BR lastUpdated: '2025-10-12T17:30:00.000Z' lang: pt-BR ----------- Integre a API brapi.dev em suas aplicações TypeScript e JavaScript usando nossa SDK oficial ou fetch/Axios. ## 🎉 SDK Oficial Disponível! A brapi.dev agora oferece uma **SDK oficial TypeScript/JavaScript** que facilita muito a integração: ```bash npm install brapi ``` **Vantagens da SDK:** * ✅ Tipos TypeScript completos com IntelliSense * ✅ Tratamento de erros automático * ✅ Retry inteligente em falhas * ✅ Suporte a Node.js e navegador **Exemplo rápido:** ```typescript import Brapi from 'brapi'; const client = new Brapi({ apiKey: process.env.BRAPI_API_KEY, }); const quote = await client.quote.retrieve('PETR4'); console.log(quote.results[0].regularMarketPrice); ``` 📚 **[Ver documentação completa da SDK](/docs/sdks/typescript)** *** ## Integração Manual (Sem SDK) Se preferir fazer requisições HTTP diretamente, veja os exemplos abaixo. ## Usando Fetch (Nativo) O fetch é nativo em navegadores modernos e Node.js 18+, sem necessidade de bibliotecas externas. ### Exemplo Básico ```typescript const fetchQuote = async () => { const token = 'SEU_TOKEN'; const ticker = 'PETR4'; const response = await fetch( `https://brapi.dev/api/quote/${ticker}?token=${token}` ); const data = await response.json(); console.log(data); }; fetchQuote(); ``` ### Com Tratamento de Erros ```typescript interface QuoteResult { results: Array<{ symbol: string; shortName: string; regularMarketPrice: number; regularMarketChange: number; regularMarketChangePercent: number; currency: string; }>; } const fetchQuote = async (ticker: string): Promise => { const token = process.env.BRAPI_TOKEN || 'SEU_TOKEN'; try { const response = await fetch( `https://brapi.dev/api/quote/${ticker}?token=${token}` ); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data: QuoteResult = await response.json(); return data; } catch (error) { console.error('Erro ao buscar cotação:', error); return null; } }; // Uso fetchQuote('PETR4').then(data => { if (data && data.results[0]) { const quote = data.results[0]; console.log(`${quote.symbol}: R$ ${quote.regularMarketPrice}`); } }); ``` ### Múltiplos Tickers ```typescript const fetchMultipleQuotes = async (tickers: string[]) => { const token = 'SEU_TOKEN'; const tickersParam = tickers.join(','); const response = await fetch( `https://brapi.dev/api/quote/${tickersParam}?token=${token}` ); const data = await response.json(); return data.results; }; // Uso fetchMultipleQuotes(['PETR4', 'VALE3', 'ITUB4']).then(quotes => { quotes.forEach(quote => { console.log(`${quote.symbol}: R$ ${quote.regularMarketPrice}`); }); }); ``` ## Usando Axios Axios é uma biblioteca popular para fazer requisições HTTP, com sintaxe mais simples e recursos adicionais. ### Instalação ```bash npm install axios # ou yarn add axios # ou bun add axios ``` ### Exemplo Básico ```typescript import axios from 'axios'; const token = 'SEU_TOKEN'; const ticker = 'PETR4'; const url = `https://brapi.dev/api/quote/${ticker}?token=${token}`; async function fetchQuote() { try { const response = await axios.get(url); console.log(response.data); } catch (error) { console.error('Erro ao buscar cotação:', error); } } fetchQuote(); ``` ### Com TypeScript e Interface ```typescript import axios, { AxiosError } from 'axios'; interface BrapiQuoteResponse { results: Array<{ symbol: string; shortName: string; longName: string; currency: string; regularMarketPrice: number; regularMarketDayHigh: number; regularMarketDayLow: number; regularMarketVolume: number; regularMarketChange: number; regularMarketChangePercent: number; regularMarketTime: string; marketCap: number; fiftyTwoWeekLow: number; fiftyTwoWeekHigh: number; }>; requestedAt: string; took: string; } class BrapiClient { private baseUrl = 'https://brapi.dev/api'; private token: string; constructor(token: string) { this.token = token; } async getQuote(ticker: string): Promise { try { const response = await axios.get( `${this.baseUrl}/quote/${ticker}`, { params: { token: this.token } } ); return response.data; } catch (error) { if (axios.isAxiosError(error)) { const axiosError = error as AxiosError; throw new Error( `Erro na API: ${axiosError.response?.status} - ${axiosError.message}` ); } throw error; } } async getMultipleQuotes(tickers: string[]): Promise { const tickersParam = tickers.join(','); return this.getQuote(tickersParam); } } // Uso const client = new BrapiClient(process.env.BRAPI_TOKEN!); client.getQuote('PETR4').then(data => { const quote = data.results[0]; console.log(`${quote.symbol}: R$ ${quote.regularMarketPrice}`); console.log(`Variação: ${quote.regularMarketChangePercent.toFixed(2)}%`); }); ``` ## Exemplo Next.js (App Router) ### Server Component ```typescript // app/stock/[ticker]/page.tsx import { Suspense } from 'react'; interface QuoteData { results: Array<{ symbol: string; shortName: string; regularMarketPrice: number; regularMarketChangePercent: number; }>; } async function getQuote(ticker: string): Promise { const token = process.env.BRAPI_TOKEN; const res = await fetch( `https://brapi.dev/api/quote/${ticker}?token=${token}`, { next: { revalidate: 60 } } // Cache por 60 segundos ); if (!res.ok) { throw new Error('Failed to fetch quote'); } return res.json(); } export default async function StockPage({ params, }: { params: { ticker: string }; }) { const data = await getQuote(params.ticker); const quote = data.results[0]; return (

{quote.shortName}

R$ {quote.regularMarketPrice.toFixed(2)}

0 ? 'text-green-600' : 'text-red-600'}> {quote.regularMarketChangePercent.toFixed(2)}%

); } ``` ### Client Component com SWR ```typescript 'use client'; import useSWR from 'swr'; const fetcher = (url: string) => fetch(url).then(r => r.json()); export function StockQuote({ ticker }: { ticker: string }) { const { data, error, isLoading } = useSWR( `/api/quote/${ticker}`, fetcher, { refreshInterval: 60000 } // Atualiza a cada 60 segundos ); if (error) return
Erro ao carregar cotação
; if (isLoading) return
Carregando...
; const quote = data.results[0]; return (

{quote.symbol}

R$ {quote.regularMarketPrice.toFixed(2)}

); } ``` ### API Route ```typescript // app/api/quote/[ticker]/route.ts import { NextResponse } from 'next/server'; export async function GET( request: Request, { params }: { params: { ticker: string } } ) { const token = process.env.BRAPI_TOKEN; try { const response = await fetch( `https://brapi.dev/api/quote/${params.ticker}?token=${token}` ); if (!response.ok) { return NextResponse.json( { error: 'Failed to fetch quote' }, { status: response.status } ); } const data = await response.json(); return NextResponse.json(data); } catch (error) { return NextResponse.json( { error: 'Internal server error' }, { status: 500 } ); } } ``` ## Node.js com Cache ```typescript import axios from 'axios'; class BrapiService { private cache = new Map(); private cacheDuration = 60000; // 60 segundos constructor(private token: string) {} async getQuote(ticker: string) { const cached = this.cache.get(ticker); const now = Date.now(); if (cached && now - cached.timestamp < this.cacheDuration) { return cached.data; } const response = await axios.get( `https://brapi.dev/api/quote/${ticker}?token=${this.token}` ); this.cache.set(ticker, { data: response.data, timestamp: now }); return response.data; } } // Uso const service = new BrapiService(process.env.BRAPI_TOKEN!); const data = await service.getQuote('PETR4'); ``` ## Boas Práticas 1. **Armazene o token em variáveis de ambiente**: Nunca exponha o token no código 2. **Implemente cache**: Evite requisições desnecessárias 3. **Trate erros adequadamente**: Sempre use try/catch ou .catch() 4. **Use tipos TypeScript**: Aproveite a tipagem para melhor DX 5. **Respeite os limites**: Monitore o uso de requisições ## Próximos Passos * Veja exemplos em [outras linguagens](/docs/examples) * Explore a [documentação completa da API](/docs) * Confira os [endpoints disponíveis](/docs/acoes)