# Get scan results Source: https://docs.techslayers.ca/darkrecon/api/get-scan-results openapi/darkrecon.json GET /scan/{scan_id} Retrieve the stored DarkRecon result payload by scan UUID. # Get scan results Returns the full stored result payload for a previous scan. ## What comes back * Top-level metadata such as `scan_id`, `status`, `total_breaches`, and `created_at`. * The original `keywords` array or the scanned `domain`. * Optional `discovered_emails` for domain-driven scans. * Optional `error_detail` when the stored scan ended in an error state. * A `results` object keyed by breach database name. ## Result parsing notes * Each breach source object contains `InfoLeak`, `NumOfResults`, and `Data`. * `Data` is an array of raw records from that source. Field names vary across breach databases. * Password-like values are masked in returned records. * `total_breaches` counts breach sources, not the total number of records across all `Data` arrays. ## Error behavior * `404`: the supplied `scan_id` does not exist. * `403`: the API key could not be validated. * `422`: request validation failed, such as a missing `X-API-Key` header or malformed path input. # Start scan Source: https://docs.techslayers.ca/darkrecon/api/start-scan openapi/darkrecon.json POST /scan Scan keywords or a domain for breach data and create a stored DarkRecon result. # Start scan Creates a stored scan and returns the `scan_id` you will use for follow-up retrieval. The live API uses `keywords`. If you still send `queries`, your request will not match the current contract. ## Choose one input mode * `keywords`: send one or more search terms such as emails, phone numbers, usernames, IPs, passwords, car plates, social IDs, or composite strings. * `domain`: send a single domain to enumerate breached emails and scan the discovered addresses automatically. Do not send both in the same request. ## Keyword guidance * Each keyword is queried independently against the breach dataset. * Composite queries are supported when you want to correlate multiple terms inside a single search string. * Domain scans can return `discovered_emails` immediately in the `POST /scan` response. ## Response semantics * `scan_id` is the durable identifier for the stored scan. * `status` can be `success`, `no_results`, or `no_queries`. * `total_breaches` is the number of matched breach sources. * Full raw breach records are not returned by `POST /scan`; retrieve them with `GET /scan/{scan_id}`. ## Error behavior * `422`: request validation failed, including a missing `X-API-Key` header or malformed request structure. * `403`: the API key could not be validated. * `502`: the upstream breach-data provider returned an error. # Authentication Source: https://docs.techslayers.ca/darkrecon/authentication Authenticate to DarkRecon with an API key header. # Authentication All DarkRecon endpoints require an API key header. ## Header * `X-API-Key: ` Keep the API key server-side. DarkRecon is designed for backend or trusted service-to-service usage, not direct browser exposure. ## Example ```bash theme={null} curl -X GET "https://darkrecon.1337807.xyz/scan/YOUR_SCAN_ID" \ -H "X-API-Key: $DARKRECON_API_KEY" ``` ## Observed error behavior * Missing `X-API-Key` currently returns `422` with a validation payload from the API framework. * Invalid or revoked API keys return `403` with a standard error body. Missing header example: ```json theme={null} { "detail": [ { "type": "missing", "loc": ["header", "x-api-key"], "msg": "Field required", "input": null } ] } ``` Invalid key example: ```json theme={null} { "detail": "Could not validate API key" } ``` See `/platform/authentication` for broader TechSlayers platform guidance. # Overview Source: https://docs.techslayers.ca/darkrecon/overview DarkRecon API for scanning keywords or domains for breach intelligence and retrieving stored results by scan ID. # DarkRecon DarkRecon is a stored-scan API for breach intelligence lookups. Send either a `keywords` array or a `domain`, receive a `scan_id`, and use that identifier to fetch the full stored result later. Older examples used `queries` in the request body. The current API expects `keywords`. Run a keyword or domain scan and fetch stored results. Use `X-API-Key` on every request. Endpoint-by-endpoint reference with interactive requests. ## Base URL `https://darkrecon.1337807.xyz` ## What you can scan * Email addresses * Phone numbers * Usernames and handles * IP addresses * Password strings or masked fragments * Car plates / vehicle identifiers * Social account IDs * Composite search phrases * Domains, which trigger email enumeration and follow-on scanning ## Authentication DarkRecon uses an API key sent in the request header: * `X-API-Key: ` See `/darkrecon/authentication`. ## Request model 1. Submit `POST /scan` with either `keywords` or `domain`. 2. Read the synchronous response for `scan_id`, `status`, `total_breaches`, and optional `discovered_emails`. 3. Fetch the stored record with `GET /scan/{scan_id}`. 4. Parse the `results` object, which is keyed by breach database name rather than normalized into a fixed schema. ## Response model * `total_breaches` counts matched breach sources, not the total number of raw rows inside `Data`. * `results` is a dictionary keyed by breach database name. * Each breach entry contains `InfoLeak`, `NumOfResults`, and `Data`. * `Data` records are source-specific. Field names vary between breaches. * Password-like fields are masked in API output. ## Related pages * `/darkrecon/quickstart` * `/darkrecon/api/start-scan` * `/darkrecon/api/get-scan-results` # Quickstart Source: https://docs.techslayers.ca/darkrecon/quickstart Start a DarkRecon scan with keywords or a domain and retrieve the stored results. # Quickstart This guide walks through the current DarkRecon flow: submit either `keywords` or `domain`, store the returned `scan_id`, and retrieve the raw stored result. Use `keywords` in the request body. Older docs used `queries`, which no longer matches the live API. ## 1) Set your API key ```bash theme={null} export DARKRECON_BASE_URL="https://darkrecon.1337807.xyz" export DARKRECON_API_KEY="YOUR_API_KEY" ``` ## 2) Start a keyword scan ```bash theme={null} curl -X POST "$DARKRECON_BASE_URL/scan" \ -H "Content-Type: application/json" \ -H "X-API-Key: $DARKRECON_API_KEY" \ -d '{ "keywords": ["john@example.com", "ShadowPlayer228"] }' ``` Example response: ```json theme={null} { "scan_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "status": "success", "total_breaches": 3 } ``` ## 3) Start a domain scan ```bash theme={null} curl -X POST "$DARKRECON_BASE_URL/scan" \ -H "Content-Type: application/json" \ -H "X-API-Key: $DARKRECON_API_KEY" \ -d '{ "domain": "example.com" }' ``` Domain scans can include `discovered_emails` in the initial response when the service enumerates breached addresses before running the follow-on scan. ## 4) Retrieve full scan results ```bash theme={null} curl -X GET "$DARKRECON_BASE_URL/scan/YOUR_SCAN_ID" \ -H "X-API-Key: $DARKRECON_API_KEY" ``` Example stored result: ```json theme={null} { "scan_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "keywords": ["john@example.com"], "domain": null, "total_breaches": 3, "status": "success", "created_at": "2026-03-30T10:30:00+00:00", "results": { "AlpineReplay": { "InfoLeak": "Description of the breach...", "NumOfResults": 1, "Data": [ { "Email": "john@example.com", "Password(bcrypt)": "$2****************************xC", "FirstName": "John", "LastName": "Doe" } ] } } } ``` ## 5) Parse the result safely * `total_breaches` is the number of matched breach sources, not the total number of rows in all `Data` arrays. * `results` is keyed by breach database name. * Every source exposes `InfoLeak`, `NumOfResults`, and `Data`. * Records inside `Data` are source-specific and can have different field names across breaches. * Password-like values are masked in the API output. ## Next steps * `/darkrecon/api/start-scan` * `/darkrecon/api/get-scan-results` * `/darkrecon/schemas/scan-request` * `/darkrecon/schemas/scan-result` * `/darkrecon/schemas/http-validation-error` # Error Source: https://docs.techslayers.ca/darkrecon/schemas/error Standard DarkRecon error payload. # Error Returned on application-level failures such as invalid API keys, upstream provider errors, or missing scan IDs. ## Shape ```json theme={null} { "detail": "Could not validate API key" } ``` ## Important distinction Most application errors use the simple string-based `detail` shape above. Validation failures, including a missing `X-API-Key` header, use `HTTPValidationError` instead. # HTTPValidationError Source: https://docs.techslayers.ca/darkrecon/schemas/http-validation-error Validation error envelope returned when DarkRecon rejects missing or malformed request input. # HTTPValidationError Returned when request validation fails before the application-level handler runs. ## Common cases * Missing `X-API-Key` * Invalid `scan_id` path input * Malformed JSON or unexpected request structure The `detail` array contains one or more `ValidationError` objects. # ScanRequest Source: https://docs.techslayers.ca/darkrecon/schemas/scan-request Request body for starting a DarkRecon scan. # ScanRequest Input payload for `POST /scan`. ## Rules * Send exactly one of `keywords` or `domain`. * `keywords` replaces the older `queries` field from previous docs. * `keywords` can include emails, phone numbers, usernames, IPs, passwords, car plates, social IDs, or composite search strings. Keyword example: ```json theme={null} { "keywords": ["user@example.com", "ShadowPlayer228"] } ``` Domain example: ```json theme={null} { "domain": "example.com" } ``` # ScanResponse Source: https://docs.techslayers.ca/darkrecon/schemas/scan-response Initial response returned when a DarkRecon scan is created. # ScanResponse Contains the immediate acknowledgement returned by `POST /scan`. ## Key fields * `scan_id`: store this UUID and use it with `GET /scan/{scan_id}`. * `status`: `success`, `no_results`, or `no_queries`. * `total_breaches`: number of matched breach sources, not raw rows. * `discovered_emails`: optional, only for domain-driven scans that enumerate breached addresses. * `message`: optional context when the request resolves without usable search terms. This response does not contain the raw breach records. Use the stored `scan_id` to fetch the full result payload. # ScanResult Source: https://docs.techslayers.ca/darkrecon/schemas/scan-result Stored full result payload returned by `GET /scan/{scan_id}`. # ScanResult Contains the stored record returned by `GET /scan/{scan_id}`. ## Top-level shape * `keywords` or `domain` describes what was scanned. * `status`, `total_breaches`, and `created_at` describe the stored scan record. * `discovered_emails` appears on domain scans when emails were enumerated. * `error_detail` is present if the scan ended in an error state. ## `results` object * `results` is keyed by breach database name. * Each entry contains: * `InfoLeak`: breach/source description. * `NumOfResults`: number of records found in that breach. * `Data`: array of raw breach records from that source. * Fields inside `Data` vary by breach source. Do not assume a fixed normalized schema. * Password-like values are masked in API output. # ValidationError Source: https://docs.techslayers.ca/darkrecon/schemas/validation-error Individual validation issue object nested inside HTTPValidationError.detail. # ValidationError Each entry in `HTTPValidationError.detail` describes one validation failure. ## Key fields * `loc`: where the validation issue happened, such as `["header", "x-api-key"]` * `msg`: human-readable explanation * `type`: machine-readable validation category * `input`: offending value when the framework includes it # Scan file Source: https://docs.techslayers.ca/filescanner/api/scan-file openapi/filescanner.json POST /api/scan Scan a file for malware and return detection results. # Scan file Uploads a file to be scanned. The request is `multipart/form-data`. ## Form fields * `file` (required): the file to scan * `apikey` (optional): alternative to the `X-API-Key` header * `devicename` (optional): alternative to the `X-Device-Name` header # Authentication Source: https://docs.techslayers.ca/filescanner/authentication Optional API key and device headers for FileScanner. # Authentication FileScanner supports optional authentication headers. ## Headers * `X-API-Key: ` (optional) * `X-Device-Name: ` (optional) Some clients may also pass these as multipart fields (`apikey`, `devicename`) instead of headers. ## Example ```bash theme={null} curl -X POST "https://6465762e76312e7363616e.slayers.tech/api/scan" \ -H "X-API-Key: $FILESCANNER_API_KEY" \ -H "X-Device-Name: $FILESCANNER_DEVICE_NAME" \ -F "file=@/path/to/file" ``` # Overview Source: https://docs.techslayers.ca/filescanner/overview FileScanner malware scanning API for files. # FileScanner FileScanner provides an API endpoint to scan a file for malware and return detection results, file hashes, and extracted metadata. Upload a file and interpret scan results. Optional API key and device headers. Full request/response schema for file scanning. ## Base URL `https://6465762e76312e7363616e.slayers.tech` ## Endpoint * Scan file: `POST /api/scan` # Quickstart Source: https://docs.techslayers.ca/filescanner/quickstart Scan a file and read detections, metadata, and hashes. # Quickstart This guide shows how to upload a file to FileScanner and interpret the response. ## 1) Prepare your request The API expects `multipart/form-data` with a `file` field. If your deployment requires authentication, include: * `X-API-Key: ` * `X-Device-Name: ` ## 2) Upload and scan ```bash theme={null} curl -X POST "https://6465762e76312e7363616e.slayers.tech/api/scan" \ -H "X-API-Key: $FILESCANNER_API_KEY" \ -H "X-Device-Name: $FILESCANNER_DEVICE_NAME" \ -F "file=@/path/to/file" ``` ## 3) Interpret the response The response includes: * `has_detections` and `num_detections` * `detections`: list of `(engine, detection)` tuples * `file_hash`: `md5_hash` and `sha256_hash` * `metadata`: extracted details about the file ## Next steps * `/filescanner/api/scan-file` * `/filescanner/authentication` # TechSlayers Docs Source: https://docs.techslayers.ca/index API references and integration guides for TechSlayers products. # TechSlayers Docs Central documentation for TechSlayers products: quickstarts, authentication patterns, and API references. Breach scanning workflows: scan emails/phones/domains and retrieve findings by scan UUID. Malware scanning API for files with detection results, metadata, and hashes. WordPress scanning service: start a scan, then pull reports by ID. Workflow-driven scan automation with external kit discovery, run status, and parsed results. Simulation scanning API: start scans, track status, and retrieve reports, logs, and JSON findings. Developer portal and API reference for browser isolation instances, images, keys, and logs. ## Authentication at a glance | Product | Base URL | Auth | | ----------- | --------------------------------------------- | --------------------------------------------- | | DarkRecon | `https://darkrecon.1337807.xyz` | API key header `X-API-Key` | | FileScanner | `https://6465762e76312e7363616e.slayers.tech` | Optional headers `X-API-Key`, `X-Device-Name` | | RTSWPScan | `https://rtswpscan.slayers.tech` | API key header `API-Key` | | RTS Builder | `https://rts-builder.slayers.tech` | API key header `X-API-Key` | | Senthrex | `https://rts-senthrex.slayers.tech` | Bearer token header `Authorization: Bearer …` | | Legba | Provided in the Legba portal | Bearer token header `Authorization: Bearer …` | ## Platform docs Where to put your keys/tokens and how auth differs across products. How to debug 4xx/5xx, interpret common responses, and implement retries safely. Backoff strategies and client patterns that keep your integrations reliable. ## Need help? * Support: `support@techslayers.ca` * Security: `security@techslayers.ca` # API keys Source: https://docs.techslayers.ca/legba/api-keys Retrieve API key information and rotate keys. # API keys Legba supports retrieving key metadata and rotating keys. Rotating a key will invalidate the old key. Update any integrations immediately after rotation. ## Get API key information ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/key" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" ``` ## Rotate API key ```bash theme={null} curl -X POST "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/key/rotate" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" ``` # Authentication Source: https://docs.techslayers.ca/legba/authentication Authenticate to Legba with a bearer token and org-scoped routes. # Authentication Legba uses bearer token authentication. ## Header * `Authorization: Bearer ` ## Org scoping Most endpoints are scoped under your organization: `/orgs/{org_uuid}/api/...` ## Example ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" ``` # Cookbook Source: https://docs.techslayers.ca/legba/cookbook Practical patterns for using Legba instances in real systems. # Cookbook ## Use case 1: Automated testing environments Create an isolated instance per test run, execute tests against the `access_url`, then destroy the instance. ```js theme={null} const baseUrl = `${process.env.LEGBA_BASE_URL}/orgs/${process.env.LEGBA_ORG_UUID}/api` const token = process.env.LEGBA_API_TOKEN async function createInstance() { const response = await fetch(`${baseUrl}/instances`, { method: "POST", headers: { Authorization: `Bearer ${token}`, "Content-Type": "application/json" }, body: JSON.stringify({ image: "ubuntu-22.04", size: "small" }), }) return response.json() } async function destroyInstance(instanceUuid) { await fetch(`${baseUrl}/instances/${instanceUuid}`, { method: "DELETE", headers: { Authorization: `Bearer ${token}` }, }) } ``` ## Use case 2: On-demand secure browsing sessions Map an app user/session to an `instance_uuid`, return `access_url` to the client, then clean up when the session ends. ## Use case 3: Instance pool management Pre-warm a pool of instances for lower latency, track which are in use, and replenish when the pool drops below a threshold. ## Best practices * Always clean up instances (timeouts + periodic sweeps). * Store API keys securely (server-side only, rotate regularly). * Implement retries with backoff for transient errors. * Monitor usage and audit logs (`/legba/logs`). # Errors Source: https://docs.techslayers.ca/legba/errors Error formats and common HTTP status codes in the Legba API. # Errors The upstream docs describe a consistent error envelope: ```json theme={null} { "error": { "code": "ERROR_CODE", "message": "Human-readable error description", "details": {} } } ``` ## Common HTTP status codes | Status | Meaning | | ------ | --------------------- | | `400` | Bad request | | `401` | Unauthorized | | `403` | Forbidden | | `404` | Not found | | `429` | Too many requests | | `500` | Internal server error | # Images Source: https://docs.techslayers.ca/legba/images List available OS + browser images you can use for instances. # Images Images define the base OS and browser configuration used when creating an instance. ## List available images ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/images" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" ``` # Instances Source: https://docs.techslayers.ca/legba/instances List, create, and destroy isolated browser instances. # Instances Instances are isolated environments created from images. Responses typically include: * `instance_uuid` * `status` * `image` * `size` * `created_at` * `access_url` ## List instances ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" ``` ## Create instance ```bash theme={null} curl -X POST "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "image": "ubuntu-20.04", "size": "small" }' ``` ## Destroy instance ```bash theme={null} curl -X DELETE "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances/$INSTANCE_UUID" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" ``` ## Operational tips * Always destroy instances you no longer need to avoid unnecessary resource usage. * Store a mapping between your app sessions and `instance_uuid` for cleanup. # Audit logs Source: https://docs.techslayers.ca/legba/logs Retrieve audit logs for API activity and operational visibility. # Audit logs Audit logs help you understand who/what performed actions (e.g., instance creation/destruction), when it happened, and which resources were affected. ## Get audit logs ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/logs" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" ``` ## Typical log fields * `timestamp` * `action` (e.g., `instance.created`, `instance.destroyed`) * `actor` (e.g., API key identity) * `resource` (instance id) * `details` (image, size) # Overview Source: https://docs.techslayers.ca/legba/overview Legba developer docs for managing browser isolation images, instances, keys, and audit logs. # Legba Legba’s developer API is used to manage isolated browser instances (create, list, destroy), retrieve available images, rotate API keys, and review audit logs. This section is based on the official Legba developer portal at `https://www.legba.app/developers/api`. If anything differs from your environment, defer to the upstream docs. Create and destroy your first instance. Bearer token auth and org scoping. Create/list/destroy isolated instances. ## Key concepts * **Organization UUID (`org_uuid`)**: scopes requests to your org. * **Images**: templates (OS + browser) used to create instances. * **Instances**: running isolated environments; responses include an `access_url` for end-user access. * **Audit logs**: activity stream for API actions. # Quickstart Source: https://docs.techslayers.ca/legba/quickstart Create an instance, list it, and destroy it using the Legba API. # Quickstart This guide mirrors the Legba developer portal flow: list images → create instance → list instances → destroy instance. ## Prerequisites * A Legba account * An API token * Your `org_uuid` The upstream docs use `https://api.example.com` as a placeholder. Replace it with your real Legba API base URL. ## Environment variables (recommended) ```bash theme={null} export LEGBA_BASE_URL="https://api.example.com" export LEGBA_ORG_UUID="YOUR_ORG_UUID" export LEGBA_API_TOKEN="YOUR_API_TOKEN" ``` ## Step 1: List available images ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/images" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" ``` ## Step 2: Create an instance ```bash theme={null} curl -X POST "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "image": "ubuntu-20.04", "size": "small" }' ``` Save the returned `instance_uuid` and `access_url`. ## Step 3: List instances ```bash theme={null} curl -X GET "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" \ -H "Content-Type: application/json" ``` ## Step 4: Destroy an instance ```bash theme={null} curl -X DELETE "$LEGBA_BASE_URL/orgs/$LEGBA_ORG_UUID/api/instances/$INSTANCE_UUID" \ -H "Authorization: Bearer $LEGBA_API_TOKEN" ``` ## Next steps * `/legba/instances` * `/legba/images` * `/legba/api-keys` * `/legba/logs` # Authentication Source: https://docs.techslayers.ca/platform/authentication How to authenticate across TechSlayers product APIs. # Authentication TechSlayers products use either API keys (sent as headers) or bearer tokens (sent via the `Authorization` header). Never embed secrets in client-side code. Store them in your server environment (or a secret manager) and rotate them regularly. ## Product auth matrix | Product | Type | How to send | | ----------- | ------------------ | ----------------------------------------------------------- | | DarkRecon | API key | `X-API-Key: ` | | FileScanner | API key (optional) | `X-API-Key: ` and optionally `X-Device-Name: ` | | RTSWPScan | API key | `API-Key: ` | | RTS Builder | API key | `X-API-Key: ` | | Senthrex | Bearer token | `Authorization: Bearer ` | | Legba | Bearer token | `Authorization: Bearer ` | ## Recommended client pattern 1. Keep the secret server-side only. 2. Add a thin wrapper per product that: * injects auth headers * sets a sensible timeout * logs request IDs (if present) * retries only when safe (see `/platform/rate-limits`) ## Examples ### DarkRecon (`X-API-Key`) ```bash theme={null} curl -X GET "https://darkrecon.1337807.xyz/scan/YOUR_SCAN_ID" \ -H "X-API-Key: $DARKRECON_API_KEY" ``` ### Senthrex (`Authorization: Bearer`) ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/scans" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` # Errors Source: https://docs.techslayers.ca/platform/errors Debugging and handling errors consistently across TechSlayers APIs. # Errors TechSlayers APIs return standard HTTP status codes. Your integration should treat status codes (and not just response bodies) as the source of truth for success/failure. ## Common status codes | Status | Meaning | What to do | | ------ | ------------------- | ------------------------------------------------------------------------------------ | | `400` | Bad request | Validate inputs; log the response for field-level hints. | | `401` | Unauthorized | Check key/token formatting and that you’re using the right header name. | | `403` | Forbidden | Key is valid but lacks permission, or is invalid/disabled in some services. | | `404` | Not found / pending | Some “report not ready yet” flows may use `404` as a pending signal (see RTSWPScan). | | `422` | Validation error | Input shape is wrong (commonly used by FastAPI-based services). | | `500` | Server error | Retry with backoff; escalate to support if persistent. | ## Practical debugging checklist 1. Confirm you are calling the correct base URL for the product. 2. Confirm auth: * correct header name (`X-API-Key` vs `API-Key` vs `Authorization: Bearer …`) * secret is not empty / not expired 3. Log: * request URL + method * response status code * response body (redact secrets) 4. Add timeouts and handle retries safely (see `/platform/rate-limits`). If you need help debugging an unexpected response, email `support@techslayers.ca` with the request/response details (redacting any secrets). # Rate limits Source: https://docs.techslayers.ca/platform/rate-limits Safe retry patterns and backoff strategies for reliable integrations. # Rate limits Rate limits can vary by product and deployment. Build clients that are resilient even when limits are not explicitly documented. ## Best practices * Prefer exponential backoff with jitter for retries. * Retry only when safe: * ✅ `GET` requests are usually safe * ⚠️ `POST` may not be safe unless the endpoint is idempotent (or you use a request ID) * Treat `429` and `503` as retryable by default, using backoff. * Put a cap on retries and fail fast for clearly invalid requests (`400`, `401`). ## Example backoff schedule Try `1s → 2s → 4s → 8s` (plus small random jitter), then stop and surface an error. # Get run results Source: https://docs.techslayers.ca/rts-builder/api/get-results openapi/rts-builder.json GET /api/v1/external/results/{runId} Retrieve aggregate findings and per-step parsed results for a completed run. # Get run results ## Top-level fields * `aggregate`: Summary counters across the run * `run_id`: Run UUID * `status`: Terminal or in-progress run state * `steps`: Per-tool parsed result payloads ## Aggregate fields * `findings_by_severity` * `risk_score` * `total_findings` * `unique_hosts` * `unique_subdomains` ## Per-step fields * `exit_code` * `id` * `status` * `tool` * `parsed_results` `parsed_results` is tool-specific. In the `crt` runs tested for these docs, it contained: * `tool` * `type` * `summary` * `findings` ## Parser caveat The current `crt` adapter did not fully clean its CLI output before building findings. Decorative table rows and one database recovery error line were surfaced as `finding.host` values during live testing. If you consume results programmatically, sanitize entries instead of assuming every `host` value is a valid hostname. ## Related schemas * [RunResultsResponse](/rts-builder/schemas/run-results-response) * [ErrorResponse](/rts-builder/schemas/error-response) # Get run status Source: https://docs.techslayers.ca/rts-builder/api/get-status openapi/rts-builder.json GET /api/v1/external/status/{runId} Fetch status, timestamps, and step state for a run ID. # Get run status ## Status transitions Observed values: * `pending` * `running` * `completed` Internal run pages also account for `failed` and `cancelled`, and callers should handle those states as well. ## Related schemas * [RunStatusResponse](/rts-builder/schemas/run-status-response) * [ErrorResponse](/rts-builder/schemas/error-response) # List available kits Source: https://docs.techslayers.ca/rts-builder/api/list-kits openapi/rts-builder.json GET /api/v1/external/kits Return the externally accessible kits for the calling API key. # List available kits ## Notes * The response always includes `kits` and `total`. * A `200` with an empty `kits` array means the key authenticated successfully but has no externally visible kits. * In live testing, this also occurred for a newly created team API key after a kit had been marked `exposed`, which suggests an additional access grant or backend entitlement step beyond simply toggling exposure. ## Method behavior Observed method handling: * `GET /api/v1/external/kits` returns `200` * `HEAD /api/v1/external/kits` returns `404` * `OPTIONS /api/v1/external/kits` returns `404` ## Related schemas * [ListKitsResponse](/rts-builder/schemas/list-kits-response) * [ErrorResponse](/rts-builder/schemas/error-response) # Start run Source: https://docs.techslayers.ca/rts-builder/api/start-run openapi/rts-builder.json POST /api/v1/external/{kitSlug} Start a new external RTS Builder run for an exposed kit slug. # Start run ## Request body The public contract expects an `inputs` object. The exact input names depend on the exposed kit's runtime variables. ## Success shape The external success payload could not be verified directly because the live environment rejected `POST /api/v1/external/{kit_slug}` for both: * the original user-provided key * a newly created team API key in the same tenant as an exposed kit The schema rendered above is therefore based on the internally verified builder run-start payload and is labeled as inferred in the OpenAPI document. ## Related schemas * [StartRunRequest](/rts-builder/schemas/start-run-request) * [StartRunResponse (Inferred)](/rts-builder/schemas/start-run-response-inferred) * [ErrorResponse](/rts-builder/schemas/error-response) # Authentication Source: https://docs.techslayers.ca/rts-builder/authentication Authenticate RTS Builder external API calls with the X-API-Key header. # Authentication RTS Builder external endpoints authenticate with an API key in the `X-API-Key` header. ```bash theme={null} curl "$RTS_BUILDER_BASE_URL/api/v1/external/kits" \ -H "X-API-Key: your-api-key" ``` RTS Builder keys are tenant-scoped. A valid key from another team cannot read your run state or results. ## Missing key Observed response: ```http theme={null} HTTP/2 401 ``` ```json theme={null} { "error": "missing X-API-Key header" } ``` ## Invalid key Observed response: ```http theme={null} HTTP/2 401 ``` ```json theme={null} { "error": "invalid API key" } ``` ## Tenant scoping Run visibility is tenant-scoped. In live testing, a different team's API key received `404` with `{"error":"run not found"}` for both: * `GET /api/v1/external/status/{run_id}` * `GET /api/v1/external/results/{run_id}` That means external run IDs are not globally readable just because the caller has a valid API key. # Overview Source: https://docs.techslayers.ca/rts-builder/overview External API for running exposed RTS Builder kits and retrieving run state and results. # RTS Builder RTS Builder is a workflow-driven scanning platform. The external API is intentionally narrow: 1. List the kits your API key can see 2. Start a run for a specific exposed kit 3. Poll run status 4. Fetch structured results Follow the list, start, status, results workflow end to end. Send your API key in the `X-API-Key` header. Review the external endpoints with Mintlify's interactive request and schema rendering. ## Base URL `https://rts-builder.slayers.tech` ## External workflow 1. Build or import a kit in RTS Builder 2. Expose the kit from the Kits page 3. Create an API key in Settings 4. Call `GET /api/v1/external/kits` 5. Start a run with `POST /api/v1/external/{kit_slug}` 6. Poll `GET /api/v1/external/status/{run_id}` 7. Read `GET /api/v1/external/results/{run_id}` ## Verification coverage | Endpoint family | Live verified | Notes | | -------------------------------------- | ------------- | ------------------------------------------------------- | | `GET /api/v1/external/kits` | Yes | Only empty-list responses were observed. | | `POST /api/v1/external/{kitSlug}` | Partial | Error paths verified; success payload remains inferred. | | `GET /api/v1/external/status/{runId}` | Yes | Verified across four completed runs. | | `GET /api/v1/external/results/{runId}` | Yes | Verified across four completed runs. | Live testing on March 28, 2026 Pacific / March 29, 2026 UTC confirmed that `status` and `results` work, but `kits` and `start` remained gated by an additional backend access check even for a same-tenant exposed kit. ## Live-tested behavior The notes below were verified on March 28, 2026 Pacific / March 29, 2026 UTC. * Missing `X-API-Key` returns `401` with `{"error":"missing X-API-Key header"}`. * Invalid API keys return `401` with `{"error":"invalid API key"}`. * `status` and `results` are tenant-scoped. A different team's API key receives `404` with `{"error":"run not found"}` for the same run ID. * `status` and `results` worked successfully for completed runs. * `list` and `start` showed an important access-control caveat in live testing: Even after exposing a kit and creating a fresh API key in the same team, `GET /api/v1/external/kits` still returned an empty array and `POST /api/v1/external/{kit_slug}` returned `{"error":"API key does not have access to this kit"}`. ## Result parsing caveat Some tool adapters currently pass decorative CLI output through the structured findings parser. During live testing with a `crt`-based kit, box-drawing table rows were returned as findings alongside real hosts. Consumers should normalize results instead of assuming every `finding.host` value is a clean hostname. # Quickstart Source: https://docs.techslayers.ca/rts-builder/quickstart Typical RTS Builder external API flow, plus the live-tested caveats you should account for today. # Quickstart ## Authenticate Every request uses the `X-API-Key` header: ```bash theme={null} export RTS_BUILDER_API_KEY="your-api-key" export RTS_BUILDER_BASE_URL="https://rts-builder.slayers.tech" ``` Keep the API key server-side. The key determines tenant scope for kit visibility and run access. ## List accessible kits ```bash theme={null} curl "$RTS_BUILDER_BASE_URL/api/v1/external/kits" \ -H "X-API-Key: $RTS_BUILDER_API_KEY" ``` Example empty response: ```json theme={null} { "kits": [], "total": 0 } ``` ## Start a run ```bash theme={null} curl -X POST \ "$RTS_BUILDER_BASE_URL/api/v1/external/" \ -H "X-API-Key: $RTS_BUILDER_API_KEY" \ -H "Content-Type: application/json" \ -d '{"inputs":{"target":"example.com"}}' ``` External start success could not be completed with any tested key. Treat the example request as the intended contract and the success schema in the API reference as inferred until the access-control gap is fixed. ## Poll status ```bash theme={null} curl "$RTS_BUILDER_BASE_URL/api/v1/external/status/" \ -H "X-API-Key: $RTS_BUILDER_API_KEY" ``` Example completed status: ```json theme={null} { "error": "", "finished_at": "2026-03-29T02:33:41.139079Z", "run_id": "9bdeb4af-cab4-4de3-9f0f-758771d10991", "started_at": "2026-03-29T02:32:54.167691Z", "status": "completed", "steps": [ { "id": "993af399-0e1a-456e-ba12-d465e7f9a5e6", "node_id": "tool-1", "tool": "crt", "status": "completed", "exit_code": 0 } ] } ``` ## Fetch results ```bash theme={null} curl "$RTS_BUILDER_BASE_URL/api/v1/external/results/" \ -H "X-API-Key: $RTS_BUILDER_API_KEY" ``` Top-level result shape: ```json theme={null} { "aggregate": { "findings_by_severity": { "critical": 0, "high": 0, "info": 6, "low": 0, "medium": 0 }, "risk_score": 0, "total_findings": 6, "unique_hosts": 6, "unique_subdomains": 6 }, "run_id": "9bdeb4af-cab4-4de3-9f0f-758771d10991", "status": "completed", "steps": [ { "exit_code": 0, "id": "993af399-0e1a-456e-ba12-d465e7f9a5e6", "status": "completed", "tool": "crt", "parsed_results": { "tool": "crt", "type": "ct_enumeration", "summary": { "total_subdomains": 6 }, "findings": [] } } ] } ``` ## Live validation snapshot These runs were started internally in RTS Builder and then retrieved through the external `status` and `results` endpoints on March 28, 2026 Pacific / March 29, 2026 UTC: | Target | Final status | `total_findings` | `unique_subdomains` | | ----------------------- | ------------ | ---------------: | ------------------: | | `techslayers.ca` | `completed` | 6 | 6 | | `techslayers.com` | `completed` | 25 | 25 | | `beta.redteamsuite.com` | `completed` | 3 | 3 | | `ameyalambat.com` | `completed` | 1 | 1 | ## Important caveat In live testing, the intended public flow was only partially available: * External `status` and `results` worked for runs owned by the same tenant. * External `list` and `start` did not automatically work with a newly created team API key, even after the kit was marked `exposed`. Observed responses: ```json theme={null} { "kits": [], "total": 0 } ``` ```json theme={null} { "error": "API key does not have access to this kit" } ``` Treat this as a current access-control dependency: a valid key must be explicitly allowed to see the exposed kit, or the backend currently needs an additional grant step that is not exposed in the UI. # ErrorResponse Source: https://docs.techslayers.ca/rts-builder/schemas/error-response Standard RTS Builder external API error envelope. # ErrorResponse Simple error body used across auth, lookup, and access-control failures. # ListKitsResponse Source: https://docs.techslayers.ca/rts-builder/schemas/list-kits-response Response body for GET /api/v1/external/kits. # ListKitsResponse Observed authenticated shape for the kits listing endpoint. # RunResultsResponse Source: https://docs.techslayers.ca/rts-builder/schemas/run-results-response Response body for GET /api/v1/external/results/{runId}. # RunResultsResponse Aggregate counters and tool-specific parsed result payloads. # RunStatusResponse Source: https://docs.techslayers.ca/rts-builder/schemas/run-status-response Response body for GET /api/v1/external/status/{runId}. # RunStatusResponse Top-level run state plus per-step execution status. # StartRunRequest Source: https://docs.techslayers.ca/rts-builder/schemas/start-run-request Request body for POST /api/v1/external/{kitSlug}. # StartRunRequest Input payload for starting a run. Variable names depend on the exposed kit. # StartRunResponse (Inferred) Source: https://docs.techslayers.ca/rts-builder/schemas/start-run-response-inferred Inferred success payload for POST /api/v1/external/{kitSlug}. # StartRunResponse (Inferred) This schema is inferred from the internally verified builder run endpoint because the external start endpoint rejected same-tenant test keys during live testing. # Get report Source: https://docs.techslayers.ca/rtswpscan/api/get-report openapi/rtswpscan.json GET /report/{report_id} Retrieve a scan report by ID. # Get report Retrieves the report for a previously initiated scan. ## Pending reports If the report is not ready, the API may return `404` with a `pending` status. Retry with backoff. # Start scan (GET) Source: https://docs.techslayers.ca/rtswpscan/api/start-scan-get openapi/rtswpscan.json GET /scan Initiate a scan using query parameters. # Start scan (GET) Initiates a scan using query parameters. Requires `url` and accepts an optional `mode`. # Start scan (POST) Source: https://docs.techslayers.ca/rtswpscan/api/start-scan-post openapi/rtswpscan.json POST /scan Initiate a scan using multipart form data. # Start scan (POST) Initiates a scan. Requires `url` and accepts an optional `mode`. ## Fields * `url` (required): target URL to scan * `mode` (optional): `normal` or `aggressive` (defaults to `normal` if omitted) # Authentication Source: https://docs.techslayers.ca/rtswpscan/authentication Authenticate to RTSWPScan with an API key header. # Authentication All RTSWPScan endpoints require an API key header. ## Header * `API-Key: ` ## Example ```bash theme={null} curl -X GET "https://rtswpscan.slayers.tech/report/YOUR_REPORT_ID" \ -H "API-Key: $RTSWPSCAN_API_KEY" ``` # Overview Source: https://docs.techslayers.ca/rtswpscan/overview RTSWPScan API for initiating WordPress scans and retrieving reports. # RTSWPScan RTSWPScan exposes a simple scan workflow: start a scan against a target URL, then retrieve the report by ID. Start a scan and poll for the report. Use the `API-Key` header. Reference for starting scans and fetching reports. ## Base URL `https://rtswpscan.slayers.tech` ## Typical workflow 1. Start a scan (`POST /scan` or `GET /scan`) 2. Use the returned `scan_id` as `report_id` 3. Fetch the report (`GET /report/{report_id}`), retrying until ready # Quickstart Source: https://docs.techslayers.ca/rtswpscan/quickstart Start a scan and retrieve the resulting report. # Quickstart This guide shows the standard RTSWPScan lifecycle: initiate a scan, then fetch the report. ## 1) Set your API key ```bash theme={null} export RTSWPSCAN_API_KEY="YOUR_API_KEY" ``` ## 2) Start a scan (recommended: POST) ```bash theme={null} curl -X POST "https://rtswpscan.slayers.tech/scan" \ -H "API-Key: $RTSWPSCAN_API_KEY" \ -F "url=https://example.com" \ -F "mode=normal" ``` The response includes a `scan_id` you’ll use to retrieve the report. ## 3) Fetch the report ```bash theme={null} curl -X GET "https://rtswpscan.slayers.tech/report/YOUR_SCAN_ID" \ -H "API-Key: $RTSWPSCAN_API_KEY" ``` ### Pending reports If the report is not ready, the API may respond with `404` and a JSON body like: ```json theme={null} { "status": "pending" } ``` In that case, wait and retry with backoff. ## Next steps * `/rtswpscan/api/start-scan-post` * `/rtswpscan/api/get-report` # Download report Source: https://docs.techslayers.ca/senthrex/api/download-report openapi/senthrex.json GET /report/{scan_uuid} Download the report artifact for a scan UUID. # Download report Retrieves the generated report artifact for a scan UUID. # Get scan logs Source: https://docs.techslayers.ca/senthrex/api/get-logs openapi/senthrex.json GET /logs/{scan_uuid} Retrieve logs for a scan UUID. # Get scan logs Returns detailed log data including the log file path, full log content, and size metadata. # Get scan results Source: https://docs.techslayers.ca/senthrex/api/get-results openapi/senthrex.json GET /results/{scan_uuid} Retrieve structured JSON results for a scan UUID. # Get scan results Returns consolidated JSON findings for a scan, with optional filtering by scanner/tool type. ## Query parameters * `tool` (optional): filter returned findings by scanner category # Get raw scan JSON Source: https://docs.techslayers.ca/senthrex/api/get-scan-json openapi/senthrex.json GET /json/{scan_uuid} Retrieve the raw consolidated JSON artifact for a scan UUID. # Get raw scan JSON Returns the raw stored JSON artifact for the scan (`mega.json`) exactly as generated by the backend. # Get stats Source: https://docs.techslayers.ca/senthrex/api/get-stats openapi/senthrex.json GET /stats Retrieve aggregate statistics. # Get stats Returns aggregated service metrics, including status breakdowns and disk usage totals. # Get scan status Source: https://docs.techslayers.ca/senthrex/api/get-status openapi/senthrex.json GET /status/{scan_uuid} Retrieve progress and current status for a scan UUID. # Get scan status Returns status fields like `status`, `progress_percentage`, `current_step`, and timestamps when available. # List scans Source: https://docs.techslayers.ca/senthrex/api/list-scans openapi/senthrex.json GET /scans List scans and summary counts. # List scans Returns an array of scans along with `total_scans` and `active_scans`. ## Query parameters * `limit` (optional): max scans to return (default: `50`) * `status_filter` (optional): filter scans by status # Start scan (GET) Source: https://docs.techslayers.ca/senthrex/api/start-scan-get openapi/senthrex.json GET /scan Start a scan by sending the domain (and optional mode) as query parameters. # Start scan (GET) Starts a new scan for the provided `domain` query parameter. ## Query parameters * `domain` (required): the domain to scan * `mode` (optional): `full` (default) or `discovery` # Start scan (POST) Source: https://docs.techslayers.ca/senthrex/api/start-scan-post openapi/senthrex.json POST /scan Start a scan by sending the domain (and optional mode) in a form-encoded body. # Start scan (POST) Starts a new scan for the provided `domain`. ## Body `application/x-www-form-urlencoded`: * `domain` (required): the domain to scan * `mode` (optional): `full` (default) or `discovery` # Stop scan Source: https://docs.techslayers.ca/senthrex/api/stop-scan openapi/senthrex.json POST /scan/{scan_uuid}/stop Stop a running or pending scan by UUID. # Stop scan Stops a scan in progress and returns a message confirming the stop action. # Authentication Source: https://docs.techslayers.ca/senthrex/authentication Authenticate to Senthrex with a bearer token. # Authentication Senthrex uses bearer-token authentication for scan operations. ## Header * `Authorization: Bearer ` ## Example ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/scans" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` The root endpoint (`GET /`) is a health/info endpoint and does not require authentication. # Overview Source: https://docs.techslayers.ca/senthrex/overview Senthrex Simulation API for starting security scans, tracking progress, and retrieving results. # Senthrex Senthrex provides an authenticated security scan workflow: 1. Start a scan for a domain. 2. Track progress and status. 3. Retrieve reports, logs, and structured JSON results. 4. Stop scans when required. Start a scan and check status end-to-end. Bearer token authentication. Endpoint reference with interactive requests. ## Base URL `https://rts-senthrex.slayers.tech` ## Core resources * Scan lifecycle: * Start scan: `POST /scan` (or `GET /scan`) with optional `mode` (`full` or `discovery`) * Status: `GET /status/{scan_uuid}` * Results JSON: `GET /results/{scan_uuid}` * Raw JSON artifact: `GET /json/{scan_uuid}` * Report: `GET /report/{scan_uuid}` * Logs: `GET /logs/{scan_uuid}` * Stop scan: `POST /scan/{scan_uuid}/stop` * Fleet management: * List scans: `GET /scans` * Stats: `GET /stats` # Quickstart Source: https://docs.techslayers.ca/senthrex/quickstart Start a Senthrex scan, monitor progress, and retrieve reports and JSON results. # Quickstart This guide shows the standard Senthrex workflow using the bearer token and the scan UUID returned from `/scan`. ## 1) Set your bearer token ```bash theme={null} export SENTHREX_TOKEN="YOUR_BEARER_TOKEN" ``` ## 2) Start a scan (recommended: POST) ```bash theme={null} curl -X POST "https://rts-senthrex.slayers.tech/scan" \ -H "Authorization: Bearer $SENTHREX_TOKEN" \ -H "Content-Type: application/x-www-form-urlencoded" \ --data-urlencode "domain=example.com" \ --data-urlencode "mode=full" ``` `mode` is optional and defaults to `full`. Use `discovery` for a lighter scan profile. The response includes a `uuid` (scan UUID). Use it as `scan_uuid` in all follow-up requests. ## 3) Check scan status ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/status/YOUR_SCAN_UUID" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` ## 4) Retrieve outputs ### Structured results ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/results/YOUR_SCAN_UUID" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` ### Logs ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/logs/YOUR_SCAN_UUID" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` ### Report archive ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/report/YOUR_SCAN_UUID" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` ### Raw JSON artifact ```bash theme={null} curl -X GET "https://rts-senthrex.slayers.tech/json/YOUR_SCAN_UUID" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` ## 5) Stop a running scan (optional) ```bash theme={null} curl -X POST "https://rts-senthrex.slayers.tech/scan/YOUR_SCAN_UUID/stop" \ -H "Authorization: Bearer $SENTHREX_TOKEN" ``` ## Next steps * `/senthrex/api/start-scan-post` * `/senthrex/api/get-status` * `/senthrex/api/get-results` * `/senthrex/api/get-scan-json` * `/senthrex/api/list-scans`