Loading

Introdução 🚀


Integrar soluções e implementar novos serviços nunca é uma tarefa simples, especialmente no mercado financeiro, onde lidamos com múltiplos fornecedores e diversas APIs Swagger — cada uma com nomenclaturas distintas para conceitos semelhantes, diferentes formas de autenticação e outras particularidades.

Sabemos exatamente como é esse desafio, porque já estivemos do outro lado. Por isso, criamos esta documentação da forma como gostaríamos de encontrá-la se fôssemos os responsáveis pela integração. Nos esforçamos para trazer distinções claras e precisas, incluir diversos exemplos em diferentes linguagens — ainda que o Python seja nossa favorita — e garantir que o material seja realmente útil para você.

Mas não pare por aqui! Abaixo, disponibilizamos nossos contatos. Se ainda tiver dúvidas, não hesite em nos chamar. Afinal, ninguém nasce sabendo!

Autenticação 🔑


A autenticação é necessária para acessar com segurança os endpoints da API que exigem verificação do usuário. O processo de autenticação envolve o envio das credenciais do usuário para um endpoint de autenticação, que retorna um token de acesso caso o login seja bem-sucedido.


Como Funciona a Autenticação ?
  • Credenciais do Usuário: O cliente (usuário ou aplicação) fornece um nome de usuário e uma senha.
  • API Request: As credenciais são enviadas por meio de uma requisição POST para o endpoint de autenticação (/api-token-auth/).
  • Validação no Servidor: O servidor verifica se o nome de usuário e a senha são válidos.
  • Geração do Token: Se as credenciais estiverem corretas, o servidor gera um token e o retorna na resposta.

Sucesso ou Falha na Autenticação:
  • 1) Se a autenticação for bem-sucedida, o token é retornado e pode ser utilizado em futuras requisições à API.
  • 2) Se a autenticação falhar, uma mensagem de erro e um código de status apropriado serão retornados.
Status Code Meaning Solution
200 Authentication Successful Use the token in subsequent requests
400 Bad Request Check the request format
401 Unauthorized Invalid credentials, retry with correct username/password
500 Server Error Server issue, try again later

Code Sample 💻

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
            
                import requests

                # Define the authentication endpoint URL
                auth_url = 'https://www.otdx-api.com.br/api-token-auth/'

                # User credentials for authentication
                username = 'your_username'  # Replace with actual username
                password = 'your_password'  # Replace with actual password

                # Send a POST request with login credentials to obtain the authentication token
                auth_response = requests.post(auth_url, data={
                    'username': username,
                    'password': password
                })

                # Check if authentication was successful
                if auth_response.status_code == 200:
                    # Extract the token from the response
                    token = auth_response.json().get('token')
                    print(f"Authentication successful. Token: {token}")
                else:
                    print(f"Authentication failed. Status Code: {auth_response.status_code}")
                    print("Error:", auth_response.text)
            
        

Bug Report 🐛


Para facilitar o registro de problemas – seja no download de arquivos assíncronos ou em outros endpoints que exigem manutenção de registros e suportam um volume significativo de ajustes – desenvolvemos a suíte de endpoints denominada “Bug Report”.


Reportar problemas no download de arquivos assíncronos:

Considerando que nem tudo é perfeito e, diante do alto volume de operações aliado às rigorosas regras regulamentares, podem ocorrer eventuais problemas no download assíncrono de arquivos (como caixa-pdf, caixa-xls, carteira-pdf, carteira-xls, mec-pdf, mec-xls, posicao-anbima4, posicao-anbima5, nav-historical), criamos este endpoint especificamente para que você possa nos relatar essas inconsistências. Assim, garantimos um atendimento ágil e eficiente.

            https://www.otdx-api.com.br/submit/bug/async
        

