Euriqa handles the full lifecycle of test artifacts -- from upload during CI to secure access in the dashboard. Screenshots, videos, traces, and HTML reports are captured automatically and made available via time-limited signed URLs.
The following artifact types are supported for upload, either automatically through the Reporter SDK or manually via the API.
| Type | Extensions | SDK Limit | API Limit |
|---|---|---|---|
| Screenshots | PNG, JPG, JPEG, WebP, GIF | 5 MB | 5 MB |
| Videos | WebM, MP4, AVI, MOV | 100 MB | 100 MB |
| Traces | ZIP | 50 MB | 50 MB |
| HTML Reports | ZIP (directory archive) | 200 MB | 200 MB |
| Generic Attachments | PNG, JPG, JPEG, WebP, GIF, JSON, TXT, LOG, ZIP, HTML | 10 KB inline / URL for larger | 10 MB |
The @euriqa/euriqa-playwright reporter automatically captures and uploads artifacts based on your Playwright configuration. No additional code is required.
Enable artifact uploads in your playwright.config.ts:
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
screenshot: 'only-on-failure',
video: 'retain-on-failure',
trace: 'on-first-retry',
},
retries: 2,
reporter: [
['@euriqa/euriqa-playwright', {
apiKey: process.env.EURIQA_API_KEY,
projectId: process.env.EURIQA_PROJECT_ID,
uploadScreenshots: true,
uploadVideos: true,
uploadTraces: true,
uploadHtmlReport: true,
htmlReportPath: 'playwright-report',
}],
],
});uploadHtmlReport: true. The entire report directory is zipped and uploaded.Files that exceed the configured size limit are not uploaded. Instead, the reporter logs a warning with the file name and size. This ensures that oversized artifacts never block or fail your CI pipeline. Small attachments (under 10 KB) are inline-encoded directly in the test result payload.
You can upload artifacts directly via the REST API. This is useful for custom CI integrations, scripts, or when you need to attach files outside of the Playwright reporter flow.
curl -X POST https://app.euriqa.dev/api/upload \
-H "X-API-Key: your-api-key" \
-F "file=@screenshot.png" \
-F "type=screenshot" \
-F "runId=run_abc123" \
-F "testId=test_xyz789"The upload endpoint accepts multipart/form-data with the file and metadata fields.
fileFileRequiredtypestringRequiredscreenshot, video, trace, report, or attachment.runIdstringRequiredtestIdstringThe API validates MIME types against allowed extensions for each artifact type. Mismatched or disallowed types are rejected.
| Artifact Type | Allowed MIME Types |
|---|---|
| screenshot | image/png, image/jpeg, image/webp, image/gif |
| video | video/webm, video/mp4, video/x-msvideo, video/quicktime |
| trace | application/zip |
| report | application/zip |
| attachment | image/*, application/json, text/plain, text/html, application/zip |
{
"success": true,
"artifact": {
"id": "art_abc123",
"type": "screenshot",
"fileName": "screenshot.png",
"fileSize": 245760,
"url": "https://app.euriqa.dev/storage/v1/object/sign/artifacts/...",
"createdAt": "2026-01-15T10:30:00Z"
}
}All artifacts are served through secure, time-limited signed URLs. There is no public access to any stored file.
Artifacts are organized in a structured path hierarchy that keeps files isolated and manageable:
/{project_id}/{run_id}/{artifact_type}/{test_id}/{filename}
# Example:
/proj_abc123/run_def456/screenshots/test_ghi789/failure-screenshot.png
/proj_abc123/run_def456/videos/test_ghi789/test-recording.webm
/proj_abc123/run_def456/traces/test_ghi789/trace.zip
/proj_abc123/run_def456/reports/html-report.zipThis structure supports data retention policies. When a retention window expires, entire run directories are cleaned up automatically. The default retention period is 90 days, configurable per project.
When uploadHtmlReport is enabled, the reporter follows this process:
htmlReportPath (default: playwright-report).POST https://app.euriqa.dev/api/upload with type report.The artifact upload pipeline includes multiple layers of security validation to prevent misuse.
.., /, and null bytes are rejected.400 error.