Skip to content

Instantly share code, notes, and snippets.

@maurobaraldi
Last active May 22, 2026 00:58
Show Gist options
  • Select an option

  • Save maurobaraldi/40ec1daf0005530dd94a to your computer and use it in GitHub Desktop.

Select an option

Save maurobaraldi/40ec1daf0005530dd94a to your computer and use it in GitHub Desktop.
Cotações da Bovespa Intraday
#!/usr/bin/env python
from datetime import datetime
from json import loads
from time import gmtime, mktime, strptime
# LevelDict é um wrapper usando dicionário para LevelDB
# https://github.com/maurobaraldi/leveldict
from leveldict import LevelJsonDict
from requests import get
base = 'http://cotacoes.economia.uol.com.br/ws/asset'
assets = base + '/stock/list?size=10000'
intraday = base + '/{asset}/intraday?size=400&callback=uolfinancecallback0'
assets = {i['code']: i['idt'] for i in get(assets).json()['data']}
# 3 ativos para teste
# assets = {'PETR4.SA': 484, 'CTAX4.SA': 227, 'IGUA3.SA': 364}
db = LevelJsonDict('./intraday')
def from_ts(ts):
''' Convert timestamp (13 digits support) to datetime'''
return datetime.fromtimestamp(mktime(gmtime(ts / 1000.0)))
def to_ts(dt):
''' From strftime to timestamp (13 digits support)'''
return int(mktime(strptime(dt, "%Y-%m-%d %H:%M")) * 1000)
def get_intraday(asset):
url = intraday.format(**{'asset': asset})
return loads(get(url).content[20:-2])
if __name__ == '__main__':
for asset, code in assets.iteritems():
today = datetime.now().strftime('%Y%m%d')
quote = get_intraday(code).get('data', {})
db.setdefault(asset)
db[asset] = {today: quote}
@maurobaraldi

Copy link
Copy Markdown
Author

@palencar94 precisa instalar essa biblioteca: https://github.com/rmax-archive/leveldict

@blandre

blandre commented Aug 18, 2020

Copy link
Copy Markdown

Estou recebendo o seguinte erro do intraday para alguns tickers. Alguém tem alguma ideia do que possa ser?

window.getStockQuotesCallback({"error":"FSW-0401","today":1597768397824});

Obrigado por compartilhar esse código!

@maurobaraldi

Copy link
Copy Markdown
Author

@blandre segue a lista de erros

ERRORS= { "FSW-0001":"Este período não é válido.",
"FSW-0002":"Este período não é válido; insira uma data inicial menor que a data final.",
"FSW-0003":"A data inicial não é válida; insira uma data menor que a data de hoje.",
"FSW-0004":"A data final não é válida; insira uma data menor ou igual a data atual.",
"FSW-0101":"Parâmetro size menor que 1","FSW-0102":"Parâmetro page menor que 1",
"FSW-0103":"Parâmetro fields inválido","FSW-0104":"Parâmetro idt menor que 1",
"FSW-0201":"Parâmetro inválido",
"FSW-0202":"Campo IDT inválido",
"FSW-0401":"Não há informação disponível para esta ação/índice.",
"FSW-0402":"Campo target inválido",
"FSW-0404":"URL não encontrada",
"FSW-0500":"Internal Server Error",
"FSW-0400":"Bad Request"
}

@JSergioMartins

JSergioMartins commented Sep 29, 2020 via email

Copy link
Copy Markdown

@gleisonbarion

Copy link
Copy Markdown

Cara, aparentemente eles desligaram a api.....é isso mesmo?

Parece que sim, também não consigo acessar desde o dia 28/09 pela manhã.

O serviço no endereço https://api.cotacoes.uol.com/asset/intraday/ ainda funciona, porém com atraso de 15 minutos nas cotações.

@palencar

Copy link
Copy Markdown

Encontrei uma solução utilizando o pacote yfinance.

# pip install yfinance

>>> import yfinance as yf

>>> df = yf.download('EGIE3.SA', start="2020-09-28", interval = "1m")
[*********************100%***********************]  1 of 1 completed
>>> df
                                Open       High        Low      Close  Adj Close  Volume