payload = {
    "reportTitle": "Problemas no download",
    "asyncTaskReport": "carteira-pdf",
    "requestPayload": {
        "codigoCarteira": "46121_CLD",
        "dataTarget": "2025-03-06",
        "tipoCota": "F"
    },
    "problemDescription": "Estamos com problemas com isso e isso",
    "email4Feedback": "your_email@example.com",
}

Description:
            
                reportTitle: 'Título do Bug Report: Informe um título conciso e descritivo que identifique claramente o problema',
                asyncTaskReport: 'Tipo de Tarefa Assíncrona na qual o problema foi identificado',
                requestPayload: 'Objeto JSON contendo todos os dados enviados na requisição, essenciais para reproduzir e diagnosticar o erro',
                problemDescription: 'Forneça uma explicação completa do problema, incluindo os passos para reproduzi-lo, o comportamento esperado e o comportamento observado',
                email4Feedback: 'Insira um endereço de e-mail válido para que possamos enviar notificações e atualizações assim que o problema for resolvido',
            
        
Code Sample 💻

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
            import requests

            # Replace these with your actual credentials
            USERNAME = '******'
            PASSWORD = '******'

            # API endpoints
            auth_url = 'https://www.otdx-api.com.br/api-token-auth/'
            api_url = 'https://www.otdx-api.com.br/submit/bug/async'

            # Bug report payload
            report_data = {
                "reportTitle": "Problemas no download",
                "asyncTaskReport": "carteira-pdf",
                "requestPayload": {
                    "codigoCarteira": "46121_CLD",
                    "dataTarget": "2025-03-06",
                    "tipoCota": "F"
                },
                "problemDescription": "Estamos com problemas com isso e isso",
                "email4Feedback": "your_email@example.com",
            }

            try:
                # Authenticate and get the token
                auth_response = requests.post(auth_url, data={'username': USERNAME, 'password': PASSWORD})
                auth_response.raise_for_status()  # Check for HTTP errors
                token = auth_response.json().get('token')
                if not token:
                    raise ValueError("Token not found in authentication response.")
                print("Authentication successful. Token obtained.")

                # Submit the bug report using the token
                headers = {'Authorization': f'Token {token}'}
                report_response = requests.post(api_url, json=report_data, headers=headers)
                report_response.raise_for_status()  # Check for HTTP errors
                print("Bug report submitted successfully!")
                print("Status Code:", report_response.status_code)
                print("Response:", report_response.text)

            except Exception as e:
                print("An error occurred:", e)
            
        

Dados Diários 📰


Esta suíte de endpoints foi projetada para permitir aos usuários a extração de dados relevantes do dia, visando a otimização das atividades operacionais, o ganho de escala e a melhoria na entrega das informações. É importante destacar que, devido à natureza dinâmica dos dados e à possibilidade de alterações, a obtenção de dados históricos não está disponível neste conjunto de endpoints.


Dados de PL/COTA:

Por meio do endpoint abaixo, você poderá consultar as informações de P&L e cotas, além de dados complementares, de todos os fundos contemplados pela sua política de Chinese Wall. Para fundos de fechamento, serão disponibilizadas em D0 as informações referentes a D-1, enquanto para fundos de abertura, as informações de cotas de D0 estarão acessíveis no próprio D0, respeitando as particularidades de cada fundo de investimento. É importante destacar que, para garantir a eficiência na entrega desses dados, nossa base de dados é atualizada continuamente. No entanto, dependendo da quantidade de fundos contemplados na política de Chinese Wall do usuário, pode haver um delay aproximado de 10 minutos entre a liberação de uma carteira pelas equipes de controladoria e a disponibilização dos dados atualizados em nossa plataforma.

            https://www.otdx-api.com.br/daily/plcota
        
