
Three steps from signing up to your first authenticated request.
Create your Stark Bank account and enable the sandbox to start building risk-free.
Open an account →Every request is signed with ECDSA. Generate your key pair and register the public key in the Web Banking.
How to create your keys →Pick your favorite SDK or call the REST API directly. The first invoice takes about 5 lines of code.
Try the Get Started guide →Cover the full money movement lifecycle with first-class building blocks.
Issue dynamic Pix QR codes with due dates, fines and discounts. Settle in seconds.
→PixGenerate static and dynamic QR codes for one-time payments at any amount.
→RecurringCharge recurring Pix payments after a one-time customer authorization.
→BoletoIssue regulated Boletos with full lifecycle tracking and automatic reconciliation.
→CardsAccept online payments with credit and debit cards with built-in tokenization.
→MarketplaceSplit inbound funds across multiple parties at the moment they arrive.
→Move money to any Brazilian bank account through Pix or TED — programmatically.
→BoletoPay any Boleto from your Stark Bank account with full status tracking.
→PixPay Pix QR codes — static, dynamic and merchant — directly from the API.
→BillsSettle utility bills (water, energy, phone) without leaving your software.
→GovernmentPay taxes (DARF, GPS, GARE, FGTS and others) through a single endpoint.
→ApprovalSend payments to be approved on the Web Banking with custom approval rules.
→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 an invoice, and get a payable QR code instantly.
import starkbank
from datetime import datetime
invoices = starkbank.invoice.create([
starkbank.Invoice(
amount=400000,
descriptions=[{'key': 'Arya', 'value': 'Not today'}],
discounts=[{'percentage': 10, 'due': datetime(2021, 3, 12, 15, 23, 26, 689377)}],
due=datetime(2021, 5, 12, 15, 23, 26, 689377),
expiration=123456789,
fine=2.5,
interest=1.3,
name="Arya Stark",
tags=['War supply', 'Invoice #1234'],
tax_id="012.345.678-90",
rules=[
{
'key': 'allowedTaxIds',
'value': [
'012.345.678-90',
'45.059.493/0001-73'
]
}
],
splits=[
Split(amount=3000, receiverId="5742447426535424"), Split(amount=5000, receiverId="5743243941642240")
]
)
])
for invoice in invoices:
print(invoice)
const starkbank = require('starkbank');
(async() => {
let invoices = await starkbank.invoice.create([{
amount: 400000,
due: '2021-05-12T15:23:37.585+00:00',
taxId: '012.345.678-90',
name: 'Arya Stark',
expiration: 123456789,
fine: 2.5,
interest: 1.3,
discounts: [
{
'percentage': 10,
'due': '2021-03-12T15:23:26.249976+00:00'
}
],
tags: ['War supply', 'Invoice #1234'],
descriptions: [
{
'key': 'Arya',
'value': 'Not today'
}
],
rules: [
{
'key': 'allowedTaxIds',
'value': [
'012.345.678-90',
'45.059.493/0001-73'
]
}
]
}]);
for (let invoice of invoices) {
console.log(invoice);
}
})();
use StarkBank\Invoice;
$invoices = [
new Invoice([
"amount" => 400000,
"due" => "2021-05-12T18:00:00.000000+00:00",
"taxId" => "012.345.678-90",
"name" => "Arya Stark",
"expiration" => 123456789,
"fine" => 2.5,
"interest" => 1.3,
"discounts" => [
[
"percentage" => 10,
"due" => "2021-03-12T18:00:00.000000+00:00"
]
],
"tags" => [
'War supply',
'Invoice #1234'
],
"descriptions" => [
[
"key" => "Arya",
"value" => "Not today"
]
],
"rules" => [
{
"key" => "allowedTaxIds",
"value" => [
"012.345.678-90",
"45.059.493/0001-73"
]
}
]
])
];
$invoice = Invoice::create($invoices);
print_r($invoice);
import com.starkbank.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
List<HashMap<String, Object>> descriptions = new ArrayList<>();
HashMap<String, Object> data = new HashMap<>();
data.put("key", "Arya");
data.put("value", "Not today");
descriptions.add(data);
List<HashMap<String, Object>> rules = new ArrayList<>();
HashMap<String, Object> data = new HashMap<>();
data.put("key", "allowedTaxIds");
data.put("value", new String[]{"012.345.678-90", "45.059.493/0001-73"});
rules.add(data);
List<HashMap<String, Object>> discounts = new ArrayList<>();
HashMap<String, Object> data = new HashMap<>();
data.put("percentage", 10);
data.put("due", "2021-03-12T17:59:26.000000+00:00");
discounts.add(data);
List<Invoice> invoices = new ArrayList<>();
HashMap<String, Object> data = new HashMap<>();
data.put("amount", 400000);
data.put("due", "2021-05-12T17:59:26.000000+00:00");
data.put("taxId", "012.345.678-90");
data.put("name", "Arya Stark");
data.put("expiration", 123456789);
data.put("discounts", discounts);
data.put("descriptions", descriptions);
data.put("rules", rules);
data.put("fine", 2.5);
data.put("interest", 1.3);
data.put("tags", new String[]{"War supply", "Invoice #1234"});
invoices.add(new Invoice(data));
invoices = Invoice.create(invoices);
for (Invoice invoice : invoices) {
System.out.println(invoice);
}
require('starkbank')
invoices = StarkBank::Invoice.create(
[
StarkBank::Invoice.new(
amount: 400000,
descriptions:
[
{
key: 'Arya',
value: 'Not today'
}
],
discounts:
[
{
percentage: 10,
due: '2020-04-25'
}
],
rules:
[
{
key: 'allowedTaxIds',
value: [
'012.345.678-90',
'45.059.493/0001-73'
]
}
],
tags: ['War supply', 'Invoice #1234'],
due: Time.now + 24 * 3600,
name: 'Arya Stark',
tax_id: '012.345.678-90',
fine: 2.5,
interest: 1.3,
expiration: 123456789,
)
]
)
invoices.each do |invoice|
puts invoice
end
invoice = StarkBank.Invoice.create!(
[
%StarkBank.Invoice{
amount: 400000,
due: String.replace(DateTime.to_iso8601(DateTime.add(DateTime.utc_now(), 30*24*60*60, :second)), "Z", "+00:00"),
tax_id: "012.345.678-90",
name: "Arya Stark",
expiration: 123456789,
fine: 2.5,
interest: 1.3,
discounts: [
%{
percentage: 10,
due: String.replace(DateTime.to_iso8601(DateTime.add(DateTime.utc_now(), 10*24*60*60, :second)), "Z", "+00:00"),
}
],
rules: [
%{
key: "allowedTaxIds",
value: [
"012.345.678-90",
"45.059.493/0001-73"
]
}
],
tags: [
"War Supply",
"Invoice #1234"
],
descriptions: [
%{
key: "Arya",
value: "Not today"
}
]
}
]
) |> IO.inspect()
using System;
using System.Collections.Generic;
List<StarkBank.Invoice> invoices = StarkBank.Invoice.Create(
new List<StarkBank.Invoice> {
new StarkBank.Invoice(
amount: 400000,
descriptions: new List<Dictionary<string, object>>() {
new Dictionary<string, object> {
{"key", "Arya"},
{"value", "Not today"}
}
},
discounts: new List<Dictionary<string, object>>() {
new Dictionary<string, object> {
{"percentage", 10},
{"due", new DateTime(2021, 03, 12, 20, 30, 0)}
}
},
rules: new List<Dictionary<string, object>>() {
new Dictionary<string, object> {
{"key", "allowedTaxIds"},
{"value", new List<string> { "012.345.678-90", "45.059.493/0001-73" }}
}
},
due: new DateTime(2021, 05, 12, 20, 30, 0),
expiration: 123456789,
fine: 2.5,
interest: 1.3,
name: "Arya Stark",
tags: new List<string> { "New sword", "Invoice #1234" },
taxID: "012.345.678-90"
)
}
);
foreach (StarkBank.Invoice invoice in invoices)
{
Console.WriteLine(invoice);
}
package main
import (
"fmt"
"github.com/starkbank/sdk-go/starkbank/invoice"
"time"
)
func main() {
due := time.Date(2021, 05, 12, 0, 0, 0, 0, time.UTC)
descriptions := make([]map[string]interface{}, 1)
var data = map[string]interface{}{}
data["key"] = "Arya"
data["value"] = "Not today"
descriptions[0] = data
discounts := make([]map[string]interface{}, 1)
var dataDiscount = map[string]interface{}{}
dataDiscount["percentage"] = 5
dataDiscount["due"] = time.Date(2021, 03, 12, 0, 0, 0, 0, time.UTC)
discounts[0] = dataDiscount
invoices, err := invoice.Create(
[]invoice.Invoice{
{
Amount: 400000,
Name: "Arya Stark",
TaxId: "012.345.678-90",
Descriptions: descriptions,
Discounts: discounts,
Due: &due,
Fine: 2.5,
Interest: 1.3,
Expiration: 123456789,
Tags: []string{"War supply", "Invoice #1234"},
},
}, nil)
if err.Errors != nil {
for _, e := range err.Errors {
fmt.Printf("code: %s, message: %s", e.Code, e.Message)
}
}
for _, invoice := range invoices {
fmt.Printf("%+v", invoice)
}
}
(def invoices (starkbank.invoice/create
[{
:amount 400000
:due "2021-05-12T19:32:35.418698+00:00"
:tax-id "012.345.678-90"
:name "Arya Stark",
:expiration 123456789,
:fine 2.5,
:interest 1.3,
:discounts [
{
:percentage 5
:due "2021-03-12T19:32:35.418698+00:00"
}
]
:descriptions [
{
:key "Arya"
:value "Not Today"
}
],
:rules [
{
:key "allowedTaxIds",
:value [
"012.345.678-90",
"45.059.493/0001-73"
]
}
],
:tags [
"War supply",
"Invoice #1234"
]
}]))
(doseq [invoice invoices]
(println invoice)
)
curl --location --request POST '{{baseUrl}}/v2/invoice'
--header 'Access-Id: {{accessId}}'
--header 'Access-Time: {{accessTime}}'
--header 'Access-Signature: {{accessSignature}}'
--header 'Content-Type: application/json'
--data-raw '{
"invoices": [
{
"amount": 400000,
"due": "2021-05-12T17:59:26.000000+00:00",
"expiration": 123456789,
"name": "Arya Stark",
"taxId": "012.345.678-90",
"fine": 2.5,
"interest": 1.3,
"tags": [
"War supply",
"Invoice #1234"
]
"descriptions": [
{
"key": "Arya",
"value": "Not today"
}
],
"rules": [
{
"key": "allowedTaxIds",
"value": [
"012.345.678-90",
"45.059.493/0001-73"
]
}
],
"discounts": [
{
"percentage": 10,
"due": "2021-03-12T17:59:26.000000+00:00"
}
],
"splits": [
{
"receiverId": "5742447426535424",
"amount": 3000
},
{
"receiverId": "5743243941642240",
"amount": 5000
}
]
}
]
}'
Type-safe clients with retries, signing and pagination built in. Pick yours and get going.
pip install starkbankView on GitHub →npm install starkbankView on GitHub →implementation 'com.starkbank:sdk'View on GitHub →gem install starkbankView on GitHub →composer require starkbank/sdkView on GitHub →go get github.com/starkbank/sdk-goView on GitHub →{:starkbank, "~> latest"}View on GitHub →dotnet add package starkbankView on GitHub →[starkbank/sdk "latest"]View on GitHub →A quick read that pays back across every integration you will ever build with us.
Use external IDs and prevent duplicate operations on retries.
Attach your own context to every resource so reconciliation is effortless.
Every cash movement is anchored to a Stark Bank Transaction you can query.
Subscribe to events and react to status changes the moment they happen.
What we have learned moving billions — written down so you don't have to relearn it.
Programmatic settlement across many parties — perfect for marketplaces.
What developers ask when evaluating Stark Bank — the same questions that show up across Google, Claude, GPT, Grok and Gemini.
Three structural reasons come up most: