Create a login link
curl --request POST \
--url https://api.bachs.io/v1/accounts/{account_id}/login_links \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/accounts/{account_id}/login_links', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/accounts/{account_id}/login_links"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/accounts/{account_id}/login_links"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"url": "https://connect.bachs.io/login/ll_9fK2mQ7xR4tV8wZ1",
"expires_at": "2026-11-20T10:05:00Z"
}{
"detail": "Login links are only available for accounts in the light dashboard mode",
"error_code": "login_links_need_light"
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}Connected Accounts
Create a login link
Make a single-use link that opens the dashboard of an account in light mode. Make it when the person taps an Open dashboard button in your app, and send them straight to it: it lasts five minutes. Do not email it. When they open it, we email a code to the account’s contact email. See Give an account a dashboard.
POST
/
v1
/
accounts
/
{account_id}
/
login_links
Create a login link
curl --request POST \
--url https://api.bachs.io/v1/accounts/{account_id}/login_links \
--header 'Authorization: Bearer <token>'const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.bachs.io/v1/accounts/{account_id}/login_links', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.bachs.io/v1/accounts/{account_id}/login_links"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.bachs.io/v1/accounts/{account_id}/login_links"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"url": "https://connect.bachs.io/login/ll_9fK2mQ7xR4tV8wZ1",
"expires_at": "2026-11-20T10:05:00Z"
}{
"detail": "Login links are only available for accounts in the light dashboard mode",
"error_code": "login_links_need_light"
}{
"detail": "Invalid API key",
"error_code": "UNAUTHORIZED"
}{
"detail": "API key does not have permission for this operation",
"error_code": "FORBIDDEN"
}{
"detail": "Resource not found",
"error_code": "NOT_FOUND"
}Authorizations
Bearer token authentication. Pass your API key as Authorization: Bearer sk_.... See Authentication for keys, scopes, and sandbox vs production.
Scopes
connected_accounts:write
Path Parameters
The account to act on. It must be one of your own accounts.