Os dados disponibilizados neste endpoint correspondem às informações liberadas por nossa equipe de controladoria de fundos, porém, não necessariamente foram aprovadas pelo backoffice da equipe do administrador. Para assegurar o uso diligente dessas informações, recomenda-se a validação cruzada com os endpoints de 'aprovação de cotas' e/ou 'solicitação de reprocessamento'.
Detalhamento dos dados retornados:
            
                lastUpdate: 'Data e hora da última sincronização dessas informações com nossos sistemas internos',
                dataTarget: 'Data de referência para a entrega das informações da carteira',
                portfolioCode: 'Código de referência da carteira em nossos sistemas internos',
                portfolioName: 'Nome completo do portfólio de investimentos',
                portfolioCnpj: 'Número único que identifica legalmente uma empresa',
                portfolioType: 'Classificação do tipo de carteira de investimentos',
                quoteType: 'Classificação do tipo de cota da carteira de investimentos (abertura ou fechamento)',
                codigoIsin: 'Padrão internacional de 12 caracteres alfanuméricos utilizado para identificar o fundo',
                quantidadeCotas: 'Número total de cotas',
                valorCotaLiquida: 'Valor líquido por cota',
                valorPatrimonioLiquido: 'Valor do patrimônio líquido',
            
        
Code Sample 💻

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
            
                import requests
                import pandas as pd

                # Define the API endpoint URLs
                auth_url = 'https://www.otdx-api.com.br/api-token-auth/'
                api_url = 'https://www.otdx-api.com.br/daily/plcota'

                # Define the username and password for authentication
                username = 'your_username'  # Replace with actual username
                password = 'your_password'  # Replace with actual password

                # Authenticate and obtain the Token
                auth_response = requests.post(auth_url, data={'username': username, 'password': password})
                auth_response.raise_for_status()  # Raise an error if the request fails

                # Extract the Token from the authentication response
                token = auth_response.json().get('token')
                if not token:
                    raise ValueError("Token not found in authentication response.")

                # Define headers to include the Token for authentication
                headers = {'Authorization': f'Token {token}'}

                # Make a GET request to the API with the headers
                api_response = requests.get(api_url, headers=headers)
                api_response.raise_for_status()

                # Parse the JSON response
                api_data = api_response.json()
                print(api_data)
            
        

Tarefas Assincronas 🤖


As tarefas assíncronas no nosso Swagger permitem a execução de processos mais complexos com maior comodidade para você. Nesse modelo, ao fazer uma solicitação, você receberá um identificador único enquanto a tarefa é processada em segundo plano. Posteriormente, poderá consultar outro endpoint utilizando esse identificador para acompanhar o status da solicitação. Dessa forma, garantimos a execução eficiente das tarefas, evitando impactos negativos na sua experiência.

O status da sua solicitação assíncrona pode ser acompanhado por meio da hashtask correspondente, acessando o grupo de endpoints denominado 'Asynchronous Recovery'.
Demonstrativo de Caixa em PDF:

Esta tarefa assíncrona permite o download do demonstrativo de caixa do seu portfólio de investimentos para um intervalo de datas, com um limite máximo de 22 dias úteis, abrangendo qualquer um dos fundos disponíveis na sua política de Chinese Wall.

            https://www.otdx-api.com.br/async/caixa-pdf
        

payload = {
    "codigoCarteira": "11111_SUB1",
    "dataTargetRangeInferior": "2024-03-26",
    "dataTargetRangeSuperior": "2024-03-27",
}

Code Sample 💻

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
            
                import requests

                # Replace these with your actual credentials
                USERNAME = '******'
                PASSWORD = '******'

                # Authenticate and obtain the Token
                api_url = 'https://www.otdx-api.com.br/async/caixa-pdf'
                response = requests.post('https://www.otdx-api.com.br/api-token-auth/', data={'username': username, 'password': password})


                # Check if the authentication was successful
                if response.status_code == 200:
                    # Extract the Token from the response
                    token = response.json()['token']

                    # Define the data to be sent in the request payload
                    data = {
                        'codigoCarteira': '17571',
                        'dataTargetRangeInferior': '2024-03-26',
                        'dataTargetRangeSuperior': '2024-03-27',
                    }

                    # Define headers to include the Token for authentication
                    headers = {
                        'Authorization': f'Token {token}',
                    }

                    # Make a POST request to the API with the data and headers
                    response = requests.post(api_url, json=data, headers=headers)

                    # Check the status code of the API response
                    if response.status_code == 200:
                        api_response = response.json()
                        print(api_response)
                    else:
                        # If the request was not successful, print the error message
                        print(f"Request failed with status code {response.status_code}")
                        print(response.text)  # This will print the error message from the API

                else:
                    # If authentication fails, print an error message
                    print(f"Authentication failed with status code {response.status_code}")
            
        

