Authenticated APIs are started from the Parse dashboard (check “This site needs a login” on the New API form) or programmatically over the API and MCP by setting
allow_auth: true — after a one-time disclaimer acceptance in the dashboard. Free accounts cannot create authenticated APIs; paid plans include 5 or 10 logged-in accounts per site, and the limit can be raised on request.Security overview
Parse signs in the same way you would, so the endpoints it builds see exactly the data and permissions of the account you connect. We recommend using a test account for initial builds where the site offers one. Parse is designed to ask for your permission before taking destructive actions, but building is an agentic process — an agent operates a real browser session on your account while it constructs endpoints — so we recommend still exercising caution, especially with accounts that can move money, place orders, or message other people. Credentials you provide are treated as secrets end to end:- A fresh keypair per build. Every build generates its own ephemeral RSA-4096 keypair. The public key is handed to your browser; the private key exists only for that build.
- Encrypted before they leave your browser. Credentials are encrypted client-side with that build’s public key, so only that one build can read them.
- Decrypted only in memory. The worker running your build decrypts them in memory to drive the login. They are never written to disk and never written to logs, and the private key is wiped from memory when the build finishes.
- Network logs suppressed. Parse normally records the network requests behind a build for debugging. For authenticated builds that capture is turned off, so credentials in flight are never recorded.
- Generated code is scanned before publish. Every authenticated build’s final code goes through an automated check — an LLM review plus pattern matching — that rejects code with hardcoded credentials. Your login is supplied at call time, not baked into the scraper.
- Never shared publicly. Authenticated APIs are never contributed to the public marketplace. They stay private to your account.
- Login attempts are rate-limited. Login endpoints are capped at 3 attempts per hour, counted per site per account.
Parse is currently undergoing a SOC 2 audit. The audit is in progress — we’re happy to share status with customers who need it; reach out from the dashboard.
How many accounts you can connect
A session is one account you’re logged into for a given site. The cap is counted per site, so being logged into two accounts on the same site uses two of them, while one account each on two different sites uses one apiece.Need more accounts on a site than your plan includes? Reach out to support with your use case, the website, and your expected needs — limits can be raised per account. We’ll need proof that you are authorized to control the accounts you use with Parse.
During the build: interactive prompts
Building against a login is a conversation. Rather than guessing, the agent pauses and asks you — in the dashboard, while the build is running:
If a prompt goes unanswered past its window it expires and the build parks — it stops where it is instead of guessing. Everything verified up to that point is kept (see below).
The dashboard is the easiest place to answer build-time prompts. A build started over the API pauses at
status=needs_input; the simplest path is to open the build page and answer there, but you can also answer over the API. Never send build-time credentials through MCP chat — an MCP client hands you the build page URL instead. (Calling a finished API’s login endpoint with credentials over HTTP is a separate thing, and is covered below.)Answering prompts over the API
While a build waits atstatus=needs_input, GET /dispatch/tasks/{task_id} returns the prompt on user_input_prompt: a request_id, the list of fields to fill, and a public_key_pem — a fresh RSA-4096 public key that exists only for this build. Responses are encrypted client-side against that key, exactly like the dashboard does:
- Build the plaintext JSON object:
- Generate a random 256-bit AES key and 12-byte IV, and encrypt the plaintext with AES-256-GCM (no additional authenticated data).
- Wrap the AES key with the prompt’s public key using RSA-OAEP (SHA-256 hash, MGF1-SHA256, no label).
- Submit the envelope — exactly these three keys, each base64-encoded:
Endpoints are saved as they go
Endpoints are saved incrementally, as each one is verified — not in one batch at the end. Practically:- A build that fails partway through keeps the endpoints that already worked. You don’t lose the successful half of a build to a failure in the last step.
- The same applies to a parked build waiting on a prompt that expired.
- From there you continue or revise the API rather than starting over from scratch.
Incremental saving applies to new builds. Revisions to an existing API still apply their changes at completion.
Endpoint session tags
Each endpoint in an authenticated API has a session tag:Step 1: Call the login endpoint
Step 2: Call protected endpoints
Pass the session credentials via headers (preferred) or request body:Full example
Session details
- One session per user per scraper: Logging in again with the same user upserts the existing session.
- Proxy binding: The proxy IP used during login is reused for all protected endpoints to prevent session invalidation from IP changes.
- Session updates are transparent: After each protected call, the session state is re-encrypted and saved automatically.
- Rate limiting: Login endpoints enforce a rate limit of 3 login attempts per hour, counted per site per account — not per scraper. Several APIs built from the same site share one budget.
Error responses
Security
At call time:- Fernet session encryption: Session state is encrypted with your
encryption_keybefore storage. Parse stores only ciphertext — without your key, the data is unreadable. - HMAC replay protection: Serialized session blobs are signed with a 30-minute TTL.
- No plaintext credential storage: Credentials provided during API creation are encrypted end-to-end and never stored in plaintext.