Skip to content

Teller

PropertyValue
AlgorithmHMAC-SHA256
HeaderTeller-Signature
Formatt=signature_timestamp,v1=signature
Timestamp tolerance180 seconds (3 minutes)

Signing formula:

HMAC-SHA256("signature_timestamp.body", signing_secret)

Transyt parses the Teller-Signature header, extracts the t (timestamp) and v1 (signature) values, then computes the expected signature using the stored signing secret. The timestamp is validated to be within 3 minutes of the current time to prevent replay attacks.

During secret rotation, Teller signs events with all non-expired secrets. The header may contain multiple v1 values:

Teller-Signature: t=signature_timestamp,v1=signature_with_new_secret,v1=signature_with_old_secret

Transyt validates against each v1 signature and accepts the event if any one matches.

  1. Go to Application Settings in the Teller Dashboard
  2. Register a new webhook URL:
    https://ingest.transyt.com/teller/{your-account-slug}
  3. Copy the Signing secret from the Application Settings page
  4. Use the Test webhook button to send a webhook.test event and verify connectivity
Terminal window
curl -X POST https://ingest.transyt.com/admin/accounts \
-H "X-Admin-Token: YOUR_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"provider": "teller",
"account_slug": "my-app",
"app_key": "my-app",
"signing_secret_current": "your-teller-signing-secret"
}'
Teller EventDescription
enrollment.disconnectedEnrollment connection to the institution is irrecoverably broken
transactions.processedNew transactions found and categorized after polling
account.number_verification.processedMicrodeposit account verification completed or expired
webhook.testTest event triggered from the Teller Dashboard

When type is enrollment.disconnected, the payload includes a reason field:

ReasonDescription
disconnectedGeneric disconnection
disconnected.account_lockedInstitution locked the account
disconnected.credentials_invalidUser credentials are no longer valid
disconnected.enrollment_inactiveEnrollment has become inactive
disconnected.user_action.captcha_requiredUser needs to complete a captcha
disconnected.user_action.contact_information_requiredUser needs to update contact info
disconnected.user_action.insufficient_permissionsInsufficient permissions
disconnected.user_action.mfa_requiredUser needs to complete MFA
disconnected.user_action.web_login_requiredUser needs to log in via web

When type is account.number_verification.processed, the payload includes a status field: completed or expired.

{
"id": "wh_oiffb5cocakqmksbkg000",
"payload": {
"enrollment_id": "enr_oiffb5cocakqmksbkg001",
"reason": "disconnected.account_locked"
},
"timestamp": "2023-07-10T03:49:29Z",
"type": "enrollment.disconnected"
}

The webhook event id field (e.g., wh_oiffb5cocakqmksbkg000) is used as the external ID for deduplication.

Teller polls connected financial institutions multiple times per day on a non-predictable schedule, with at least one polling attempt every 24 hours. The transactions.processed webhook fires when new transactions are found during these polls. If connectivity to an enrollment is temporarily lost, no transactions.processed events are sent until connectivity is restored.