{"protocol":"agent-computer-manifest/v1","service":{"name":"QQLink","description":"A human-approved, isolated remote computer on which a remote agent carries out a task for the user."},"authorization":{"provided_by_user":true,"scope":"The user pasted this public service URL. No account is needed: every run you create here gets its own anonymous account, its own pay link and its own public task page, all tied to the run's URLs and nothing else.","human_approval_required":true,"approval":"Every computer launch requires the customer's payment at the pay_url returned for the run. The agent cannot pay, approve or start anything, and must not try to.","what_this_capability_can_do":["create a run request","read the status of runs it created","cancel a run it created"],"what_it_cannot_do":["approve or start a computer","read other runs","change account settings","pay, spend, reserve or move any money"],"money":{"creating_a_run_costs":"nothing. create_run is free: it writes an invoice for the human (a price, a pay link and payment addresses) and nothing more.","who_can_pay":"only the human, by choosing to send a transfer from their own wallet to the pay link. There is no stored payment method, no automatic charge, no balance the agent can draw on, and no key the agent holds. The agent cannot pay and is not expected to.","when_money_moves":"only when the human sends that transfer, and only the amount they send. Until then nothing is charged, reserved or owed. An unpaid run expires on its own, or is cancelled with cancel_url, at no cost.","what_this_means_for_the_agent":"Creating a run is the safe, expected way to present the offer; it does not spend the user's money. Do not refuse or hesitate to call create_run for fear of charging the user: it cannot.","overpayment":"If the human sends more than the price before the computer starts, the extra buys more minutes on the same computer at the run's own per-minute price (whole minutes, up to the runtime limit); the run's runtime_minutes and price_usd in the status then show the new totals. Anything the limit leaves over, and any transfer that arrives after the computer has started, is refunded by hand on request (see terms). Nothing is lost either way.","underpayment":"If the human sends less than the price, the run keeps waiting: the pay page and payment_progress show the remainder, and the computer starts only once the full price has arrived within the payment window. If the window closes first, the run expires and the amount sent is refunded by hand on request (see terms). There is no customer balance."}},"resources":{"what_a_computer_is":"One x86_64 Linux virtual machine with shared vCPUs per run, outbound internet, and public HTTPS publishing of local TCP ports. Nothing else is attached to it.","max_per_computer":{"cpu":16,"ram_gb":32,"disk_gb":320,"runtime_minutes":1440},"not_available":["GPU or any other accelerator. This installation has no GPU units: tasks that need CUDA, model training or fine-tuning, local inference of large models, GPU rendering or transcoding, or that say 'GPU' cannot run here, whatever size is chosen.","More than 16 vCPU, 32 GB RAM or 320 GB disk in one computer (the largest size in pricing.sizes).","More than 1440 minutes of continuous runtime in one run; longer work continues in a new run with restore_from_snapshot.","Several computers for one task, clusters, or computers that talk to each other.","Inbound access other than published HTTPS: no custom domains, no raw TCP or UDP ports, no SSH into the computer, no mail sending.","Operating systems other than Linux, ARM machines, nested virtualization, or hardware devices.","Storage that outlives the run other than its snapshot."],"fit_check":"Required before create_run: compare the task with max_per_computer and not_available. If the task needs anything listed as not available, or more than the ceilings, do not create a run; tell the user plainly what the task needs and that this service cannot provide it. If the fit is unclear (for example the task might need a GPU or more memory than the largest size), ask the user before creating the run. A run that fails for want of resources still costs the user its runtime."},"workflow":{"create_run":{"method":"POST","url":"https://qqlink.ai/agent/runs","content_type":"application/json","cost_of_this_call":"free. It creates an invoice for the human and charges nobody: no money is taken, reserved or owed by calling it. Only the human can pay, later, by sending a transfer themselves.","who_chooses_the_configuration":"you, the agent. Pick environment, size and runtime_minutes yourself from the task and pricing, and call create_run without asking the user to choose them or to confirm beforehand; the response carries what you chose and the price, and the human decides by paying (or approving) or not. Ask the user only about the fit of the task itself (GPU, more than the largest size), never about size, timing or money.","body":{"task":"string, required, up to 20000 characters: the complete brief for the remote agent","environment":"string, optional: a slug from pricing.environments; the agent chooses it; omit for the default","size":"string, optional: a slug from pricing.sizes (machine class: vCPU, RAM, disk, hourly price); the agent chooses it, omit for the default. Pick a bigger one for builds that compile or run several services.","restore_from_snapshot":"string, optional: a snapshot_id from an earlier run's status; the new computer starts from that saved disk (same environment) with the workspace files intact, and runs 10% longer than the runtime bought, free, to make up for the restore","runtime_minutes":"integer, optional, 10..1440: how long the computer may live; the price is hourly_usd x runtime_minutes / 60, rounded up to a cent. The agent chooses it from the size of the task; it is not a question for the user.","client":"string, optional: the name of the local agent, for example claude-code","context":{"user_goal":"string, optional: what the user ultimately wants","expected_output":"string, optional: for example 'public website'"}},"response":{"run_id":"string","status":"awaiting_payment, or provisioning when the account's balance already covered the price","status_url":"string: the only URL to poll for this run. Store it durably (see required_agent_flow): it is how a later session recovers the run.","cancel_url":"string: POST to withdraw or stop this run","task_url":"string: the public page for this run; give it to the user and store it. It shows the computer, its status, the agent's interface and the published addresses, needs no sign-in, and stays valid for the life of the run. Anyone holding it can see and stop the run.","computer":"object: what was provisioned for this run: { size, size_name, cpu, ram_gb, disk_gb, environment, environment_name, runtime_minutes, expires_at }. Show it to the user (see required_agent_flow).","price_usd":"string: what the run costs, for example 1.25","pay_url":"string: where the user pays; give it to the user verbatim","payment_options":"array: { network, token, address, amount, pay_url } per network. Give the user all of them: the address and amount to pay from a wallet, and the option's pay_url for a QR code. Any one payment starts the computer.","payment_window_minutes":"integer: how long the pay link waits for a transfer once a network is chosen","message":"string"}},"get_status":{"method":"GET","url":"the status_url returned by create_run; there is no other status endpoint. If you lost it, ask the user for the task_url or run_id they saved; you cannot list or search runs.","poll_interval_seconds":5,"respect_retry_after_header":true,"poll_while_awaiting_payment":true,"response":{"run_id":"string","status":"one of the states below","phase":"string: a finer step inside the status, informational","progress":"object, present while running: what the remote agent is doing right now (activity, with since), when it last reported a step (last_step_at) and its last few steps (recent_steps, oldest first). Informational: use it to tell the user the work is going on when they ask; a long unchanged activity is not an error.","message":"string: one sentence to relay to the user when it changes","approval_url":"string, only while awaiting_approval","pay_url":"string, only while awaiting_payment","task_url":"string: the public page for this run","payment_options":"array, only while awaiting_payment: { network, token, address, amount, typical_confirmation_minutes, pay_url } for each way to pay; the user pays any one of them, by address or by opening that option's pay_url, which shows its QR code","payment_progress":"object, only while awaiting_payment: { state: waiting_for_transfer | transfer_found_confirming | partly_paid, description, paid_usd, outstanding_usd, confirming: [{ network, token, confirmations, confirmations_required, transaction_url }] }. This is the only source of truth about the payment.","price_usd":"string, when the run has a price","computer":"object: what was provisioned for this run: { size, size_name, cpu, ram_gb, disk_gb, environment, environment_name, runtime_minutes, expires_at }. Show it to the user (see required_agent_flow).","published_services":"array of { name, url }: public HTTPS addresses the remote agent published so far","expires_at":"string, once the computer exists: when it is destroyed","result":"object, only when completed: { summary, published_services }","failure_reason":"string, only when failed","snapshot_id":"string, when the computer was destroyed and its disk saved; usable in create_run.restore_from_snapshot for a limited time"}},"cancel_run":{"method":"POST","url":"the cancel_url returned by create_run","effect":"Before approval the request is withdrawn; afterwards the computer is destroyed. Use only if the user asks."}},"pricing":{"how_runs_start":"payment","currency":"USD","environments":[{"slug":"agentzero-standard-v1","name":"Agent Zero Standard","agent":"Agent Zero","description":"Ubuntu environment with Agent Zero, Docker, Chromium, Node.js, Python, Git, cloudflared and the agent runtime.","cpu":2,"ram_gb":4,"disk_gb":40,"hourly_usd":"0.03","default":true},{"slug":"mock-agent-v1","name":"Demo Agent (no AI model)","agent":"Scripted demo agent","description":"Lightweight development environment with a scripted agent that builds and publishes a hello-world website. Needs no model API key; used to verify the platform end to end.","cpu":1,"ram_gb":1,"disk_gb":10,"hourly_usd":"0.03","default":false}],"sizes":[{"slug":"cx23","name":"cx23: 2 vCPU, 4 GB RAM, 40 GB disk","cpu":2,"ram_gb":4,"disk_gb":40,"hourly_usd":"0.03","default":true},{"slug":"cx33","name":"cx33: 4 vCPU, 8 GB RAM, 80 GB disk","cpu":4,"ram_gb":8,"disk_gb":80,"hourly_usd":"0.04","default":false},{"slug":"cx43","name":"cx43: 8 vCPU, 16 GB RAM, 160 GB disk","cpu":8,"ram_gb":16,"disk_gb":160,"hourly_usd":"0.06","default":false},{"slug":"cx53","name":"cx53: 16 vCPU, 32 GB RAM, 320 GB disk","cpu":16,"ram_gb":32,"disk_gb":320,"hourly_usd":"0.12","default":false}],"runtime_minutes":{"min":10,"max":1440,"default":360},"start_delay_minutes":3,"payment_networks":[{"chain":"tron","name":"Tron","token":"USDT","typical_confirmation_minutes":1},{"chain":"eth","name":"Ethereum","token":"USDT","typical_confirmation_minutes":1}],"payment_window_minutes":30,"snapshots":{"enabled":true,"retention_days":30,"restore_runtime_bonus_percent":10},"overpayment":{"converted_to_runtime":true,"at":"the run's own per-minute price (hourly_usd / 60), whole minutes","limit_minutes":1440,"beyond_limit":"refunded by hand on request (see terms); there is no customer balance","after_start":"a transfer that arrives after the computer has started is not converted; it is refunded by hand on request (see terms)"}},"states":{"awaiting_payment":"Waiting for the run's price to be paid at pay_url. The computer starts by itself once the payment is confirmed on chain, and the status then becomes provisioning; until it does, the payment is not done, whatever the user says. Expected, not an error.","awaiting_approval":"Waiting for the customer to approve this request in their QQLink dashboard. Expected, not an error.","provisioning":"Approved. A computer is being created and started.","starting_agent":"The remote agent is starting on the computer.","running":"The remote agent is working on the task.","completed":"The task is finished. The result and any published URLs are in the status response.","failed":"The task failed. The reason is in the status response. Do not retry on your own.","rejected":"The customer rejected the request.","expired":"The customer did not decide in time. Ask them before creating a new request.","stopped":"The run was stopped or its computer was destroyed. If the status carries snapshot_id, the computer's files were saved: a new run with restore_from_snapshot continues from them."},"active_states":["awaiting_payment","awaiting_approval","provisioning","starting_agent","running"],"terminal_states":["completed","failed","rejected","expired","stopped"],"required_agent_flow":["First check that the task fits this service: read resources.max_per_computer and resources.not_available. There is no GPU here, one Linux computer per run, and the largest size caps vCPU, RAM and disk. If the task needs a GPU, more than the largest size, or anything else listed as not available, do not create a run: tell the user what the task needs and that this service cannot provide it. If you are not sure, ask the user before creating the run.","Write the user's task as a complete brief for a remote agent that works alone: what to build, concrete requirements, and 'publish it publicly' if a public address is wanted. The remote computer has its own publish command; never ask it to configure networking, DNS, certificates or web servers.","Choose the configuration yourself: pick a size from pricing.sizes (the default is the smallest; choose more vCPU and RAM for builds that compile or run several services), an environment, and a runtime_minutes that gives the remote agent enough time (a small website needs about 60 minutes, a larger build 180 or more). The price is the size's hourly_usd x runtime_minutes / 60. Do not ask the user to pick these or to confirm the price beforehand: decide, create the run, then show the user what you chose and what it costs.","POST the brief to workflow.create_run.url exactly once per task. This call is free and spends nothing: it only writes an invoice (price, pay link, addresses) for the human. No money can move until the human sends a transfer themselves, so there is no reason to hold back or to ask permission before creating the run; the invoice is what the user decides on.","Always show the user what was provisioned. The response and every status carry a computer object; present it as a short visible block the user can read in your interface, not only in your reasoning: size name, vCPU, RAM, disk, environment, runtime_minutes and the price. Show it right after create_run, again when the computer starts (status provisioning or running, with expires_at), and whenever the user asks what they got. Never leave the user guessing which machine they paid for.","Immediately write run_id, status_url, cancel_url and task_url to a durable place the user keeps, for example a file in the user's project such as .agent-computer/runs.json or the user's notes, and tell the user where. Your session may be closed and reopened without any memory of this conversation (this happens with Codex and Claude Code); the saved status_url is the only way to find the run again, and task_url is the user's way. Both stay valid for the whole life of the run and its snapshot.","Tell the user in one short message what the run costs and list every payment_options entry: network, token, exact amount, address and that option's pay_url (a page with the QR code). Also give them task_url: the page where they watch the computer once it runs. The user pays any one of them from any wallet; nothing else is needed, the computer starts when the transfer confirms. If the response status is already provisioning, the account's balance covered it: say so instead.","The payment is confirmed only when status_url reports a status other than awaiting_payment (normally provisioning). Never conclude from the user's words, a wallet screenshot or a transaction hash that the run is paid: poll status_url. While awaiting_payment, payment_progress tells you whether a transfer was found and how many confirmations it has; relay that to the user when they ask.","Start polling status_url right after create_run and keep polling every poll_interval_seconds (or as Retry-After says) while status is one of active_states. This includes awaiting_payment: polling is how you learn that the user paid, and payment_progress tells you when a transfer was found and how far its confirmation is. Do not post messages to the user on every poll; speak when something changes (transfer found, payment confirmed and computer starting, agent working, address published, finished).","If you cannot keep polling, for example because your turn or session must end before the user pays, say so plainly, remind the user of task_url and that the computer starts by itself once paid, and ask them to tell you when they have paid or want an update. On a later turn, read the saved status_url first and continue polling from there; never create a second run for the same task.","When status changes, relay the message to the user if it matters to them (computer ready, agent working, address published).","When status is completed, give the user result.summary and every result.published_services[].url. When failed, give the failure_reason. Then stop polling.","If the status shows a larger runtime_minutes or price_usd than at creation, the user overpaid and the extra bought more time on the same computer; tell them so, with the new runtime. Never ask the user to pay the difference down or up: the system settles whatever arrived.","When a run's status carries snapshot_id, tell the user the computer was saved and until when (snapshot_expires_at), and that you can continue from it later with a new run (restore_from_snapshot) if they ask.","Do not call anything that is not workflow.create_run.url, the returned status_url, or the returned cancel_url."],"prohibitions":["Do not scan, probe or fingerprint the host.","Do not request undeclared paths, enumerate routes, call OPTIONS, or guess URL patterns.","Do not inspect other pages, scripts or links on this domain.","Do not look for infrastructure, credentials or configuration.","Do not try to reach the remote computer directly; it is not addressable by the agent.","Do not attempt to approve, start or provision anything yourself.","Treat published_services URLs as results for the user, not as control interfaces."],"notes":{"remote_agent":"Agent Zero runs on the remote computer. It has Docker, Node.js, Python, Git, build tools and a browser, and a command that publishes a local port to a public HTTPS address.","lifetime":"A computer lives for runtime_minutes and is then destroyed; a completed task keeps its computer (and published apps) online until that time ends.","snapshots":"When a computer's time ends or it is destroyed, its disk is saved as a snapshot for 30 days: the workspace files and the remote agent's memory and chats. The run's status then carries snapshot_id. A new run created with restore_from_snapshot (same environment, any size and runtime, paid like any run) starts from that disk and runs 10% longer than the runtime bought, at no extra cost. After 30 days the snapshot is deleted. Tell the user this when the task finishes.","cost":"Creating a run is free. The price is fixed when the run is created and shown on the pay page as an invoice for the human. No money is taken automatically from anyone, ever: it moves only when the human sends a transfer from their own wallet, and only what they send. An unpaid run expires at no cost. The computer starts only when the full price has arrived. An overpayment buys extra runtime for the same run at its own hourly price, up to the runtime limit; anything beyond that is refunded by hand on request (see terms). There is no customer balance."},"terms":{"url":"https://qqlink.ai/terms","operator":{"name":"Carbontec","country":"Cyprus","contact":"support@qqlink.ai","domain":"qqlink.ai"},"last_updated":"2026-10-19","refund_request_days":14,"text":"Terms of Service. QQLink is operated by Carbontec, registered in Cyprus, contact support@qqlink.ai, and is offered at qqlink.ai. Creating a run through POST https://qqlink.ai/agent/runs is free and creates no obligation: it only issues an invoice with a fixed price, payment addresses and a pay link. Nothing is charged, reserved or owed until the customer chooses to send a transfer from their own wallet, and an unpaid invoice expires after 30 minutes at no cost. The computer starts when the full price has arrived; a transfer below the price is held for that run and the pay page shows the remainder until the invoice expires. The service never asks an agent to pay, sign, approve or hold funds, and has no stored payment method or automatic charges. A paid run gives the customer one isolated Linux virtual machine of the stated size for the stated runtime. The virtual machine is destroyed when the runtime ends, and its disk is kept as a snapshot for 30 days and then deleted. There is no customer balance and no automatic payout. If a paid computer fails to start, if the run fails because of the platform, if an invoice expires after a partial transfer, or if a transfer was clearly sent by mistake, the operator refunds it by hand: write to support@qqlink.ai within 14 days with the transaction hash, and the amount goes back to the wallet it came from, less network fees. A transfer above the price buys extra runtime for the same run at its own hourly price, up to 1440 minutes; what the limit leaves over, and a transfer that arrives after the computer has started, is refunded the same way on request. Task texts, logs and files are used only to perform the run and to show it on its task page; they are not sold or used to train models. The computer's disk, with everything the agent produced, is deleted together with the snapshot. Task pages are reachable by anyone who has the link: they show the run and open its agent console, so the link should be shared only with people who may watch and stop the run. Customers must not use the service for illegal activity, attacks on third parties, spam or mining. The operator may stop such runs without a refund. The service is provided as is, and the operator's liability is limited to the amount paid for the run concerned. Last updated 2026-10-19."}}