# API Routes Documentation This document outlines the available endpoints based on the provided controllers (**LoginController** and **RegisterController**). **Base URL Placeholder:** `http://localhost:8000` --- ## 1. User Login Authenticates a user and returns a JWT token. ### **Endpoint** `POST /login` ### **Headers** `Content-Type: application/json` ### **Request Body (JSON)** ```json { "email": "john.doe@example.com", "password": "securepassword123" } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/login' \ --header 'Content-Type: application/json' \ --data '{ "email": "john.doe@example.com", "password": "securepassword123" }' ``` ### **Responses** #### **200 OK (Success)** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_OK", "data": { "token": "", "user_id": 1, "company_id": 1 } } ``` #### **401 Unauthorized (Missing fields or Invalid credentials)** ```json { "status": "fail", "message": "Invalid credentials", "code": "E_VALIDATE" } ``` --- ## 2. User Register Creates a new user account in the database. ### **Endpoint** `POST /register` ### **Headers** `Content-Type: application/json` ### **Request Body (JSON)** ```json { "username": "John Doe", "email": "john.doe@example.com", "password": "securepassword123", "phone": "+15550199", "address": "123 Tech Street", "city": "Silicon Valley", "state": "CA", "zip": "94000", "country": "USA", "kyc": 1, "birthdate": 631152000, "cpf": "12345678900", "company_id": 1, "role_id": 2 } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/register' \ --header 'Content-Type: application/json' \ --data '{ "username": "John Doe", "email": "john.doe@example.com", "password": "securepassword123", "phone": "+15550199", "address": "123 Tech Street", "city": "Silicon Valley", "state": "CA", "zip": "94000", "country": "USA", "kyc": 1, "birthdate": 631152000, "cpf": "12345678900", "company_id": 1, "role_id": 1 }' ``` ### **Responses** #### **200 OK (Success)** ```json { "status": "success", "code": "S_CREATED", "data": { "user_id": 45, "user_name": "John Doe", "user_email": "john.doe@example.com", "company_id": 1, "role_id": 2 } } ``` #### **400 Bad Request (Validation Errors)** * Missing required fields * Invalid email format * Password too short (< 8 characters) * Email already exists ```json { "status": "fail", "message": "Missing field: phone", "code": "E_VALIDATE" } ``` --- ## 3. Create Company with User and Wallet Creates a company, a user linked to it, and a wallet (address/publicKey/privateKey) in a single transaction. Public endpoint (no auth). ### **Endpoint** `POST /company/user/create` ### **Headers** `Content-Type: application/json` ### **Request Body (JSON)** ```json { "company_name": "Acme Corp", "username": "John Doe", "email": "john.doe@example.com", "password": "secret123", "phone": "+55 11 99999-9999", "address": "Rua A, 123", "city": "Sao Paulo", "state": "SP", "zip": "01234-567", "country": "BR", "kyc": 1, "birthdate": 631152000, "cpf": "123.456.789-00", "cnpj": "00000000000001" } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/company/user/create' \ -H 'Content-Type: application/json' \ --data '{ "company_name": "MixTech", "username": "LuvasLuvas", "email": "Luvas@email.com", "password": "secret123", "phone": "+55 16 93939-2222", "address": "Rua A, 123", "city": "Sao Paulo", "state": "SP", "zip": "01234-567", "country": "BR", "kyc": 1, "birthdate": 631152000, "cpf": "12345678900", "cnpj": "00000000000030" }' ``` ### **Responses** #### **200 OK (Success)** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_CREATED", "data": { "company_id": 1, "role_id": 1, "user": { "user_id": 1, "user_name": "John Doe", "user_email": "john.doe@example.com", "company_id": 1, "role_id": 1 }, "wallet_id": 1, "wallet_address": "0x8AC9615b1a555BeA2938778aAef1ead35205c167" } } ``` #### **400 Bad Request (Validation Errors)** ```json { "status": "failed", "msg": "Password must be at least 8 characters", "code": "E_VALIDATE", "data": [] } ``` #### **500 Internal Server Error (Wallet/DB issues)** ```json { "status": "failed", "msg": "Wallet generation failed", "code": "E_INTERNAL", "data": [] } ``` --- ## 4. Change User Email Updates the authenticated user's email. Requires JWT. ### **Endpoint** `POST /user/change-email` ### **Headers** `Content-Type: application/json` `Authorization: Bearer ` ### **Request Body (JSON)** ```json { "email": "new.email@example.com" } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/user/change-email' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ --data '{"email":"new.email@example.com"}' ``` ### **Responses** #### **200 OK (Updated)** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_UPDATED", "data": { "user_id": 1, "user_email": "new.email@example.com" } } ``` #### **400 Bad Request (Validation Errors)** ```json { "status": "failed", "msg": "Email already in use or update failed", "code": "E_VALIDATE", "data": [] } ``` #### **401 Unauthorized** ```json { "status": "failed", "msg": "Unauthorized", "code": "E_VALIDATE", "data": [] } ``` --- ## 5. Change User Password Changes the authenticated user's password. Requires JWT. ### **Endpoint** `POST /user/change-password` ### **Headers** `Content-Type: application/json` `Authorization: Bearer ` ### **Request Body (JSON)** ```json { "current_password": "minhaSenhaAtual", "new_password": "novaSenhaForte123" } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/user/change-password' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ --data '{"current_password":"minhaSenhaAtual","new_password":"novaSenhaForte123"}' ``` ### **Responses** #### **200 OK (Updated)** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_UPDATED", "data": { "user_id": 1 } } ``` #### **400 Bad Request (Validation Errors)** ```json { "status": "failed", "msg": "Invalid current password or update failed", "code": "E_VALIDATE", "data": [] } ``` #### **401 Unauthorized** ```json { "status": "failed", "msg": "Unauthorized", "code": "E_VALIDATE", "data": [] } ``` ## 6. Commodities — List Returns all commodities. No request body required. Requires JWT. ### **Endpoint** `POST /commodities/get` ### **Headers** `Authorization: Bearer ` ### **cURL Example** ```bash curl --location -X POST 'http://localhost:8000/commodities/get' \ -H 'Authorization: Bearer ' ``` ### **Responses** #### **200 OK** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_OK", "data": [ { "commodities_id": 1, "name": "Gold", "flag": "a" } ] } ``` #### **204 No Content** ```json { "status": "fail", "msg": "Commodities Not Found", "code": "E_DATABASE", "data": [] } ``` --- ## 7. Commodity Create Creates a new commodity. ### **Endpoint** `POST /commodity/create` ### **Headers** `Content-Type: application/json` ### **Request Body (JSON)** ```json { "name": "Gold", "flag": "a" } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/commodity/create' \ -H 'Content-Type: application/json' \ --data '{ "name": "Gold", "flag": "a" }' ``` ### **Responses** #### **200 OK (Created)** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_CREATED", "data": { "commodities_id": 10, "name": "Gold", "flag": "a" } } ``` #### **400 Bad Request (Missing name)** ```json { "status": "fail", "msg": "Validation failed: name is required", "code": "E_VALIDATE", "data": [] } ``` --- ## 8. Commodity Update Updates an existing commodity. ### **Endpoint** `POST /commodity/update` ### **Headers** `Content-Type: application/json` ### **Request Body (JSON)** ```json { "commodities_id": 10, "name": "Silver", "flag": "b" } ``` You may send **only name**, **only flag**, or both. ### **cURL Example** ```bash curl --location 'http://localhost:8000/commodity/update' \ -H 'Content-Type: application/json' \ --data '{ "commodities_id": 10, "name": "Silver", "flag": "b" }' ``` ### **Responses** #### **200 OK** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_UPDATED", "data": { "commodities_id": 10, "name": "Silver", "flag": "b" } } ``` #### **400 Bad Request** * Missing commodities_id * Empty name * No fields to update ```json { "status": "fail", "msg": "Validation failed: nothing to update", "code": "E_VALIDATE", "data": [] } ``` #### **204 No Content** ```json { "status": "fail", "msg": "Commodity Not Found or Not Updated", "code": "E_DATABASE", "data": [] } ``` --- ## 9. Commodity Delete Deletes a commodity by ID. ### **Endpoint** `POST /commodity/delete` ### **Headers** `Content-Type: application/json` ### **Request Body (JSON)** ```json { "commodities_id": 10 } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/commodity/delete' \ -H 'Content-Type: application/json' \ --data '{"commodities_id":10}' ``` ### **Responses** #### **200 OK (Deleted)** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_DELETED", "data": { "deleted": true } } ``` #### **400 Bad Request** ```json { "status": "fail", "msg": "Validation failed: invalid commodities_id", "code": "E_VALIDATE", "data": [] } ``` #### **204 No Content** ```json { "status": "fail", "msg": "Commodity Not Found", "code": "E_DATABASE", "data": [] } ``` --- ## 10. Token Get Returns all tokens filtered by `token_uf` and `commodities_name`. Requires JWT. ### **Endpoint** `POST /token/get` ### **Headers** `Content-Type: application/json` `Authorization: Bearer ` ### **Request Body (JSON)** ```json { "token_uf": "SP", "commodities_name": "soja" } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/token/get' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ --data '{ "token_uf": "SP", "commodities_name": "soja" }' ``` ### **Responses** #### **200 OK** ```json { "status": "ok", "msg": "[100] Request ok.", "code": "S_OK", "data": [ { "token_id": 1, "token_external_id": "abc123", "token_commodities_amount": 1000, "token_commodities_value": 5000, "token_uf": "SP", "token_city": "Sao Paulo", "token_content": "financial instrument", "token_flag": "a", "wallet_id": 1, "chain_id": 1, "commodities_id": 1, "cpr_id": 1, "user_id": 1 } ] } ``` #### **204 No Content** ```json { "status": "fail", "msg": "Token Not Found", "code": "E_DATABASE", "data": [] } ``` --- ## 11. B3 — CPR Register Receives a CPR payload in the **flat** format used by our database, saves it in the `cpr` table, converts it to the B3 nested format, automatically obtains a B3 access token (mTLS), and sends it to the B3 CPR registration endpoint. ### **Endpoint** `POST /b3/cpr/register` ### **Headers** `Content-Type: application/json` `Authorization: Bearer ` ### **Request Body (JSON)** ```json { "cpr": { "cpr_type_code": "P", "cpr_otc_register_account_code": "64359.40-5", "cpr_otc_payment_agent_account_code": "64359.40-5", "cpr_otc_custodian_account_code": "64359.00-3", "cpr_internal_control_number": "NA", "cpr_electronic_emission_indicator": "SIM", "cpr_isin_code": "NA", "cpr_issue_date": "2025-11-28", "cpr_maturity_date": "2026-09-30", "cpr_issue_quantity": 1, "cpr_issue_value": 1710000.00, "cpr_issue_financial_value": 1710000.00, "cpr_unit_value": 1710000.00, "cpr_reference_date": "2025-12-09", "cpr_profitability_start_date": "2025-12-09", "cpr_automatic_expiration_indicator": "NÃO", "cpr_collateral_type_code": "Penhor", "cpr_collateral_type_name": "NA", "cpr_constitution_process_indicator": "SIM", "cpr_otc_bondsman_account_code": "NA", "cpr_collaterals_document_number": "NA", "cpr_product_name": "MILHO", "cpr_product_class_name": "MILHO (EM GRAOS)", "cpr_product_harvest": "2026/2026", "cpr_product_description": "Milho brasileiro em grãos, tipo exportação.", "cpr_product_quantity": 2700000, "cpr_measure_unit_name": "QUILO", "cpr_packaging_way_name": "SACA (60 KG)", "cpr_product_status_code": "A PRODUZIR", "cpr_production_type_code": "PROPRIA", "cpr_issuer_name": "MARCELO VINCENZI", "cpr_finality_code": "NA", "cpr_ipoc_code": "NA", "cpr_calculation_type_code": "NA", "cpr_initial_exchange_value": "NA", "cpr_fixing_type_code": "NA", "cpr_data_source_type_code": "NA", "cpr_adjustment_frequency_type_code": "NA", "cpr_adjustment_pro_rata_type_code": "NA", "cpr_adjustment_type_code": "NA", "cpr_creditor_name": "TOO EASY TRADING LTDA", "cpr_ballast_type_code": "NA", "cpr_lot_number": "NA", "cpr_ballast_quantity": "NA", "cpr_currency_code": "NA", "cpr_transaction_identification": "NA", "cpr_additional_text": "NA", "cpr_number": "NA", "cpr_contract_number": "NA", "cpr_event_type_code": "NA", "cpr_event_original_date": "NA", "cpr_unit_price_value": 1710000.00, "cpr_interest_unit_price_value": 0.00, "cpr_residual_value": "NA", "cpr_amortization_percentage": "NA", "cpr_event_quantity": "NA", "cpr_production_place_name": "FAZENDA CORAÇÃO DE MARIA", "cpr_property_registration_number": "14406", "cpr_notary_name": "NA", "cpr_total_production_area_in_hectares_number": "NA", "cpr_total_area_in_hectares_number": 670, "cpr_car_code": "NA", "cpr_latitude_code": "NA", "cpr_longitude_code": "NA", "cpr_zip_code": "78560000", "cpr_green_cpr_indicator": "NA", "cpr_green_cpr_certificate_name": "NA", "cpr_green_cpr_certificate_cnpj_number": "NA", "cpr_green_cpr_georeferencing_description": "NA", "cpr_green_cpr_declaration_indicator": "NA", "cpr_document_deadline_days_number": "NA", "cpr_place_name": "NA", "cpr_guarantee_limit_type_code": "NA", "cpr_mother_code": "NA", "cpr_issuers_person_type_acronym": "PF", "cpr_issuers_state_acronym": "MT", "cpr_issuers_city_name": "SINOP", "cpr_issuers_ibge_code": "NA", "cpr_issuer_legal_nature_code": "02", "cpr_otc_favored_account_code": "64359.00-3", "cpr_issuers_document_number": "867.308.271-49", "cpr_deposit_person_type_acronym": "PF", "cpr_self_number": "NA", "cpr_settlement_modality_type_code": "NA", "cpr_otc_settlement_bank_account_code": "NA", "cpr_deposit_quantity": 1, "cpr_deposit_unit_price_value": "NA", "cpr_payment_method_code": "NA", "cpr_index_code": "NA", "cpr_index_short_name": "NA", "cpr_vcp_indicator_type_code": "NA", "cpr_indexador_percentage_value": "NA", "cpr_interest_rate_spread_percentage": "NA", "cpr_interest_rate_criteria_type_code": "NA", "cpr_interest_payment_date": "NA", "cpr_interest_payment_value": "NA", "cpr_interest_payment_frequency_code": "NA", "cpr_interest_months_quantity": "NA", "cpr_interestPaymentFlow_time_unit_type_code": "NA", "cpr_interestPaymentFlow_deadline_type_code": "NA", "cpr_payment_start_date": "NA", "cpr_amortization_type_code": "NA", "cpr_amortization_months_quantity": "NA", "cpr_amortizationPaymentFlow_time_unit_type_code": "NA", "cpr_amortizationPaymentFlow_deadline_type_code": "NA", "cpr_amortization_start_date": "NA", "cpr_scr_type_code": "N", "cpr_scr_customer_detail": "NA", "cpr_scr_person_type_acronym": "NA", "cpr_deposit_document_number": "NA", "cpr_scr_document_number": "NA", "cpr_creditor_document_number": "47.175.222/0001-09", "cpr_contract_code": "00700", "cpr_operation_modality_type_code": "NA", "cpr_bacen_reference_code": "NA", "cpr_deliveryPlace_state_acronym": "MT", "cpr_deliveryPlace_city_name": "PORTO DOS GAÚCHOS", "cpr_deliveryPlace_ibge_code": "NA FAZENDA EM PRODUÇÃO", "cpr_children_codes": ["NA"] } } ``` ### **cURL Example** ```bash curl --location 'http://localhost:8000/b3/cpr/register' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ --data '{ "cpr_type_code": "P", "cpr_otc_register_account_code": "64359.40-5", "cpr_otc_payment_agent_account_code": "64359.40-5", "cpr_otc_custodian_account_code": "64359.00-3", "cpr_internal_control_number": "NA", "cpr_electronic_emission_indicator": "SIM", "cpr_isin_code": "NA", "cpr_issue_date": "2025-11-28", "cpr_maturity_date": "2026-09-30", "cpr_issue_quantity": 1, "cpr_issue_value": 1710000.00, "cpr_issue_financial_value": 1710000.00, "cpr_unit_value": 1710000.00, "cpr_reference_date": "2025-12-09", "cpr_profitability_start_date": "2025-12-09", "cpr_automatic_expiration_indicator": "NÃO", "cpr_collateral_type_code": "Penhor", "cpr_collateral_type_name": "NA", "cpr_constitution_process_indicator": "SIM", "cpr_otc_bondsman_account_code": "NA", "cpr_collaterals_document_number": "NA", "cpr_product_name": "MILHO", "cpr_product_class_name": "MILHO (EM GRAOS)", "cpr_product_harvest": "2026/2026", "cpr_product_description": "Milho brasileiro em grãos, tipo exportação.", "cpr_product_quantity": 2700000, "cpr_measure_unit_name": "QUILO", "cpr_packaging_way_name": "SACA (60 KG)", "cpr_product_status_code": "A PRODUZIR", "cpr_production_type_code": "PROPRIA", "cpr_issuer_name": "MARCELO VINCENZI", "cpr_finality_code": "NA", "cpr_ipoc_code": "NA", "cpr_calculation_type_code": "NA", "cpr_initial_exchange_value": "NA", "cpr_fixing_type_code": "NA", "cpr_data_source_type_code": "NA", "cpr_adjustment_frequency_type_code": "NA", "cpr_adjustment_pro_rata_type_code": "NA", "cpr_adjustment_type_code": "NA", "cpr_creditor_name": "TOO EASY TRADING LTDA", "cpr_ballast_type_code": "NA", "cpr_lot_number": "NA", "cpr_ballast_quantity": "NA", "cpr_currency_code": "NA", "cpr_transaction_identification": "NA", "cpr_additional_text": "NA", "cpr_number": "NA", "cpr_contract_number": "NA", "cpr_event_type_code": "NA", "cpr_event_original_date": "NA", "cpr_unit_price_value": 1710000.00, "cpr_interest_unit_price_value": 0.00, "cpr_residual_value": "NA", "cpr_amortization_percentage": "NA", "cpr_event_quantity": "NA", "cpr_production_place_name": "FAZENDA CORAÇÃO DE MARIA", "cpr_property_registration_number": "14406", "cpr_notary_name": "NA", "cpr_total_production_area_in_hectares_number": "NA", "cpr_total_area_in_hectares_number": 670, "cpr_car_code": "NA", "cpr_latitude_code": "NA", "cpr_longitude_code": "NA", "cpr_zip_code": "78560000", "cpr_green_cpr_indicator": "NA", "cpr_green_cpr_certificate_name": "NA", "cpr_green_cpr_certificate_cnpj_number": "NA", "cpr_green_cpr_georeferencing_description": "NA", "cpr_green_cpr_declaration_indicator": "NA", "cpr_document_deadline_days_number": "NA", "cpr_place_name": "NA", "cpr_guarantee_limit_type_code": "NA", "cpr_mother_code": "NA", "cpr_issuers_person_type_acronym": "PF", "cpr_issuers_state_acronym": "MT", "cpr_issuers_city_name": "SINOP", "cpr_issuers_ibge_code": "NA", "cpr_issuer_legal_nature_code": "02", "cpr_otc_favored_account_code": "64359.00-3", "cpr_issuers_document_number": "867.308.271-49", "cpr_deposit_person_type_acronym": "PF", "cpr_self_number": "NA", "cpr_settlement_modality_type_code": "NA", "cpr_otc_settlement_bank_account_code": "NA", "cpr_deposit_quantity": 1, "cpr_deposit_unit_price_value": "NA", "cpr_payment_method_code": "NA", "cpr_index_code": "NA", "cpr_index_short_name": "NA", "cpr_vcp_indicator_type_code": "NA", "cpr_indexador_percentage_value": "NA", "cpr_interest_rate_spread_percentage": "NA", "cpr_interest_rate_criteria_type_code": "NA", "cpr_interest_payment_date": "NA", "cpr_interest_payment_value": "NA", "cpr_interest_payment_frequency_code": "NA", "cpr_interest_months_quantity": "NA", "cpr_interestPaymentFlow_time_unit_type_code": "NA", "cpr_interestPaymentFlow_deadline_type_code": "NA", "cpr_payment_start_date": "NA", "cpr_amortization_type_code": "NA", "cpr_amortization_months_quantity": "NA", "cpr_amortizationPaymentFlow_time_unit_type_code": "NA", "cpr_amortizationPaymentFlow_deadline_type_code": "NA", "cpr_amortization_start_date": "NA", "cpr_scr_type_code": "N", "cpr_scr_customer_detail": "NA", "cpr_scr_person_type_acronym": "NA", "cpr_deposit_document_number": "NA", "cpr_scr_document_number": "NA", "cpr_creditor_document_number": "47.175.222/0001-09", "cpr_contract_code": "00700", "cpr_operation_modality_type_code": "NA", "cpr_bacen_reference_code": "NA", "cpr_deliveryPlace_state_acronym": "MT", "cpr_deliveryPlace_city_name": "PORTO DOS GAÚCHOS", "cpr_deliveryPlace_ibge_code": "NA FAZENDA EM PRODUÇÃO", "cpr_children_codes": ["NA"] }' ``` ### **Responses** #### **200 OK (Success)** Returns the JSON body from B3. #### **400 Bad Request** Returned if the JSON is invalid or CPR payload is missing. #### **401 Unauthorized** Returned if the JWT is missing/invalid. #### **502 Bad Gateway** Returned if the request to B3 fails.