Demonstrativo de Caixa em XLS (na verdade csv):

Embora o arquivo seja nomeado com a extensão .xls, na realidade, trata-se de um arquivo no formato CSV. Optamos por manter essa nomenclatura para evitar transtornos, considerando o histórico de uso e o conhecimento desse detalhe por nossos clientes. No entanto, é importante estar atento para evitar erros ao recuperar esse relatório de forma assíncrona.

            https://www.otdx-api.com.br/async/caixa-xls
        

payload = {
    "codigoCarteira": "11111_SUB1",
    "dataTargetRangeInferior": "2024-03-26",
    "dataTargetRangeSuperior": "2024-03-27",
}

Code Sample 💻

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
            
                import requests

                # Replace these with your actual credentials
                USERNAME = '******'
                PASSWORD = '******'

                # Authenticate and obtain the Token
                api_url = 'https://www.otdx-api.com.br/async/caixa-xls'
                response = requests.post('https://www.otdx-api.com.br/api-token-auth/', data={'username': username, 'password': password})

                # Check if the authentication was successful
                if response.status_code == 200:
                    # Extract the Token from the response
                    token = response.json()['token']

                    # Define the data to be sent in the request payload
                    data = {
                        'codigoCarteira': '17571',
                        'dataTargetRangeInferior': '2024-03-26',
                        'dataTargetRangeSuperior': '2024-03-27',
                    }

                    # Define headers to include the Token for authentication
                    headers = {
                        'Authorization': f'Token {token}',
                    }

                    # Make a POST request to the API with the data and headers
                    response = requests.post(api_url, json=data, headers=headers)

                    # Check the status code of the API response
                    if response.status_code == 200:
                        api_response = response.json()
                        print(api_response)
                    else:
                        # If the request was not successful, print the error message
                        print(f"Request failed with status code {response.status_code}")
                        print(response.text)  # This will print the error message from the API

                else:
                    # If authentication fails, print an error message
                    print(f"Authentication failed with status code {response.status_code}")
            
        

Composição de Carteira em PDF:

Este é, sem dúvida, um dos relatórios mais importantes para o dia a dia do administrador. O relatório de composição de carteira diário fornece uma visão detalhada da estrutura da carteira do fundo em uma determinada data, apresentando os ativos que a compõem, suas quantidades, preços, valores e o percentual em relação ao patrimônio total do fundo.

            https://www.otdx-api.com.br/async/carteira-pdf
        

payload = {
    "codigoCarteira": "461200_SUB1",
    "dataTarget": "2025-03-06",
    "tipoCota": "F",
}

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
            
                import requests

                # Configuração do endpoint da API
                AUTH_URL = 'https://www.otdx-api.com.br/api-token-auth/'
                API_URL = 'https://www.otdx-api.com.br/async/carteira-pdf'

                # Credenciais de autenticação
                USERNAME = '******'
                PASSWORD = '******'

                # Autenticação e obtenção do token
                auth_response = requests.post(
                    AUTH_URL,
                    data={'username': USERNAME, 'password': PASSWORD},
                    verify=False
                )

                # Verifica se a autenticação foi bem-sucedida
                if auth_response.status_code == 200:
                    token = auth_response.json().get('token')

                    # Definição dos dados para requisição
                    payload = {
                        'codigoCarteira': '461200_SUB1',
                        'dataTarget': '2025-03-06',
                        'tipoCota': 'F'
                    }

                    # Cabeçalhos da requisição com o token de autenticação
                    headers = {'Authorization': f'Token {token}'}

                    # Envio da requisição POST para o endpoint
                    api_response = requests.post(API_URL, json=payload, headers=headers, verify=False)

                    # Verifica se a requisição foi bem-sucedida
                    if api_response.status_code == 200:
                        print("Requisição bem-sucedida:")
                        print(api_response.json())
                    else:
                        print(f"Erro na requisição: Código {api_response.status_code}")
                        print(api_response.text)
                else:
                    print(f"Erro na autenticação: Código {auth_response.status_code}")
            
        

