Do seu ERP à impressora do cliente, sem construir uma infraestrutura de impressão.
O Print STA Native conecta seu ERP, PDV ou SaaS aos computadores e impressoras locais dos seus clientes. Seu sistema controla a experiência; o Native cuida do vínculo, descoberta de impressoras e entrega segura dos jobs.
QUICKSTART E2E
Primeira integração, passo a passo.
Se você está conhecendo o Native agora, siga esta ordem. Ela representa o Golden Path de uma integração comercial.
pst_live_... S2S com os scopes necessários. Nunca coloque essa credencial no navegador, Agent ou aplicativo do cliente.- Confirme a API. Chame
GET /managed/healtheGET /managed/capabilities. - Crie ou reconcilie o cliente. Use
POST /accountscom umexternal_idestável do seu ERP. - Gere o vínculo. Crie um enrollment temporário e entregue somente ao Agent daquele cliente.
- Aguarde a sincronização. Depois do Agent online, liste
deviceseprinters. - Envie o job. Use
Idempotency-Keyúnica para evitar duplicidade. - Acompanhe o resultado. Consulte o job até
printedoufailed.
export PRINT_STA_TOKEN="pst_live_SUA_CREDENCIAL"
BASE="https://api.print-sta.com.br/v1"
AUTH="Authorization: Bearer $PRINT_STA_TOKEN"
# 1) validar contrato
curl -sS "$BASE/managed/health" -H "$AUTH"
curl -sS "$BASE/managed/capabilities" -H "$AUTH"
# 2) criar/reconciliar cliente
ACCOUNT=$(curl -sS -X POST "$BASE/accounts" \
-H "$AUTH" -H "Content-Type: application/json" \
-d '{"external_id":"tenant-123","display_name":"Loja Exemplo"}')
# 3) use data.account_id para gerar enrollment
# 4) após Agent online, liste printers
# 5) envie POST /accounts/{account_id}/jobs com Idempotency-Keyconst BASE = "https://api.print-sta.com.br/v1";
const TOKEN = process.env.PRINT_STA_TOKEN;
async function native(path, init = {}) {
const response = await fetch(BASE + path, {
...init,
headers: { Authorization: `Bearer ${TOKEN}`, "Content-Type": "application/json", ...init.headers }
});
const body = await response.json();
if (!response.ok) throw new Error(`${response.status} ${body.code}: ${body.message}`);
return body;
}
const account = await native("/accounts", {
method: "POST",
body: JSON.stringify({ external_id: "tenant-123", display_name: "Loja Exemplo" })
});
console.log(account.data.account_id);import os, requests
BASE = "https://api.print-sta.com.br/v1"
H = {"Authorization": f"Bearer {os.environ['PRINT_STA_TOKEN']}"}
r = requests.post(BASE + "/accounts", headers=H,
json={"external_id":"tenant-123", "display_name":"Loja Exemplo"})
r.raise_for_status()
print(r.json()["data"]["account_id"])ARQUITETURA MENTAL
Quem faz o quê.
Seu ERP / PDV
É a experiência que o usuário final conhece.
- identifica o tenant
- cria/reconcilia a Account
- solicita enrollment
- exibe devices e printers
- escolhe a impressora
- envia e acompanha jobs
Print STA Native
É a infraestrutura de impressão local por trás da integração.
- isola Accounts por Partner
- valida credenciais e scopes
- vincula Agent por enrollment
- sincroniza devices e printers
- entrega jobs com idempotência
- mantém rastreabilidade e lifecycle
SOURCE OF TRUTH
Status do contrato.
Você pode integrar hoje
Health, capabilities, Accounts, desativação de Account, enrollment sem login, devices, printers, jobs, paginação e idempotência.
Não tratar como contrato final
A infraestrutura Partner-scoped de webhooks está em evolução, porém features.webhooks=false ainda fecha essa capability no contrato operacional.
/pairing/redeem, GET /accounts/{id}, POST /accounts/{id}/reactivate e printer test não fazem parte da superfície pública estável da Partner API v1.AUTHORITY MODEL
Autenticação e ambientes.
A credencial define no servidor o Partner, a Application, o ambiente e os scopes. O payload nunca deve tentar substituir essa autoridade.
Authorization: Bearer pst_live_...Operacional
Use para provisionamento, enrollment, printers e jobs reais.
Diagnóstico no modelo atual
Não planeje impressão operacional em TEST enquanto a capability production-only estiver ativa.
LEAST PRIVILEGE
Scopes efetivos.
| Scope | Uso |
|---|---|
diagnostics:read | health e capabilities |
accounts:write | provisionar/desativar Accounts |
devices:read | listar devices |
devices:write | enrollment e desativação de device |
printers:read | listar printers |
printers:write | habilitar e renomear printer |
jobs:read | listar e consultar jobs |
jobs:write | criar jobs |
webhooks:write | reservado à superfície em preview |
ACCOUNT
Um cliente do ERP = uma Account opaca.
POST /accounts reconcilia o tenant do seu sistema com uma Account Native. Use um external_id estável do seu ERP e guarde o account_id retornado.
Você envia
external_id e display_name.
O Native resolve
Cria ou reconcilia a identidade isolada do tenant.
Você persiste
Guarde o account_id opaco para as próximas chamadas.
POST /v1/accounts
{
"external_id": "tenant-123",
"display_name": "Loja Exemplo"
}
200 ACCOUNT_PROVISIONED
{
"data": {
"account_id": "<uuid-opaco>",
"external_id": "tenant-123",
"status": "active"
}
}ENROLLMENT
Vincule o computador sem criar outro login para o cliente.
Seu ERP solicita um token temporário e o entrega ao Agent. O token é de uso único, expira rapidamente e não substitui a credencial Partner.
POST /v1/accounts/{account_id}/enrollments
{"ttl_seconds":600}
201 ENROLLMENT_CREATED
{
"data": {
"enrollment_token": "pstenr_..."
}
}DEVICE
Computadores vinculados à Account.
Disponível
Agent com presença recente e autorizado para operar.
Sem presença recente
O vínculo existe, mas o Agent não está disponível agora.
Revogado
O device perdeu autoridade operacional e precisa de novo vínculo para voltar.
GET /accounts/{account_id}/devices lista os computadores. POST /accounts/{account_id}/devices/{device_id}/deactivate revoga um vínculo específico.
PRINTER
Descubra e controle impressoras locais.
Printers pertencem a um device da Account. Use o estado retornado pela API em vez de recriar lógica de disponibilidade no ERP.
GET /printers
Retorna nome detectado, alias, device, estado, driver, porta e capabilities.
PATCH /printers/{printer_id}
Permite alterar enabled e/ou display_name sem mudar a identidade física da impressora.
display_name ao usuário. Guarde printer_id como identidade técnica e não dependa do nome detectado como chave.JOB
Envie a impressão e acompanhe até o estado terminal.
queuedAceito e aguardando processamento.processingEm andamento no fluxo operacional.printedConcluído com sucesso.failedFalhou e requer tratamento.pedido:12345678.POST /v1/accounts/{account_id}/jobs
Idempotency-Key: pedido:12345678
{
"printer_id": "<uuid>",
"external_id": "pedido-12345678",
"title": "Pedido 12345678",
"copies": 1,
"content": {
"type": "text",
"encoding": "utf8",
"data": "PEDIDO 12345678\n"
}
}HTTP CONTRACT
Convenções que deixam a integração previsível.
Envelope consistente
code, data, request_id e correlation_id.
Decisão programável
code, message, retryable, request_id e correlation_id.
POST/PATCH usam application/json. X-Correlation-Id é opcional; quando enviado, deve ter 8–128 caracteres seguros. Registre sempre request/correlation IDs no seu observability stack.
PAGINATION
Paginação por cursor, sem fabricar offsets.
Listagens retornam items, has_more e next_cursor. Reenvie o cursor exatamente como recebido.
GET /accounts/{account_id}/jobs?limit=50&cursor=...FAILURE MODEL
Erros, retry e decisões automáticas.
| HTTP | Interpretação | Ação recomendada |
|---|---|---|
400 | payload/parâmetro inválido | corrigir requisição; não repetir igual |
401 | credencial ou enrollment inválido/expirado | renovar fluxo de autenticação/vínculo |
403 | scope/autoridade insuficiente | corrigir permissão |
404 | recurso não encontrado | reconciliar IDs |
409 | conflito de estado/idempotência/offline | inspecionar code antes de decidir |
429 | rate limit | retry com backoff + jitter |
5xx | falha transitória de serviço | retry se retryable=true |
retryable + HTTP status + code. Não faça retry cego de erro 4xx.RATE LIMIT
Limites relevantes para integração.
OBSERVABILITY
Faça a integração ser fácil de diagnosticar.
Envie correlação
Use X-Correlation-Id baseado no evento do ERP.
Registre retorno
Salve request_id, correlation_id, code e HTTP status.
Relacione o job
Persista external_id e job_id para investigação ponta a ponta.
DEV PREVIEW
Webhooks.
A infraestrutura Partner-scoped de webhook provisioning/delivery está evoluindo no dev, mas a Partner API estável ainda publica features.webhooks=false.
GET /accounts/{account_id}/jobs/{job_id}. Só mude para webhook quando capabilities anunciar suporte estável.STABLE V1
Mapa de endpoints implementados.
AI READY
Contrato operacional para agentes de IA.
Uma IA que integrar o Native deve seguir esta ordem
- Consultar este documento para contexto humano.
- Usar openapi-v1.yaml como contrato machine-readable.
- Ler llms.txt para regras MUST / MUST NOT.
- Consultar
/managed/capabilitiesantes de depender de capability opcional. - Nunca inventar rota, campo, estado ou política de retry não documentada.
VERSIONING
Compatibilidade previsível.
Partner API v1 é o contrato externo. Mudanças compatíveis podem adicionar campos; o consumidor deve ignorar campos desconhecidos. Breaking changes exigem nova versão de contrato. O OpenAPI e o llms.txt devem acompanhar a superfície implementada.
Comece pelo Golden Path.
Se o fluxo já está claro, use o OpenAPI como referência exata e o llms.txt para automação por IA.
NATIVE