Documentação da API
Referência completa da API REST para o motor auto-alojado do promptShield. Todos os endpoints estão disponíveis na URL da sua implementação.
URL base
http://localhost:8000Substitua pelo anfitrião e porta da sua implementação.
Documentação interativa da API
Com o servidor em execução, visite /docs para uma interface Swagger interativa gerada automaticamente, onde pode testar cada endpoint diretamente.
PROMPTSHIELD_DEBUG_API_DOCS=1 promptshield serveIn API-key mode, /docs, /openapi.json, and /redoc require Authorization: Bearer <api-key>.
Autenticação
Quando PROMPTSHIELD_API_KEY está definida (via promptshield serve --api-key ou a variável de ambiente do Docker), cada pedido tem de a transportar como Authorization: Bearer <api-key>; chaves em falta ou erradas recebem 401, e uma chave com âmbito limitado a algumas operações recebe 403 nas restantes. O endpoint /health está sempre isento. Se não estiver definida nenhuma chave de API, o servidor corre sem autenticação e aceita todos os pedidos — adequado apenas numa rede local de confiança.
Início rápido
Ponha a API local a funcionar em menos de 5 minutos.
Instalar o pacote
pip install promptshield-appInstalar um modelo de idioma
export PROMPTSHIELD_ASSETS_DIR="$HOME/.local/share/promptshield/assets"
promptshield models install spacy-en-mdDefinir a sua chave de API
export PROMPTSHIELD_API_KEY="ps_live_your_key_here"A sua chave de API está disponível no painel de chaves de API.
Iniciar o servidor
promptshield serve --port 8000Processar o seu primeiro documento
AUTH="Authorization: Bearer ps_live_your_key_here"
curl -X POST http://localhost:8000/api/documents/upload \
-H "$AUTH" \
-F "file=@contract.pdf"
# → {"doc_id": "abc123", "filename": "contract.pdf", "page_count": 5, "status": "REVIEWING"}
curl -X POST http://localhost:8000/api/documents/abc123/detect \
-H "$AUTH" \
-H "Content-Type: application/json" \
-d '{"confidence_threshold": 0.7}'
# → {"doc_id": "abc123", "total_regions": 42, "regions": [...]}
curl -X POST http://localhost:8000/api/documents/abc123/anonymize \
-H "$AUTH"
# → {"doc_id": "abc123", "tokens_created": 42, "regions_removed": 0, "output_path": "..."}
curl -o contract-safe.pdf \
-H "$AUTH" \
http://localhost:8000/api/documents/abc123/download/pdfOu execute com o Docker (sem instalação)
docker run -e PROMPTSHIELD_API_KEY="ps_live_your_key_here" \
-p 8000:8000 -v promptshield-data:/data \
promptshield/promptshield-api:latestGuia passo a passo
Um percurso completo para configurar a API local e integrá-la no seu fluxo de trabalho.
1. Pré-requisitos
Antes de começar, certifique-se de que tem o seguinte instalado:
Opcional. para suporte completo de formatos:
2. Instalar o SDK
Instale o pacote de Python do promptShield. A instalação base trata dos ficheiros PDF. Adicione o extra office para Word/Excel/PowerPoint.
pip install promptshield-apppip install "promptshield-app[office]"Instale modelos de idioma (pacotes de entidades) através da CLI:
# Set the install directory (add to your shell profile)
export PROMPTSHIELD_ASSETS_DIR="$HOME/.local/share/promptshield/assets"
# Windows: $env:PROMPTSHIELD_ASSETS_DIR = "$env:APPDATA\promptshield\assets"
# English pack — required (medium is recommended)
promptshield models install spacy-en-md
# For maximum accuracy (larger download)
promptshield models install spacy-en-lgInstale pacotes de idioma adicionais da mesma forma:
promptshield models install spacy-fr-md # French
promptshield models install spacy-de-md # German
promptshield models install spacy-es-md # Spanish
promptshield models install spacy-it-md # Italian
promptshield models install spacy-nl-md # Dutch
promptshield models install spacy-pt-md # Portuguese3. Autenticação
A API local usa a sua chave de API do promptShield para a validação de licença. Defina-a como variável de ambiente ou passe-a ao iniciar o servidor.
export PROMPTSHIELD_API_KEY="ps_live_your_key_here"$env:PROMPTSHIELD_API_KEY = "ps_live_your_key_here"A chave de API é validada online no arranque e depois colocada em cache localmente durante 35 dias, para que o servidor possa funcionar totalmente offline após o primeiro arranque.
4. Iniciar o servidor da API
Inicie o servidor local com um único comando:
promptshield serve
# Starting promptShield API server on 127.0.0.1:8000
# Health endpoint: http://127.0.0.1:8000/health
# Docs: enable with PROMPTSHIELD_DEBUG_API_DOCS=1 in non-API-key modeOpções disponíveis:
| --host | Endereço de ligação (predefinição: 127.0.0.1) |
| --port | Porta de ligação (predefinição: 8000) |
| --api-key | Chave de API (alternativa à variável de ambiente) |
Depois de iniciado, a API fica disponível na URL apresentada. A documentação Swagger interativa está em /docs.
5. Implementação com Docker (alternativa)
Para implementações em produção, o Docker proporciona uma experiência sem instalação, com todas as dependências incluídas.
docker run -d --name promptshield \
-e PROMPTSHIELD_API_KEY="ps_live_your_key_here" \
-p 8000:8000 \
-v promptshield-data:/data \
promptshield/promptshield-api:latest# docker-compose.yml
services:
promptshield:
image: promptshield/promptshield-api:latest
ports:
- "8000:8000"
volumes:
- promptshield-data:/data
environment:
- PROMPTSHIELD_API_KEY=${PROMPTSHIELD_API_KEY}
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s
volumes:
promptshield-data:Crie um ficheiro .env com a sua chave de API:
PROMPTSHIELD_API_KEY=ps_live_your_key_hereA imagem Docker inclui:
6. Fluxo de trabalho da API
O fluxo de trabalho padrão de processamento de documentos tem 5 passos:
Exemplo de fluxo de trabalho completo (cURL)
# 1. Upload
AUTH="Authorization: Bearer ps_live_your_key_here"
DOC_ID=$(curl -s -X POST http://localhost:8000/api/documents/upload \
-H "$AUTH" \
-F "file=@contract.pdf" | python -c "import sys,json; print(json.load(sys.stdin)['doc_id'])")
echo "Document ID: $DOC_ID"
# 2. Detect PII (with optional inline overrides)
curl -X POST http://localhost:8000/api/documents/$DOC_ID/detect \
-H "$AUTH" \
-H "Content-Type: application/json" \
-d '{"confidence_threshold": 0.7, "regex_enabled": true, "ner_enabled": true}'
# → {"doc_id": "...", "total_regions": 42, "regions": [...]}
# 3. Review detected regions
curl -H "$AUTH" http://localhost:8000/api/documents/$DOC_ID/regions | python -m json.tool
# → [{"id": "...", "pii_type": "PERSON", "text": "John Smith", "confidence": 0.98,
# "action": "TOKENIZE", ...}, ...]
# 3b. Bulk-update region actions before anonymizing (region_ids from step 3)
curl -X PUT http://localhost:8000/api/documents/$DOC_ID/regions/batch-action \
-H "$AUTH" \
-H "Content-Type: application/json" \
-d '{"region_ids": ["<id1>", "<id2>"], "action": "REMOVE"}'
# 4. Anonymize
curl -X POST http://localhost:8000/api/documents/$DOC_ID/anonymize \
-H "$AUTH"
# → {"doc_id": "...", "tokens_created": 42, "regions_removed": 0}
# 5. Download the anonymized document
curl -o contract-safe.pdf \
-H "$AUTH" \
http://localhost:8000/api/documents/$DOC_ID/download/pdf
echo "Done! Anonymized file saved to contract-safe.pdf"7. Comandos da CLI
Processe documentos diretamente a partir da linha de comandos, sem iniciar um servidor:
promptshield detect invoice.pdf
# Detected 23 PII entities across 5 pages
promptshield detect invoice.pdf -o report.json
# Report saved to report.json
# Tune the pipeline per run — every desktop-app setting is also a CLI flag.
promptshield detect contract.pdf \
--language en --countries US \
--ner-backend Davlan/bert-base-multilingual-cased-ner-hrl \
--no-llm --fuzziness 0.5 \
--ner-types PERSON,ORG \
-e SA-2026-0847 -e "84-329-1057" \
--export-review -o contract.psreview
# Or load all of the above from demo/setup.json by locale:
promptshield detect contract.pdf --preset en --export-review -o contract.psreviewpromptshield anonymize contract.pdf -o contract-safe.pdf
# Anonymized: 42 tokens created, saved to contract-safe.pdf
# Permanently redact PII (black boxes, irreversible)
promptshield anonymize contract.pdf --redact -o contract-redacted.pdfpromptshield detokenize contract-safe.pdf -o contract-restored.pdf
# Restored 42 tokens, saved to contract-restored.pdfTodos os comandos da CLI validam a sua chave de API e processam os documentos localmente. Nenhum dado sai do seu dispositivo.
Extras de modelos
Use o comando models integrado para procurar, instalar e remover pacotes de idioma de entidades. Defina PROMPTSHIELD_ASSETS_DIR para que a CLI e o servidor em execução os encontrem.
export PROMPTSHIELD_ASSETS_DIR="$HOME/.local/share/promptshield/assets"
# Windows: $env:PROMPTSHIELD_ASSETS_DIR = "$env:APPDATA\promptshield\assets"promptshield models list
# Language packs (NER)
# [ ] spacy-en-sm English (small) (12 MB)
# [installed] spacy-en-md English (medium) (33 MB)
# [ ] spacy-fr-md French (medium) (16 MB) ...promptshield models install spacy-fr-md
# Installing spacy-fr-md (French (medium))...
# Downloading... 16.0/16.0 MB (100%)
# Verifying integrity...
# Extracting...
# Installed to ~/.local/share/promptshield/assets/spacy/fr_core_news_mdpromptshield models installed
# Installed models:
# spacy-en-md English (medium)
# spacy-fr-md French (medium)promptshield models remove spacy-fr-mdOs pacotes instalados são automaticamente reconhecidos pelo detect, anonymize e pelo servidor da API em execução. O comando install comunica diretamente com o servidor de licenças — não é necessário qualquer sidecar em execução.
8. Expressões personalizadas
Os padrões e as entidades integrados cobrem a maioria dos dados pessoais, mas cada organização tem os seus próprios identificadores — números de contrato, códigos de projeto internos, números fiscais, indicadores de confidencialidade. Adicione-os como expressões e passam a ser tratados como dados pessoais de pleno direito, assinalados com o tipo CUSTOM, com caixa delimitadora completa + propagação entre páginas. Disponível na CLI (-e / --expression), na API HTTP auto-alojada (blacklist_terms) e através das predefinições de demo/setup.json.
# Literal text — case-insensitive substring match
promptshield detect contract.pdf -e SA-2026-0847 -e "84-329-1057"
# Repeatable — pass as many -e flags as you need
promptshield detect contract.pdf \
-e ACME-CONFIDENTIAL \
-e "Internal Use Only" \
-e CUST-12345
# Regex — prefix with "re:" for full regex semantics
promptshield detect contract.pdf \
-e "re:CASE-\d{4}-[A-Z]{3}" \
-e "re:Project [A-Z][a-z]+"# Same feature on the self-hosted HTTP API.
curl -X POST http://localhost:8000/api/documents/$DOC_ID/detect \
-H "$AUTH" \
-H "Content-Type: application/json" \
-d '{
"expressions": ["SA-2026-0847", "84-329-1057"],
"expressions_action": "tokenize",
"expressions_fuzziness": 1.0
}'
# expressions_action: "none" | "tokenize" | "remove"
# expressions_fuzziness: 1.0 = exact match, 0.5 = fuzzy edit-distance match
#
# Back-compat: the legacy keys "blacklist_terms" / "blacklist_action" /
# "blacklist_fuzziness" still work and map to the same fields via
# Pydantic alias — existing integrations don't need changes.# demo/setup.json
{
"en": {
"language": "en",
"countries": ["US"],
"ner_backend": "Davlan/bert-base-multilingual-cased-ner-hrl",
"expressions": ["SA-2026-0847", "84-329-1057"],
"fuzziness": 0.5
}
}
# Then any time:
promptshield detect contract.pdf --preset en --export-review -o contract.psreviewSobre o nome: expressions é agora o nome canónico nas três superfícies — CLI (-e / --expression), API HTTP (expressions / expressions_action / expressions_fuzziness) e o rótulo na interface de ambiente de trabalho. As chaves anteriores blacklist_terms / blacklist_action / blacklist_fuzziness na API HTTP continuam a funcionar através de um alias do Pydantic para retrocompatibilidade, pelo que as integrações existentes continuam a funcionar.
Fluxo de revisão: API → Ambiente de trabalho
A deteção automática em escala é apenas metade da história. A deteção automática nunca atinge 100% de precisão — há sempre falsos positivos para dispensar e entidades em falta para acrescentar. O promptShield fecha o ciclo com um pacote .psreview portátil: detete de forma programática, importe para a aplicação de ambiente de trabalho para um controlo de qualidade visual e humano e depois anonimize.
Passo 1a — Detetar e exportar (CLI, num só comando)
# Detect + bundle in one command
promptshield detect contract.pdf --export-review -o contract.psreview
# Ingesting contract.pdf...
# Detecting PII on page 1/3...
# Detecting PII on page 2/3...
# Detecting PII on page 3/3...
# Detected 14 PII region(s) across 3 page(s) in 1240ms.
# Review bundle saved to contract.psreview (14 region(s))Passo 1b — Detetar e exportar (API HTTP)
# 1. Upload document
curl -X POST http://localhost:8000/api/documents/upload \
-H "Authorization: Bearer $PROMPTSHIELD_API_KEY" \
-F "file=@contract.pdf"
# → {"doc_id": "abc123ef", "page_count": 3, ...}
# 2. Run detection
curl -X POST http://localhost:8000/api/documents/abc123ef/detect \
-H "Authorization: Bearer $PROMPTSHIELD_API_KEY"
# 3. Download the review bundle
curl http://localhost:8000/api/documents/abc123ef/export-review \
-H "Authorization: Bearer $PROMPTSHIELD_API_KEY" \
-o contract.psreview.psreview API
/api/documents/{id}/export-reviewExportar pacote de revisão
Transfira o documento e todas as suas anotações de regiões como um pacote .psreview (ZIP portátil).
/api/documents/import-reviewImportar pacote de revisão
Carregue um pacote .psreview. Extrai o documento (executa OCR), injeta as anotações de regiões guardadas e abre o documento no estado REVIEWING — pronto para o controlo de qualidade visual, sem voltar a executar a deteção.
Passo 2 — Importar para a aplicação de ambiente de trabalho
Abra a aplicação de ambiente de trabalho do promptShield. No ecrã de carregamento, clique em Importar para revisão e selecione o ficheiro .psreview. O documento abre imediatamente em modo de revisão — todas as regiões detetadas estão pré-preenchidas, sem necessidade de um passo de deteção.
Passo 3 — Rever, editar e anonimizar
Use a barra lateral de regiões para dispensar os falsos positivos (defina a ação como Cancelar), desenhe novas regiões para qualquer coisa que o modelo tenha deixado escapar e depois clique em Exportar. A aplicação de ambiente de trabalho executa a anonimização e guarda o PDF ocultado na sua pasta Transferências.
8. SDK de Python (importação direta)
Para integrações avançadas, importe os módulos principais diretamente no seu código de Python. Isto dá-lhe controlo total sobre cada passo do processamento.
from promptshield import PromptShield
ps = PromptShield()
def process(input_path: str, output_path: str):
# Step 1 — Detect PII (runs the full local pipeline)
result = ps.detect(input_path)
print(f"Loaded: {result.file} ({result.pages} pages)")
print(f"Total PII entities: {result.total_regions}")
for page in result.regions:
for entity in page["entities"]:
print(f" Page {page['page']}: [{entity['type']}] {entity['text']}")
# Step 2 — Anonymize (reversible tokens by default; pass redact=True
# for permanent removal). Output is always a PDF.
out = ps.anonymize(input_path, output_path)
print(f"Anonymized: {out.tokens_created} tokens, saved to {out.output_file}")
# Step 3 — Restore the originals later from the local token vault
restored = ps.detokenize(output_path, "contract-restored.pdf")
print(f"Restored {restored.tokens_replaced} tokens")
process("contract.pdf", "contract-safe.pdf")
# Async variants are available too: ps.adetect / ps.aanonymize / ps.adetokenizeExemplo de processamento em lote
Processar vários ficheiros num diretório:
from pathlib import Path
from promptshield import PromptShield
ps = PromptShield()
def batch_process(input_dir: str, output_dir: str):
input_path = Path(input_dir)
output_path = Path(output_dir)
output_path.mkdir(parents=True, exist_ok=True)
files = list(input_path.glob("*.pdf"))
print(f"Processing {len(files)} files...")
for i, file in enumerate(files, 1):
print(f"[{i}/{len(files)}] {file.name}")
out_file = output_path / f"anon_{file.stem}.pdf"
result = ps.anonymize(str(file), str(out_file))
print(f" → {result.tokens_created} tokens, saved to {out_file.name}")
print("Batch complete!")
batch_process("./documents", "./anonymized")9. Segurança e privacidade dos dados
O promptShield foi concebido para ambientes de confiança zero:
10. Resolução de problemas
Problemas comuns e soluções:
Erro 'No spaCy model found' ou 'no NER model loaded'
Defina PROMPTSHIELD_ASSETS_DIR e instale um pacote: promptshield models install spacy-en-md. Em alternativa, para uma instalação a nível do sistema: python -m spacy download en_core_web_sm
O OCR não funciona em PDF digitalizados
Instale o Tesseract OCR e certifique-se de que está no seu PATH. No Windows, o instalador adiciona-o automaticamente.
Os ficheiros do Office não convertem
Instale o LibreOffice. O DOCX tem uma alternativa em Python puro, mas o XLSX/PPTX requerem o LibreOffice.
'Invalid API key' no arranque
Verifique que a sua chave começa por ps_live_ e que a sua subscrição está ativa. As chaves podem ser geridas em /developers/api-keys.
Documentos
/api/documents/uploadCarregar documento
Carregue um documento para processamento. Suporta ficheiros PDF, DOCX, XLSX, PPTX e de imagem.
/api/documentsListar documentos
Obtenha todos os documentos carregados com o seu estado de deteção e anonimização.
/api/documents/{id}Obter documento
Obtenha informação detalhada sobre um documento específico, incluindo o número de páginas e o estado da deteção.
/api/documents/{id}Eliminar documento
Remova um documento e todos os dados associados do servidor.
Deteção
/api/documents/{id}/detectDetetar dados pessoais
Execute o pipeline de deteção de dados pessoais num documento. Aceita um corpo JSON opcional para substituir as definições de deteção (confidence_threshold, regex_enabled, ner_enabled, regex_types, etc.) apenas para esta execução.
/api/documents/{id}/redetectVoltar a detetar dados pessoais
Volte a executar a deteção com controlo total dos parâmetros. Aceita confidence_threshold, regex_types, ner_types, blacklist_terms e mais.
/api/documents/{id}/detection-progressProgresso da deteção
Obtenha o progresso de uma tarefa de deteção em curso (percentagem, página atual e estado).
/api/documents/{id}/regionsObter regiões
Obtenha todas as regiões de dados pessoais detetadas para um documento, com tipo, texto, pontuação de confiança e caixa delimitadora.
/api/documents/{id}/regions/batch-actionAtualizar regiões em lote
Defina a ação (TOKENIZE, REMOVE ou CANCEL) para várias regiões de uma só vez, filtradas por tipo de entidade.
Anonimizar e exportar
/api/documents/{id}/regions/syncSincronizar regiões
Substitua totalmente a lista de regiões de um documento. Use após editar as regiões do lado do cliente para enviar as alterações antes de anonimizar.
/api/documents/{id}/anonymizeAnonimizar documento
Anonimize um documento substituindo os dados pessoais detetados por códigos. Devolve o documento processado.
/api/documents/{id}/download/{type}Transferir documento anonimizado
Transfira o resultado anonimizado. {type} é 'pdf' ou 'text'. O resultado é sempre apresentado em PDF (as entradas não-PDF são convertidas), pelo que 'pdf' é o formato principal.
/api/documents/batch-anonymizeAnonimizar em lote
Anonimize vários documentos num único pedido. Até 50 documentos processados em simultâneo.
Descodificar
/api/detokenizeDescodificar texto
Substitua os códigos numa cadeia de texto pelos seus valores originais do cofre.
/api/detokenize/fileDescodificar ficheiro
Carregue um documento codificado e receba uma versão com todos os códigos restaurados nos valores originais.
Cofre e registo de códigos
/api/vault/statusEstado do cofre
Obtenha as estatísticas do cofre: total de códigos, total de documentos, tamanho do registo.
/api/vault/tokensListar códigos
Obtenha todas as correspondências código-original armazenadas no cofre.
/api/vault/exportExportar cofre
Exporte todo o cofre como ficheiro JSON para cópia de segurança ou migração.
/api/vault/importImportar cofre
Importe um JSON de cofre exportado anteriormente para restaurar as correspondências de códigos.
Estado
/healthVerificação de estado
Devolve o estado de saúde do servidor. Use para monitorização e sondas de estado do balanceador de carga.
Definições
/api/settingsObter definições
Obtenha a configuração atual de deteção e processamento (limiares, pipelines ativados, idioma, etc.).
/api/settingsAtualizar definições
Atualize parcialmente as definições globais de deteção. As alterações aplicam-se a todas as deteções subsequentes.
/api/settings/patternsListar padrões personalizados
Obtenha todos os padrões definidos pelo utilizador usados para a deteção personalizada de dados pessoais.
/api/settings/patternsCriar padrão personalizado
Adicione um novo padrão personalizado para a deteção de dados pessoais. Os padrões são avaliados em conjunto com as regras integradas.
Exemplo
# 1. Upload a document
curl -X POST http://localhost:8000/api/documents/upload \
-F "file=@contract.pdf"
# → {"doc_id": "abc123", "filename": "contract.pdf", "page_count": 5, "status": "REVIEWING"}
# 2. Run PII detection
curl -X POST http://localhost:8000/api/documents/abc123/detect
# → {"doc_id": "abc123", "total_regions": 42, "regions": [...]}
# 3. Get detected regions
curl http://localhost:8000/api/documents/abc123/regions
# → [{"id": "...", "pii_type": "PERSON", "text": "John Smith", "confidence": 0.98,
# "page_number": 1, "bbox": {...}, "source": "NER", "action": "TOKENIZE"}, ...]
# 4. Anonymize the document
curl -X POST http://localhost:8000/api/documents/abc123/anonymize
# → {"doc_id": "abc123", "tokens_created": 42, "regions_removed": 0}
# 5. Download anonymized PDF
curl -o contract-safe.pdf \
http://localhost:8000/api/documents/abc123/download/pdfSDK de Python
A classe PromptShield executa todo o pipeline localmente — detetar, anonimizar e descodificar em três chamadas. Todo o processamento acontece no seu dispositivo; nenhum dado sai dele.
from promptshield import PromptShield
ps = PromptShield()
# Detetar dados pessoais
result = ps.detect("contract.pdf")
print(f"{result.total_regions} entities across {result.pages} pages")
for page in result.regions:
for entity in page["entities"]:
print(f" [{entity['type']}] {entity['text']}")
# Anonimizar (tokenização reversível)
out = ps.anonymize("contract.pdf", "contract-safe.pdf")
print(f"Done: {out.tokens_created} tokens created")
# Restaurar os valores originais
restored = ps.detokenize("contract-safe.pdf", "contract-restored.pdf")
print(f"Restored {restored.tokens_replaced} tokens")Tratamento de erros
Todas as respostas de erro seguem um formato JSON padrão, com um campo detail que descreve o erro.
Pedido inválido. Parâmetros incorretos ou ficheiro corrompido / não suportado.
Não autorizado. Chave de API em falta ou inválida (Authorization: Bearer) no modo de chave de API.
Proibido. A chave de API não tem o âmbito necessário (detect / anonymize / detokenize).
Não encontrado. O ID do documento não existe.
Não processável. Falta um campo obrigatório ou o ficheiro está protegido por palavra-passe.
Erro do servidor. Consulte os registos do servidor para mais detalhes.
Um modelo de deteção necessário não está instalado. Instale-o com promptshield models install.
{
"detail": "Document not found: abc123"
}Limites de taxa
A API auto-alojada não tem limites de taxa por predefinição. Pode configurar a limitação de taxa através de variáveis de ambiente, se necessário.