How Euriqa protects your test data, artifacts, and credentials at every layer — from the SDK to the database.
Security Architecture
Security in Euriqa is not an add-on — it is built into every layer of the platform. From the moment your reporter sends test results to the moment a team member views a trace in the dashboard, data is protected by authentication, authorization, encryption, and access controls.
Euriqa follows a defense-in-depth approach with security enforced at four levels:
SDK / Reporter — Validates credentials before any network call. Confines file access to the project directory.
API — Authenticates every request. Validates input schemas. Enforces rate limits.
Database — Row-Level Security (RLS) policies enforce access control at the PostgreSQL level. No application bypass possible.
Storage — Private artifact storage with signed, time-limited URLs. No public access.
Authentication
Euriqa supports two authentication methods. Both enforce the same authorization rules.
User Authentication (Dashboard)
Email/password sign-up with mandatory email verification
Secure password reset flow via email with time-limited tokens
Session-based authentication managed by Supabase Auth
OAuth support for third-party login providers (via Supabase callback)
Automatic session refresh with secure HTTP-only cookies
API Key Authentication (CI/CD)
API keys are the recommended authentication method for CI/CD pipelines and programmatic access.
Format: euriqa_sk_... — prefixed for easy identification
Scoped to a specific user, team, and project — cannot access other projects
Minimum 16 characters with placeholder rejection (rejects values like your-api-key-here)
Soft-delete deactivation — keys can be deactivated without permanent deletion
Optional expiration dates for temporary or contractor access
Last-used timestamp tracking for auditing
Full key value shown only once at creation — store securely
All API endpoints accept both session cookies (browser) and API key headers (CI/CD). The server attempts session authentication first, then falls back to API key. Both methods enforce identical authorization rules — there is no privilege difference between authentication methods.
Authorization & Access Control
Row-Level Security (RLS)
All data access in Euriqa is controlled at the PostgreSQL database level using Supabase Row-Level Security policies. This means authorization is enforced by the database engine itself — not by application code. Even if an application-level bug were introduced, the database would still reject unauthorized access.
User-scoped — Users can only access their own profile, preferences, and account data
Team-scoped — Users can only access teams they are members of
Project-scoped — Test runs, results, artifacts, and analytics are isolated per project
Role-based — Actions are gated by team role
Role-Based Permissions
Every team member has one of four roles. Permissions are enforced at both the API and database level.
Role
View Data
Create Projects
Manage Members
Manage Settings
Owner
Yes
Yes
Yes
Yes
Admin
Yes
Yes
Yes
Yes
Member
Yes
No
No
No
Viewer
Yes
No
No
No
Viewer seats are free and unlimited on every plan. Only Owner, Admin, and Member roles count toward seat limits.
Data Security
Artifact Storage
All test artifacts (screenshots, videos, Playwright traces, HTML reports) are stored in private cloud storage. No artifact is publicly accessible. Access is granted exclusively through signed URLs.
Signed URLs — Time-limited (1-hour expiration by default). Generated on demand when a team member requests access.
Project-scoped — Only team members with access to the project can view its artifacts.
No permanent public URLs — URLs expire and cannot be reused. New URLs are generated for each access request.
Storage isolation — Artifacts are organized by project and run: {project_id}/{run_id}/{type}/{filename}
File Upload Security
Multiple layers of validation protect against malicious file uploads:
Path traversal prevention — File paths are validated against .., null bytes, and URL-encoded variants
Extension whitelisting — Only allowed file extensions are accepted per artifact type (e.g., screenshots: .png .jpg .webp, traces: .zip)
MIME type validation — Uploaded file MIME type must match the declared artifact type
File size limits — Enforced per artifact type (screenshots: 10 MB, videos: 100 MB, traces: 100 MB)
Working directory confinement — The SDK cannot access files outside the project directory
Encryption
In transit — HTTPS/TLS required for all API communication. HTTP connections are rejected.
At rest — Database managed by Supabase with encrypted storage and automatic backups.
Environment variables — Encrypted using dotenvx. Never committed to source control.
API Security
Request Validation
Every API request is validated using Zod schemas before processing. Invalid requests are rejected with descriptive error messages. This prevents injection attacks, unexpected data shapes, and type confusion.
Rate Limiting
All API endpoints are rate-limited to prevent abuse and ensure fair usage:
Endpoint
Limit
POST /api/runs
1,000 / hour
POST /api/tests
1,000 / hour
POST /api/upload
100 / hour
POST /api/api-keys
10 / hour
POST /api/auth/resend-verification
5 / minute
Rate limits are per IP address. Exceeding limits returns 429 Too Many Requests.
Sensitive Data Handling
API keys are masked in all log output (only last 4 characters shown)
Sensitive data is sanitized before error reporting
Full API key value is returned only once at creation time
Passwords are hashed — never stored in plain text
SDK & Reporter Security
The @euriqa/euriqa-playwright reporter runs in your CI environment. It is designed with the principle of least privilege:
API key validation — Validates the API key format and rejects placeholder values before making any network call
File path normalization — All file paths are normalized and validated before reading
Directory confinement— The reporter cannot access files outside the project's working directory
Extension whitelisting — Only known safe file extensions can be uploaded
No sensitive data in output — API keys and tokens are never written to stdout/stderr
Debug mode masking — Even with debug: true, sensitive data is automatically masked in output
The reporter communicates only with the Euriqa API over HTTPS. It does not open network listeners, write to system directories, or modify your test files in any way.
Webhook Security
Webhooks deliver event notifications to your endpoints. Euriqa protects webhook delivery with:
HTTPS required — Webhook URLs must use HTTPS. HTTP endpoints are rejected.
No private networks — Webhook URLs pointing to private IP ranges (localhost, 10.x.x.x, 192.168.x.x, 172.16-31.x.x) are rejected to prevent SSRF attacks.
Signature verification — Optionally configure a webhook secret. Euriqa generates an HMAC-SHA256 signature for each delivery, allowing your endpoint to verify the payload originated from Euriqa.
Custom headers — Add authentication headers to webhook requests for endpoint-level access control.
Database — PostgreSQL managed by Supabase with automatic backups, point-in-time recovery, and encrypted storage
Artifact storage — Supabase Storage with private buckets and signed URL access
Environment variables — Encrypted with dotenvx. Rotated periodically. Never committed to version control.
CDN — Static assets and artifact delivery backed by CDN for performance and DDoS mitigation
Monitoring — Application and infrastructure monitoring with alerting for anomalous access patterns
Compliance & Data Governance
Data Retention
Data retention is configurable per project. When the retention period expires, test runs, results, and associated artifacts are permanently deleted.
Plan
Default Retention
Hobby (Free)
7 days
Growth
30 days
Pro
60 days
Startup
90 days
Enterprise
Custom (up to 365 days)
Data Isolation
No test data is shared between teams — complete tenant isolation
No data is shared between projects within a team — project-level isolation
API keys are scoped to a single project and cannot access other projects
Database queries are filtered by RLS policies at every level
Audit Trail
API key usage is tracked with last-used timestamps
All data modifications are timestamped with created_at and updated_at fields
Webhook deliveries are logged
Team membership changes are recorded
GDPR & Privacy
Euriqa collects only the data necessary to provide the service (test results, artifacts, git metadata)
Users can delete their account and associated data
Data retention is configurable — set it to the minimum your team needs
No test data is used for training, analytics, or any purpose beyond providing the service to the team that owns it
Compliance Roadmap
SOC 2 Type II — In progress
GDPR compliance — Current practices align with GDPR requirements
On-premise deployment — Available for Enterprise plans
Security Best Practices
Recommendations for keeping your Euriqa integration secure:
Store API keys as CI secrets— Never commit keys to source control. Use your CI provider's secret management (GitHub Actions Secrets, GitLab CI Variables, etc.).
Use one key per environment— Create separate API keys for staging and production. Name them descriptively (e.g., "GitHub Actions — staging").
Rotate keys periodically — Deactivate old keys and create new ones on a regular cadence.
Set expiration dates — For temporary access (contractors, trial integrations), set an expiration date on the API key.
Use the minimum role needed — Assign Viewer to people who only need to see results. Reserve Admin for people who manage settings.
Enable webhook signatures — Configure a webhook secret and verify HMAC signatures on your receiving endpoint.
Review API key usage — Periodically check last-used timestamps and deactivate unused keys.
Reporting Security Issues
If you discover a security vulnerability in Euriqa, please report it responsibly:
Include a description of the vulnerability, steps to reproduce, and potential impact
We will acknowledge your report within 24 hours
We will provide a timeline for a fix and keep you updated
We do not pursue legal action against security researchers acting in good faith
Please do not disclose vulnerabilities publicly until we have had a reasonable opportunity to address them. We are committed to working with the security community to keep Euriqa safe for all users.