Connect · Guide
File state sales tax returns with your agent
Your agent files on the state portal under a license the business approved. It never sees the login or the authenticator code, it stops before Submit until someone says yes, and the receipt is the state's own confirmation number.
1 The business gives you your own login
Never ask a business for its password. Every portal below lets the business add a separate login for a preparer. That login is yours, it can be removed by the business at any time, and it shows up in the portal's own records as you.
| Portal | Resource id | How the business adds you | Second factor |
|---|---|---|---|
| Washington My DOR | res_wa_mydor | Adds your SAW user under Manage access, with rights to prepare and file excise tax returns. | Authenticator app |
| Ohio Business Gateway | res_oh_gateway | Adds your own OH|ID to its Gateway account with the Filer role. | Authenticator app |
| MyTax Illinois | res_il_mytax | Grants your MyTax Illinois logon third-party access to its sales tax account. | Checked in the pilot |
These three portals are in pilot. Their login pages were checked on October 8, 2026, with no CAPTCHA on any of them. Filing pages are verified with a builder's real delegate login before a portal opens to everyone. GET /v1/resources shows the current status. Want to run one? Write to hello@computeruse.si.
2 Store the login once
Send the login and, when the portal uses an authenticator app, its setup secret (the text behind the QR code). We seal both with AWS KMS the moment they arrive. Nobody can read them back, including you. We compute each authenticator code inside the browser at the moment the portal asks.
curl -s https://computeruse.si/api/v1/connections \
-H "authorization: Bearer $COMPUTERUSE_API_KEY" \
-H "content-type: application/json" \
-d '{"ownerRef": "acme-widgets", "resource": "res_wa_mydor",
"username": "...", "password": "...", "totpSecret": "..."}'
# -> 201 { "id": "conn_...", "ownerId": "own_...", "hasAuthenticator": true }
ownerRef is your own id for the business. Everything else you do for that business uses the same ownerRef.
3 Ask the business to approve the limits
Ask for exactly what the agent needs. We give you a link to send to the business. They open it on computeruse.si, read the limits in plain words, and approve or decline.
curl -s https://computeruse.si/api/v1/license-requests \
-H "authorization: Bearer $COMPUTERUSE_API_KEY" \
-H "content-type: application/json" \
-d '{"ownerRef": "acme-widgets", "resource": "res_wa_mydor",
"operations": ["file_return"],
"limits": {"maxAmountMinor": 300000, "period": "month",
"blockedActions": ["change bank account"]},
"decisionPoints": ["before_submit"], "validDays": 90}'
# -> 201 { "id": "lr_...", "approvalUrl": "https://computeruse.si/approve/...", "expiresAt": "..." }
The link works for 72 hours. When the business decides, your webhook gets license.approved or license.declined. Then read the signed license:
curl -s https://computeruse.si/api/v1/license-requests/lr_... \
-H "authorization: Bearer $COMPUTERUSE_API_KEY"
# -> { "status": "approved", "ownerId": "own_...", "signedLicense": { ... } }
4 Run the filing
Open a session with the signed license and the task. Use our agent, or pass agentUrl and your own agent drives step by step (step mode). Either way every step is checked against the license, and the agent never sees the login.
curl -s https://computeruse.si/api/v1/sessions \
-H "authorization: Bearer $COMPUTERUSE_API_KEY" \
-H "content-type: application/json" \
-H "idempotency-key: acme-2026-q3" \
-d '{"signedLicense": { ... }, "task": "File the Q3 2026 sales tax return.",
"agentUrl": "https://agent.example.com/computeruse"}'
5 Say yes before it submits
With before_submit, the session stops on the step that files and pays. It reads the real total from the portal's page and waits. Your webhook gets session.awaiting_approval with the button label and the amount. Show it to whoever signs off, then:
curl -s https://computeruse.si/api/v1/sessions/SESSION_ID/approval \
-H "authorization: Bearer $COMPUTERUSE_API_KEY" \
-H "content-type: application/json" \
-d '{"decision": "approve"}'
No answer within 4 minutes counts as decline, and nothing is filed. Ask again with a new session.
6 Keep the receipt
When the portal confirms, the receipt carries the state's confirmation number, the amount the page showed, a hash of the confirmation page, and every step the license blocked. Your webhook gets session.finished. A session that ends outcome_unknown submitted something but saw no confirmation: check the account, never retry it blindly.
7 Try the whole flow today
Demo Revenue is our test state portal. It has a delegate login with an authenticator code, a messages page with a planted instruction, a payment settings page the license blocks, and a four-step return. Run it with a sandbox key:
curl -s https://computeruse.si/api/v1/sandbox/licenses \
-H "authorization: Bearer $COMPUTERUSE_API_KEY" \
-H "content-type: application/json" \
-d '{"resource": "res_demo_revenue", "maxAmountMinor": 300000,
"decisionPoints": ["before_submit"]}' > license.json
Then open a session as in step 4 with the task "File the July to September 2026 sales tax return. Gross sales were $25,400 and deductions were $1,400." To see step mode, set agentUrl to our sample agent at https://computeruse.si/demo/agent/revenue. License requests also work on Demo Revenue with an ownerRef that starts with test, so you can open the approval page yourself.
Docs: Quickstart · State tax portals · API reference · Security