--- title: 2FA Support (TOTP) subtitle: How to send 2FA codes (TOTP) to Skyvern slug: credentials/totp --- Skyvern supports one-time password (see https://www.twilio.com/docs/glossary/totp for more information), also known as 2FA/MFA. For Skyvern to get the code, there are three options: - [Option 1: Store your 2FA/MFA secret in Skyvern Credential tool](#option-1-store-your-2famfa-secret-in-the-skyvern-credential-tool) - [Option 2: Skyvern gets the code from your endpoint](#option-2-get-code-from-your-endpoint) - [Option 3: You push the code to Skyvern](#option-3-push-code-to-skyvern) ## Option 1: Store your 2FA/MFA secret in the Skyvern Credential tool Save your username and password in [Skyvern Credential](https://app.skyvern.com/credentials) where you can also store your 2FA/MFA key/secret. See [Password Management](/credentials/passwords#manage-passwords-in-skyvern-cloud) for more details. ## Option 2: Get Code From Your Endpoint You can pass `totp_url` when running [a task](/api-reference/api-reference/agent/run-task) or a [workflow](/api-reference/api-reference/agent/run-workflow). Inside this endpoint hosted by you, you have to conform to the following schema: ### Set Up Your TOTP Endpoint For websites that require a verification code to complete a task, you have to set up a TOTP endpoint for Skyvern to fetch the verification code. Here's the TOTP endpoint contract you should use: Request (POST): | Parameter | Type | Required? | Sample Value | Description | | --- | --- | --- | --- | --- | | task_id | String | yes | tsk_123 | The task ID that needs the verification to be done | Response: | Parameter | Type | Required? | Sample Value | Description | | --- | --- | --- | --- | --- | | task_id | String | yes | tsk_123 | The task ID that needs the verification to be done | | verification_code | String | no | 123456 | The verification code | ### Validate The Sender of The Request Same as the webhook API, your server needs to make sure it’s Skyvern that’s making the request. - a python example for how to generate and validate the signature: ```python def validate_skyvern_request_headers(request: Request) -> bool: header_skyvern_signature = request.headers["x-skyvern-signature"] payload = request.body() # this is a bytes hash_obj = hmac.new(SKYVERN_API_KEY.encode("utf-8"), msg=payload, digestmod=hashlib.sha256) client_generated_signature = hash_obj.hexdigest() return header_skyvern_signature == client_generated_signature ``` SKYVERN_API_KEY: you can get the API KEY from [Skyvern Settings](https://app.skyvern.com/settings). ## Option 3: Push Code To Skyvern Find TOTP API doc [here](/api-reference/api-reference/credentials/send-totp-code). You can pass `totp_identifier` when running [a task](/api-reference/api-reference/agent/run-task) or a [workflow](/api-reference/api-reference/agent/run-workflow). When the TOTP code arrives at your inbox, all you need to do is to send the email/message (Gmail + Zapier integration can be a good solution to set up email forwarding) to Skyvern's TOTP endpoint. ### Forwarding Your Email To Skyvern (Gmail + Zapier) This setup requires a Zapier Pro plan account. **Step 1. Create a Zapier Zap** Go to https://zapier.com/app/home and create new Zaps