Fundamental 📈


Este conjunto de endpoints centraliza as informações essenciais dos seus fundos de investimento, integrando dados cadastrais e complementares sobre as operações e o fluxo de processamento.


Horário de Liberação:

Esta consulta permite acompanhar detalhadamente o horário de liberação de cota das operações pelo time de backoffice de controladoria. Vale ressaltar que não se refere ao momento em que as informações são divulgadas ao mercado, mas sim à disponibilização da cota para o administrador, que, ao receber os dados diários, pode realizar sua rotina de validação da carteira e, em seguida, aprovar ou reprovar a cota fornecida pela equipe de controladoria.

            https://www.otdx-api.com.br/horario-liberacao
        
Detalhamento dos dados retornados:
            
                portfolioCode: 'Código de referência da carteira em nossos sistemas internos',
                id: 'Identificador exclusivo vinculado ao evento informado',
                data_liberacao: 'Data alvo da liberação da cota',
                resultado: 'Status de liberação',
                portfolio_name: 'Nome completo do portfólio de investimentos',
                portfolio_cnpj: 'Número único que identifica legalmente uma empresa',
                portfolio_type: 'Classificação do tipo de carteira de investimentos',
                quote_type: 'Classificação do tipo de cota da carteira de investimentos (abertura ou fechamento)',
                stamp_liberacao: 'Horário em que a cota foi liberada pelo time de controladoria'
            
        
Code Sample 💻

A seguir, apresentamos exemplos de uso deste endpoint em diferentes linguagens de programação. Clique no botão correspondente para visualizar cada um deles.

Python Java PHP C# Node.js
          
            import requests
            
            # API endpoints and credentials
            BASE_URL = 'https://www.otdx-api.com.br'
            TOKEN_URL = f'{BASE_URL}/api-token-auth/'
            HORARIO_URL = f'{BASE_URL}/horario-liberacao'
            userName = '*************'
            userPass = '*************'
            
            # Authenticate to obtain the access token
            tokenResp = requests.post(TOKEN_URL, data={'username': userName, 'password': userPass})
            if tokenResp.status_code == 200:
                tokenVal = tokenResp.json().get('token')
                headers = {'Authorization': f'Token {tokenVal}'}
            else:
                print("Authentication error:", tokenResp.text)
                exit(1)
            
            # Fetch page 1 to get total pages
            params = {'page': 1}
            page1Resp = requests.get(HORARIO_URL, headers=headers, params=params)
            if page1Resp.status_code != 200:
                print("Error on page 1:", page1Resp.text)
                exit(1)
            dataPage1 = page1Resp.json()
            print("Page 1 data:", dataPage1)
            
            # Determine total pages (default 1)
            totalPages = dataPage1.get('total_pages', 1)
            
            # Loop over remaining pages if any
            for page in range(2, totalPages + 1):
                params = {'page': page}
                pageResp = requests.get(HORARIO_URL, headers=headers, params=params)
                if pageResp.status_code == 200:
                    print(f"Page {page} data:", pageResp.json())
                else:
                    print(f"Failed to fetch page {page}:", pageResp.text)