# DeviceCheck Run one website flow in Safari on a physical iPhone. Receive the original MP4 recording, step screenshots, device identity, assertions and file hashes. No AWS or browser-provider account required. Device: Apple iPhone 16, iOS 18.6.2, Safari. Price: **5.00 USDC.e for a completed result**, paid through MPP on Tempo mainnet. A failed assertion is a completed result. Infrastructure failures and incomplete evidence are not billed. This is a bounded beta, with one job at a time and limited capacity. Check /health before submitting. Allow about 10–20 minutes for execution and provider cleanup; this is an estimate, not a delivery guarantee. If the job cannot complete, its status is inconclusive and no payment is due. Admission can pause when capacity or provider trial funding is exhausted. ## Agent recipe 1. POST /v1/jobs with Content-Type: application/json, a private random Idempotency-Key (32–128 letters, digits, _ or -), and the JSON below. The 202 response contains job_id and access_token. Store both. Retry an uncertain submission with the same key and identical plan; it never creates a second reservation. 2. GET /v1/jobs/{job_id} every 20 seconds. Include X-Job-Token: {access_token}. Wait for ready or inconclusive. 3. When ready, GET /v1/jobs/{job_id}/result with X-Job-Token. The first request returns an MPP 402 Challenge for 5.00 USDC.e. Use an MPP client to pay and retry with the Payment Credential in Authorization, keeping X-Job-Token. The successful response contains the report, artifact URLs and Payment-Receipt. 4. Download each artifact URL with the same X-Job-Token. Further report/artifact requests are included. An exact payment retry does not purchase a second job. Never initiate a second payment after an uncertain response; retry the same Credential. Example submission: ```json { "authorized": true, "synthetic_data_only": true, "plan": { "version": 1, "url": "https://example.com/", "goal": "Verify that the Example Domain heading is visible in Safari on a physical iPhone.", "steps": [ { "action": "assert_visible", "selector": "h1" }, { "action": "assert_text", "selector": "h1", "text": "Example Domain" } ] } } ``` Use your own public staging flow in place of the synthetic example. Your agent supplies selectors and expected text; DeviceCheck handles the physical device, Safari session and evidence collection. ## Scope One public HTTPS origin, up to 12 steps, and up to 120 seconds of test execution. At least one assertion is required. Actions: tap (CSS selector; element click), fill (selector and synthetic text), scroll (pixels between -1500 and 1500), wait (1–5 seconds), assert_visible (selector), assert_text (selector and expected substring). Execution stops at the first failed assertion or command error. Cross-origin navigation is unsupported. Only submit flows you are authorized to test. Use public staging/demo sites and synthetic data. Do not submit credentials, personal or confidential information, purchases, messages, destructive actions, native apps or private-network targets. We do not accept arbitrary scripts. Results cover only the supplied assertions; they do not certify visual correctness, accessibility, every touch gesture, other devices or overall website quality. No human review, bug diagnosis or repair is included. Device identity is reported by AWS Device Farm; no raw AWS session or credential is sold. ## Payment and retention Submission and status are free and do not provide the completed evidence. Pay only when a complete report and recording exist and the provider session has terminated. A result with assertion_failed is billable. An inconclusive result is not billable. Keep access_token and Idempotency-Key private: they grant access to your job. Reports and files expire 48 hours after submission; payment closes 15 minutes before expiry. Download and retain your evidence within that period. Evidence is stored privately in Cloudflare; the public target is processed on AWS Device Farm. Deletion from our storage occurs within one hour of expiry; AWS retention is governed separately by its service. Minimal payment accounting is retained. Recordings may include device setup and cleanup. MPP method: tempo.charge; chain ID 4217; currency 0x20c000000000000000000000b9537d11c60e8b50 (USDC.e, 6 decimals); amount 5000000 base units. MPP Credits are not advertised as supported. The runtime 402 Challenge is authoritative. There is no subscription or automatic top-up. ## Responses 202: accepted or still processing. 200: status, paid report or artifact. 400/413/415: invalid input. 402: payment for a ready result. 403: pay for the report before downloading artifacts. 404: unknown job or invalid token. 409: idempotency mismatch or payment already in progress. 410: expired. 422: inconclusive, no payment due. 429/503: capacity or service unavailable; no new job accepted unless the same key returns an existing job. Do not pay while a job is pending or inconclusive. ## References and synthetic samples - OpenAPI: https://devicecheck-mpp.dave-baa.workers.dev/openapi.json - Health/capacity: https://devicecheck-mpp.dave-baa.workers.dev/health - Machine-readable example: https://devicecheck-mpp.dave-baa.workers.dev/example.json - Five-second synthetic form demonstration: https://devicecheck-mpp.dave-baa.workers.dev/samples/demo.mp4 - Reviewed positive control packet: https://devicecheck-mpp.dave-baa.workers.dev/samples/positive.zip - Reviewed deliberate-failure control packet: https://devicecheck-mpp.dave-baa.workers.dev/samples/negative.zip - Operator: Dave Kiss (https://devicecheck-mpp.dave-baa.workers.dev/provider) Samples are synthetic controls, not customer results. They were produced and reviewed before the hosted API; current jobs use automated evidence validation.