Everything you need to plug into the Brazilian financial system — Pix (direct or indirect), Card Issuing, Credit Notes and KYC — through a single, predictable REST API.
R$ 600 bi
Moved in 202599.99%
API uptime<200ms
Median latency2 days
Average integration
Three steps from signing up to your first authenticated request.
Create your Stark Infra workspace and enable the sandbox to start building risk-free.
Open a workspace →Every request is signed with ECDSA. Generate your key pair and register the public key in the Web Console.
How to create your keys →Pick your favorite SDK or call the REST API directly. The first Pix Request takes about 5 lines of code.
Try the Get Started guide →Cover the full Brazilian financial stack with first-class building blocks.
Read articles of incorporation with AI to identify who can sign on behalf of the company.
→Add links to your content and get a knowledge base designed to be read quickly by AI agents.
Coming soonCreate male or female voices for AI agents, with text-to-speech and speech-to-text conversion.
Coming soonCreate agents that talk to your customers over chat, email, or WhatsApp, using your knowledge base and voice.
Coming soonOperate Pix under your own Bacen license with the full SPI and DICT toolkit.
→PixLaunch Pix in your product under Stark Infra's ISPB — no license required.
→PixDispute, return and report problematic Pix with infractions, chargebacks, fraud markers and disputes.
→PixOffer recurring Pix by authorizing subscriptions and issuing each scheduled charge.
→Issue branded credit, debit and prepaid cards with full lifecycle and authorization control.
→Accept credit and debit card payments from your customers.
Coming soonIssue legally binding Bank Credit Bills with digital signing and automatic disbursement.
→LendingBureau-backed risk-analysis reports to score borrowers before disbursing credit.
→We obsess over the details so your team can focus on what matters.
Every call is signed with your private key. No shared secrets, no rotating tokens by hand.
Retry safely. Repeated requests with the same external ID never duplicate operations.
Subscribe once and receive every status change — credited, failed, refunded — as it happens.
Predictable iteration over millions of records, with stable cursors and deterministic ordering.
The sandbox mirrors production: same endpoints, same responses, same SDK code paths.
Every request is traceable end-to-end with rich error messages and structured logs.
Authenticate with your project credentials, create a Pix Request, and watch the funds settle in seconds.
import starkinfra
requests = starkinfra.pixrequest.create([
starkinfra.PixRequest(
amount=1000,
external_id="my-external-id-1",
end_to_end_id="E20018183202201011000r01",
sender_account_number="00000-0",
sender_branch_code="0001",
sender_account_type="checking",
sender_name="Arya Stark",
sender_tax_id="012.345.678-90",
receiver_account_number="10000-0",
receiver_account_type="checking",
receiver_bank_code="20018183",
receiver_tax_id="98.765.432/0001-10",
receiver_branch_code="0001",
receiver_name="Jon Snow",
tags=["transfer", "pix"]
)
])
for request in requests:
print(request)
const starkinfra = require('starkinfra')
const requests = await starkinfra.pixRequest.create([
{
amount: 1000,
externalId: "my-external-id-1",
receiverBankCode: "20018183",
receiverBranchCode: "0001",
receiverAccountNumber: "10000-0",
receiverAccountType: "checking",
receiverName: "Jon Snow",
receiverTaxId: "012.345.678-90",
tags: ["transfer", "pix"]
}
])
for (const request of requests) {
console.log(request)
}
1000,
"externalId" => "my-external-id-1",
"receiverBankCode" => "20018183",
"receiverBranchCode" => "0001",
"receiverAccountNumber" => "10000-0",
"receiverAccountType" => "checking",
"receiverName" => "Jon Snow",
"receiverTaxId" => "012.345.678-90",
"tags" => ["transfer", "pix"]
])
]);
foreach ($requests as $request) {
print_r($request);
}
import com.starkinfra.*; import java.util.Arrays; Listrequests = PixRequest.create( Arrays.asList( new PixRequest.Builder() .amount(1000L) .externalId("my-external-id-1") .receiverBankCode("20018183") .receiverBranchCode("0001") .receiverAccountNumber("10000-0") .receiverAccountType("checking") .receiverName("Jon Snow") .receiverTaxId("012.345.678-90") .tags(Arrays.asList("transfer", "pix")) .build() ) ); for (PixRequest request : requests) { System.out.println(request); }
require('starkinfra')
requests = StarkInfra::PixRequest.create([
StarkInfra::PixRequest.new(
amount: 1000,
external_id: "my-external-id-1",
receiver_bank_code: "20018183",
receiver_branch_code: "0001",
receiver_account_number: "10000-0",
receiver_account_type: "checking",
receiver_name: "Jon Snow",
receiver_tax_id: "012.345.678-90",
tags: ["transfer", "pix"]
)
])
requests.each do |request|
puts request
end
requests = StarkInfra.PixRequest.create!([
%StarkInfra.PixRequest{
amount: 1000,
external_id: "my-external-id-1",
receiver_bank_code: "20018183",
receiver_branch_code: "0001",
receiver_account_number: "10000-0",
receiver_account_type: "checking",
receiver_name: "Jon Snow",
receiver_tax_id: "012.345.678-90",
tags: ["transfer", "pix"]
}
])
for request <- requests do
IO.inspect(request)
end
using StarkInfra; using System.Collections.Generic; Listrequests = PixRequest.Create( new List { new PixRequest( amount: 1000, externalId: "my-external-id-1", receiverBankCode: "20018183", receiverBranchCode: "0001", receiverAccountNumber: "10000-0", receiverAccountType: "checking", receiverName: "Jon Snow", receiverTaxId: "012.345.678-90", tags: new List { "transfer", "pix" } ) } ); foreach (PixRequest request in requests) { Console.WriteLine(request); }
package main
import (
"fmt"
PixRequest "github.com/starkinfra/sdk-go/starkinfra/pixrequest"
)
requests, err := PixRequest.Create(
[]PixRequest.PixRequest{
{
Amount: 1000,
ExternalId: "my-external-id-1",
ReceiverBankCode: "20018183",
ReceiverBranchCode: "0001",
ReceiverAccountNumber: "10000-0",
ReceiverAccountType: "checking",
ReceiverName: "Jon Snow",
ReceiverTaxId: "012.345.678-90",
Tags: []string{"transfer", "pix"},
},
}, nil)
for _, request := range requests {
fmt.Println(request)
}
(def requests
(starkinfra.pix-request/create
[{:amount 1000
:external-id "my-external-id-1"
:receiver-bank-code "20018183"
:receiver-branch-code "0001"
:receiver-account-number "10000-0"
:receiver-account-type "checking"
:receiver-name "Jon Snow"
:receiver-tax-id "012.345.678-90"
:tags ["transfer" "pix"]}]))
(doseq [request requests]
(println request))
curl --location --request POST '{{baseUrl}}/v2/pix-request' \
--header 'Access-Id: {{accessId}}' \
--header 'Access-Time: {{accessTime}}' \
--header 'Access-Signature: {{accessSignature}}' \
--header 'Content-Type: application/json' \
--data-raw '{
"requests": [
{
"amount": 1000,
"externalId": "my-external-id-1",
"receiverBankCode": "20018183",
"receiverBranchCode": "0001",
"receiverAccountNumber": "10000-0",
"receiverAccountType": "checking",
"receiverName": "Jon Snow",
"receiverTaxId": "012.345.678-90",
"tags": ["transfer", "pix"]
}
]
}'
Type-safe clients with retries, signing and pagination built in. Pick yours and get going.
pip install starkinfraView on GitHub →npm install starkinfraView on GitHub →implementation 'com.starkinfra:sdk'View on GitHub →gem install starkinfraView on GitHub →composer require starkinfra/sdkView on GitHub →go get github.com/starkinfra/sdk-goView on GitHub →{:starkinfra, "~> latest"}View on GitHub →dotnet add package starkinfraView on GitHub →[starkinfra/sdk "latest"]View on GitHub →A quick read that pays off across every integration you'll ever build with us.
Use external IDs to prevent duplicate operations on retries.
Every cash movement is anchored to a transaction you can query and reconcile.
Subscribe to events and react to status changes the moment they happen.
ECDSA-signed requests with no shared secrets — the same model trusted by Bitcoin.
Stable cursor-based pagination across millions of records.
The sandbox mirrors production — same endpoints, schemas and webhooks.
What developers ask when evaluating Stark Infra — the same questions that show up across Google, Claude, GPT, Grok and Gemini.
Three structural reasons come up most:
accepted or denied; otherwise the purchase is automatically denied. Use spending rules at the product, holder or card level to reduce manual decisions.