Datetime                                                                                
2020-09-28 10:08:00-03:00  41.799999  41.810001  41.680000  41.730000  41.730000       0
2020-09-28 10:09:00-03:00  41.790001  41.820000  41.790001  41.810001  41.810001   10500
2020-09-28 10:10:00-03:00  41.810001  41.910000  41.779999  41.889999  41.889999    8500
2020-09-28 10:11:00-03:00  41.830002  41.830002  41.759998  41.820000  41.820000    1700
2020-09-28 10:12:00-03:00  41.900002  41.900002  41.759998  41.810001  41.810001    1300
...                              ...        ...        ...        ...        ...     ...
2020-09-28 16:50:00-03:00  40.459999  40.490002  40.439999  40.470001  40.470001    4500
2020-09-28 16:51:00-03:00  40.470001  40.490002  40.470001  40.490002  40.490002    1900
2020-09-28 16:52:00-03:00  40.520000  40.540001  40.520000  40.520000  40.520000    5100
2020-09-28 16:53:00-03:00  40.509998  40.590000  40.509998  40.590000  40.590000    2100
2020-09-28 16:54:00-03:00  40.580002  40.619999  40.529999  40.529999  40.529999    2500

[397 rows x 6 columns]
>>> df.to_csv('EGIE3.csv')
>>> 

@andreofgyn

Copy link
Copy Markdown

É, meus amigos, complicado, usava tanto essa api e agora já era, fiz um teste com a https://api.cotacoes.uol.com e infelizmente não atende, não por causa dos 15 minutos de atraso e sim por não conter a cotação do IFIX e de "novos" ativos como o RECR11 (antigo UBSR11) etc, fica aí o exemplo se alguém quiser testar, pois não encontrei muitas informações:

https://api.cotacoes.uol.com/asset/intraday/list/paged/?item=704&format=JSON&fields=price,varpct,var,ask,low,high,open,close,date&size=1

@ZotInfo

ZotInfo commented Oct 2, 2020

Copy link
Copy Markdown

Boa tarde pessoal, a API do site Economia foi desativado? Alguém saberia algum serviço free ou com preço acessível que fornecesse os mesmos dados?

@ZotInfo

ZotInfo commented Oct 2, 2020

Copy link
Copy Markdown

É, meus amigos, complicado, usava tanto essa api e agora já era, fiz um teste com a https://api.cotacoes.uol.com e infelizmente não atende, não por causa dos 15 minutos de atraso e sim por não conter a cotação do IFIX e de "novos" ativos como o RECR11 (antigo UBSR11) etc, fica aí o exemplo se alguém quiser testar, pois não encontrei muitas informações:

https://api.cotacoes.uol.com/asset/intraday/list/paged/?item=704&format=JSON&fields=price,varpct,var,ask,low,high,open,close,date&size=1

Como você faz a consulta dos dados por esse site?

@andreofgyn

andreofgyn commented Oct 2, 2020

Copy link
Copy Markdown

Recomendo a api do yahoo para quem estiver precisando de cotações, infelizmente tem 15 minutos de atraso, mas ta show de bola e permite trazer vários tickers de uma vez, ex:

https://query2.finance.yahoo.com/v7/finance/quote?symbols=^BVSP,PETR4.SA,VALE3.SA,IFIX.SA,KNCR11.SA,USDBRL=X

@ZotInfo

ZotInfo commented Oct 6, 2020

Copy link
Copy Markdown

Recomendo a api do yahoo para quem estiver precisando de cotações, infelizmente tem 15 minutos de atraso, mas ta show de bola e permite trazer vários tickers de uma vez, ex:

https://query2.finance.yahoo.com/v7/finance/quote?symbols=^BVSP,PETR4.SA,VALE3.SA,IFIX.SA,KNCR11.SA,USDBRL=X

Opa obrigado por compartilhar, ele não fornece o histórico intraday?

@andreofgyn

Copy link
Copy Markdown

Opa obrigado por compartilhar, ele não fornece o histórico intraday?

Para histórico, você pode fazer como abaixo, mas ainda não explorei muito:

https://query1.finance.yahoo.com/v8/finance/chart/PETR4.SA?period1=1598922000&period2=1601506800&interval=1d

@xRoDriGox

Copy link
Copy Markdown

Boa noite,

Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000

Obrigado

@rgraziola

Copy link
Copy Markdown

Boa noite,

Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000

Obrigado

Esse ai ja era.
Outra saida de uso pode ser esse abaixo.

http://bvmf.bmfbovespa.com.br/cotacoes2000/FormConsultaCotacoes.asp?strListaCodigos=USIM5|PETR4

@djalmaaraujo

Copy link
Copy Markdown

A da uol morreu mesmo.

@ZotInfo

ZotInfo commented Oct 26, 2020

Copy link
Copy Markdown

Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigado

Esse ai ja era.
Outra saida de uso pode ser esse abaixo.

