Trusted by Financial Institutions

Automate
Financial Portals
with Precision

A secure REST API that executes Playwright scripts on banking, payroll, and tax portals. Encrypted credentials, real-time monitoring, and validation summaries for every transaction.

Execute Automation
// Queue a payment automation
const job = await fetch('/api/jobs/execute', {
  method: 'POST',
  headers: { 'X-API-Key': apiKey },
  body: JSON.stringify({
    serviceId: 'gaps-single-payment',
    tenantId: tenant,
    inputs: { amount: '5000.00', beneficiary: '...' }
  })
});

// Response:
{ jobId: "x7Kp...", status: "queued" }

From API Call to Verified Result

Every job flows through a hardened pipeline with screenshots, validation, and real-time status updates at every stage.

Step 01

REST API Call

External apps POST to /api/jobs/execute with service, tenant, and input parameters. Authenticated via API key or JWT.

Step 02

Queue & Worker

Job enters the pg-boss queue with SKIP LOCKED concurrency. Worker picks it up, decrypts credentials, launches browser.

Step 03

Browser Execution

Playwright navigates the portal step-by-step: login, fill forms, click buttons, capture screenshots. Real-time updates via WebSocket.

Step 04

Validated Result

Job completes with a structured validation summary: multi-stage checks, extracted data, screenshots, and pass/fail criteria.

41
API Endpoints
12
Step Actions
4
Realtime Channels
<3s
Queue Latency

Built for Financial Automation

Every feature designed around the reality of automating regulated financial portals where accuracy is non-negotiable.

Real-Time WebSocket

Live job status, step completion events, and human-in-the-loop prompts streamed via PostgreSQL LISTEN/NOTIFY bridged to WebSocket.

Validation Summaries

Every job produces structured multi-stage checks: login verification, navigation confirmation, data submission, and result extraction.

Job Chaining

Chain services together: payment → approve → balance check. Each link tracked with parent/child lineage and separate validation.

Multi-Tenant

Isolated tenant workspaces with separate credentials, API keys, and job histories. Role-based credential sets for complex workflows.

Auto-Retry & Recovery

Failed jobs can be retried with one click. Browser sessions persist across runs to skip re-authentication. Human-like interaction delays.

Screenshot Audit Trail

Every step captures a screenshot. HTML reports with timing, success criteria, and extracted data. Full audit trail for compliance.

Bank-Grade Protection

Credentials and data are encrypted at rest and in transit. Every access is authenticated, every action is logged.

✓

AES-256-GCM Encryption

All portal credentials encrypted at rest with AES-256-GCM. Decrypted only in-memory during job execution, never logged or exposed via API.

✓

Dual Authentication

API key auth for machine-to-machine integration. JWT Bearer tokens for the web UI with 15-minute access tokens and httpOnly refresh cookies.

✓

Sensitive Field Redaction

Winston structured logging with automatic redaction of passwords, credentials, tokens, and API keys from all log output.

✓

Tenant Isolation

Each tenant's credentials, jobs, and data are fully isolated. API keys are scoped to a single tenant. No cross-tenant data leakage.

// Credential storage
const encrypted = encrypt({
  algorithm: 'aes-256-gcm',
  key: process.env.ENCRYPTION_KEY,
  data: credentials
});

// Never exposed
GET /api/credentials
// → { hasCredentials: true, role: "uploader" }
// Actual values: REDACTED

Simple, Powerful API

41 endpoints covering the full automation lifecycle. JSON by default, Protobuf for high-throughput integrations.

  • POST/api/jobs/execute
  • GET/api/jobs/:id
  • POST/api/jobs/:id/chain
  • GET/api/jobs/:id/report
  • GET/api/services
  • GET/api/services/:id/chainable
  • POST/api/sandbox/setup
  • GET/api/sandbox/status
Python example
import requests

# Execute a balance check
r = requests.post(
  "https://servat.techatscale.io/api/jobs/execute",
  headers={"X-API-Key": api_key},
  json={
    "serviceId": "gaps-balance-check",
    "tenantId": tenant_id,
    "inputs": {}
  }
)

# Poll for result with validation summary
job = requests.get(
  f"{base}/api/jobs/{r.json()['jobId']}",
  headers={"X-API-Key": api_key}
).json()

print(job["result"]["summary"])
Sandbox Mode

Test Without Risk

Full mock portal with simulated banking flows. Same pipeline, same validation, same API — zero real transactions. Perfect for integration testing.

Sandbox Docs

Ready to Automate?

Get started with the sandbox, explore the API, or sign up to connect your services.