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.