http://bvmf.bmfbovespa.com.br/cotacoes2000/FormConsultaCotacoes.asp?strListaCodigos=USIM5|PETR4

Será que essa ai vai durar bastante?

@eltoncayo

Copy link
Copy Markdown

Putzz usava desde ano passado essa da UOL. A alternativa atual é só do yahoo mesmo?

@vitorsma

Copy link
Copy Markdown

Boa noite,

Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000

Obrigado

https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id

@savioramos

Copy link
Copy Markdown

Esta scritpt está rodando bonitinho:

https://pypi.org/project/yahooquery/

@MatheusVp2

Copy link
Copy Markdown

Sabem de algum site que mostra em tempo real ?
Sem atraso, consigo analisar e/ou fazer um scraping, caso queiram !
Trazendo os dados formatados !

@eltoncayo

Copy link
Copy Markdown

Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigado

https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id

Me salvou, obrigado!

@thaleshcv

Copy link
Copy Markdown

Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigado

https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id

Valeu pela dica. Sabe quais os valores possíveis para o parâmetro fields?

@ZotInfo

ZotInfo commented Jan 8, 2021

Copy link
Copy Markdown

Boa noite,
Alguem consegue me dizer como ficou essa chamada? Onde listava todos os ativos da Bolsa?
http://cotacoes.economia.uol.com.br/ws/asset/stock/list?size=10000
Obrigado

https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=abbreviation,id

Valeu pela dica. Sabe quais os valores possíveis para o parâmetro fields?

Também gostaria de saber os fields disponíveis para esse link, será que tem alguma documentação?

@ZotInfo

ZotInfo commented Jan 8, 2021

Copy link
Copy Markdown

Parece que encontrei algo útil nesse post:
https://stackoverflow.com/questions/62963923/get-value-from-graphicview-bidvalue

Porém ao testar os outros fields não obtive resultado :/

@BeneInfosec

Copy link
Copy Markdown

Não consigo baixar o 'py-leveldb" pois a url dele não existe mais. O que eu faço nesse caso?

@cortextecnologia

Copy link
Copy Markdown

https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=id,abbreviation,name,companies,exchange

Alguém sabe qual o nome do "fields" para mostrar o tipo: Ações, FII, ETF, etc.???
ps: o Type "S" significa o que?

@ZotInfo

ZotInfo commented Aug 2, 2021

Copy link
Copy Markdown

https://api.cotacoes.uol.com/asset/list/?format=JSON&fields=id,abbreviation,name,companies,exchange

Alguém sabe qual o nome do "fields" para mostrar o tipo: Ações, FII, ETF, etc.???
ps: o Type "S" significa o que?

Também gostaria de saber os fields disponíveis para essa API

@isaacangello

Copy link
Copy Markdown

consegui dar uma ratreada e saber mas campos
https://api.cotacoes.uol.com/currency/intraday/list?currency=1&fields=bidvalue,askvalue,date,variationpercentbid
bidvalue = valor de venda
askvalue = valor de compra ()
variationpercentbid = variação da moeda (importante pra saber se a moeda tá subindo ou descendo)

@isaacangello

Copy link
Copy Markdown

mas alguém sabe como resolver esse erro aqui ?
"has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled."

@turicas

turicas commented May 22, 2026

Copy link
Copy Markdown

Pessoal, criei uma biblioteca Python para pegar dados do mercado financeiro diretamente das fontes originais (chama-se mercados), assim caso a API do UOL não funcione mais, vocês conseguem pegar diretamente da B3 e o resultado já vem em uma dataclass Python com todos os valores convertidos (datetime.date, decimal.Decimal etc.).

Existem várias formas de pegar os valores do último pregão (dá pra pegar inclusive as negociações intradiárias), mas segue um exemplo que detecta a última data disponível e pega todos os ativos (tem preço de abertura, mínimo, médio, máximo e de fechamento, além de número de negócios e volume).

Basta instalar diretamente do Github:

pip install https://github.com/PythonicCafe/mercados/archive/develop.zip
# `pip install mercados` funciona, mas a versão do PyPI ainda não foi atualizada e não tem algumas funcionalidades

Exemplo para coletar e mostrar alguns negócios para uma determinada data (tem ações, fundos listados, ETFs, opções etc.):

import datetime
from mercados.b3 import B3

b3 = B3()
for negociacao in b3.negociacao_bolsa("dia", datetime.date(2017, 5, 17)):  # Joesley Day
    if negociacao.codigo_negociacao in ("PETR4", "POMO4", "ITUB4"):
        print(negociacao.codigo_negociacao, negociacao.preco_abertura, negociacao.preco_ultimo)
        # `negociacao` é um objeto dataclass com diversos campos

# Resultado (é o preço original, não ajustado):
# ITUB4 39.83 39.43
# PETR4 15.56 15.61
# POMO4 2.93 2.87

Exemplo mais completo, que baixa todas as negociações do último dia disponível (pula fim de semana, feriados etc.) e salva em um CSV:

import csv
import datetime
from pathlib import Path

from mercados.b3 import B3

DIAS_PROBE = 8  # Retrocesso máximo em dias na auto-detecção de data, para cobrir feriados prolongados (hoje + 7d)
codigos = {}  # `set` com os códigos de negociação a filtrar, ex: codigos = {"PETR4", "POMO4", ...}
data = None  # Data do pregão. Se é `None`, então pega a última disponível. Poderia ser: datetime.date(2026, 5, 20)

if data is None:
    hoje = datetime.datetime.now().date()
    datas = [hoje - datetime.timedelta(days=i) for i in range(DIAS_PROBE)]
else:
    datas = [data]

b3 = B3()
registros = []
for data in datas:
    try:
        for negocio in b3.negociacao_bolsa("dia", data):
            if not codigos or negocio.codigo_negociacao in codigos:
                if negocio.codigo_negociacao in ("POMO4", "XPML11"):  # Mostra dados de exemplo
                    print(f"Exemplo de dado coletado: {negocio}")
                if not registros and len(datas) > 1:
                    print(f"Data auto-detectada: {data}")
                registros.append(negocio.serialize())  # .serialize transforma objeto dataclass em dict
    except BadZipFile:  # Arquivo ZIP não existe/está vazio para essa data
        continue
    else:
        break  # Coleta apenas para a primeira data encontrada

csv_filename = Path(f"negocios-b3-{data}.csv")
print(f"Coletados {len(registros)} registros, salvando em {csv_filename}.")
with csv_filename.open(mode="w") as fobj:
    writer = csv.DictWriter(fobj, fieldnames=list(registros[0].keys()))
    writer.writeheader()
    for registro in registros:
        writer.writerow(registro)

Resultado:

Data auto-detectada: 2026-05-21
Exemplo de dado coletado: NegociacaoBolsa(quantidade=6271000, pontos_strike=None, data=datetime.date(2026, 5, 21), data_vencimento=None, negociacoes=7782, lote=1, indice_correcao=0, distribuicao=106, codigo_bdi=2, codigo_tipo_mercado=10, prazo_termo=None, codigo_isin='BRPOMOACNPR7', codigo_negociacao='POMO4', moeda='R$', nome_pregao='MARCOPOLO', tipo_papel='PN      N2', preco_abertura=Decimal('5.98'), preco_maximo=Decimal('6.05'), preco_minimo=Decimal('5.86'), preco_medio=Decimal('5.95'), preco_ultimo=Decimal('5.98'), preco_melhor_oferta_compra=Decimal('5.98'), preco_melhor_oferta_venda=Decimal('5.99'), volume=Decimal('37325013.00'), preco_execucao=Decimal('0.00'))
Exemplo de dado coletado: NegociacaoBolsa(quantidade=138270, pontos_strike=None, data=datetime.date(2026, 5, 21), data_vencimento=None, negociacoes=20250, lote=1, indice_correcao=0, distribuicao=211, codigo_bdi=12, codigo_tipo_mercado=10, prazo_termo=None, codigo_isin='BRXPMLCTF000', codigo_negociacao='XPML11', moeda='R$', nome_pregao='FII XP MALLS', tipo_papel='CI  ER', preco_abertura=Decimal('107.08'), preco_maximo=Decimal('107.30'), preco_minimo=Decimal('106.67'), preco_medio=Decimal('106.98'), preco_ultimo=Decimal('107.05'), preco_melhor_oferta_compra=Decimal('107.04'), preco_melhor_oferta_venda=Decimal('107.05'), volume=Decimal('14793038.88'), preco_execucao=Decimal('0.00'))
Coletados 13431 registros, salvando em negocios-b3-2026-05-21.csv.

O projeto também tem uma interface de linha de comando, então caso não queiram programar, dá pra baixar os dados e gerar um CSV diretamente:

python -m mercados.b3 negociacao-bolsa dia 2026-05-20 negociacao-2026-05-20.csv
wc -l negociacao-2026-05-20.csv # 14212 negociacao-2026-05-20.csv

Para quem quiser saber mais sobre a biblioteca, veja o vídeo da minha palestra sobre ela na PythonBrasil 2025.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment