Banking & Payments
API reference for bank account connections, PayPal, Plaid Open Banking, and account management.
List Connected Accounts
JavaScript
const accounts = await $fetch('https://taxmtd.uk/api/banking/accounts')
// Returns: Array<{ id, provider, label, env, status, createdAt }>
Python
res = requests.get(
"https://taxmtd.uk/api/banking/accounts",
cookies=session_cookies,
)
accounts = res.json()["data"]
PHP
$accounts = Http::withCookies($session)
->get('https://taxmtd.uk/api/banking/accounts')
->json()['data'];
Rust
#[derive(Deserialize)]
struct Account {
id: i64,
provider: String,
label: String,
env: String,
status: String,
}
#[derive(Deserialize)]
struct ApiResponse { data: Vec<Account> }
let res: ApiResponse = client
.get("https://taxmtd.uk/api/banking/accounts")
.send().await?
.json().await?;
cURL
curl https://taxmtd.uk/api/banking/accounts
Connect Bank Account (Plaid)
Step 1: Create Link Token
JavaScript
const { link_token } = await $fetch('https://taxmtd.uk/api/banking/plaid/create-link-token', {
method: 'POST'
})
// Use link_token with Plaid Link front-end
Python
res = requests.post(
"https://taxmtd.uk/api/banking/plaid/create-link-token",
cookies=session_cookies,
)
link_token = res.json()["data"]["link_token"]
PHP
$response = Http::withCookies($session)
->post('https://taxmtd.uk/api/banking/plaid/create-link-token');
$linkToken = $response->json()['data']['link_token'];
Rust
#[derive(Deserialize)]
struct LinkTokenData { link_token: String }
#[derive(Deserialize)]
struct LinkTokenResponse { data: LinkTokenData }
let res: LinkTokenResponse = client
.post("https://taxmtd.uk/api/banking/plaid/create-link-token")
.send().await?
.json().await?;
let link_token = res.data.link_token;
cURL
curl -X POST https://taxmtd.uk/api/banking/plaid/create-link-token
Step 2: Exchange Public Token
After user completes Plaid Link:
JavaScript
await $fetch('https://taxmtd.uk/api/banking/plaid/exchange-token', {
method: 'POST',
body: {
public_token: 'public-sandbox-xxxx',
institution: { name: 'NatWest', institution_id: 'ins_xxx' },
accounts: [{ id: 'acc_xxx', name: 'Current Account', mask: '1234' }]
}
})
Python
requests.post(
"https://taxmtd.uk/api/banking/plaid/exchange-token",
json={
"public_token": "public-sandbox-xxxx",
"institution": {"name": "NatWest", "institution_id": "ins_xxx"},
"accounts": [{"id": "acc_xxx", "name": "Current Account", "mask": "1234"}],
},
cookies=session_cookies,
)
PHP
Http::withCookies($session)->post(
'https://taxmtd.uk/api/banking/plaid/exchange-token',
[
'public_token' => 'public-sandbox-xxxx',
'institution' => ['name' => 'NatWest', 'institution_id' => 'ins_xxx'],
'accounts' => [['id' => 'acc_xxx', 'name' => 'Current Account', 'mask' => '1234']],
]
);
Rust
client.post("https://taxmtd.uk/api/banking/plaid/exchange-token")
.json(&serde_json::json!({
"public_token": "public-sandbox-xxxx",
"institution": {"name": "NatWest", "institution_id": "ins_xxx"},
"accounts": [{"id": "acc_xxx", "name": "Current Account", "mask": "1234"}]
}))
.send().await?;
cURL
curl -X POST https://taxmtd.uk/api/banking/plaid/exchange-token \
-H "Content-Type: application/json" \
-d '{"public_token":"public-sandbox-xxxx","institution":{"name":"NatWest"}}'
Step 3: List Plaid Accounts
JavaScript
const plaidAccounts = await $fetch('https://taxmtd.uk/api/banking/plaid/accounts')
Python
res = requests.get(
"https://taxmtd.uk/api/banking/plaid/accounts",
cookies=session_cookies,
)
plaid_accounts = res.json()["data"]
PHP
$plaidAccounts = Http::withCookies($session)
->get('https://taxmtd.uk/api/banking/plaid/accounts')
->json()['data'];
Rust
let plaid_accounts: serde_json::Value = client
.get("https://taxmtd.uk/api/banking/plaid/accounts")
.send().await?
.json().await?;
cURL
curl https://taxmtd.uk/api/banking/plaid/accounts
Connect PayPal
API Credentials Method
JavaScript
await $fetch('https://taxmtd.uk/api/banking/paypal/connect', {
method: 'POST',
body: {
clientId: 'AcR4fbBm...',
secret: 'ENv4NrHM...',
env: 'live', // 'sandbox' or 'live'
label: 'PayPal Business'
}
})
Python
requests.post(
"https://taxmtd.uk/api/banking/paypal/connect",
json={
"clientId": "AcR4fbBm...",
"secret": "ENv4NrHM...",
"env": "live",
"label": "PayPal Business",
},
cookies=session_cookies,
)
PHP
Http::withCookies($session)->post(
'https://taxmtd.uk/api/banking/paypal/connect',
[
'clientId' => 'AcR4fbBm...',
'secret' => 'ENv4NrHM...',
'env' => 'live',
'label' => 'PayPal Business',
]
);
Rust
client.post("https://taxmtd.uk/api/banking/paypal/connect")
.json(&serde_json::json!({
"clientId": "AcR4fbBm...",
"secret": "ENv4NrHM...",
"env": "live",
"label": "PayPal Business"
}))
.send().await?;
cURL
curl -X POST https://taxmtd.uk/api/banking/paypal/connect \
-H "Content-Type: application/json" \
-d '{"clientId":"AcR4fbBm...","secret":"ENv4NrHM...","env":"live","label":"PayPal Business"}'
OAuth Method
Redirect to PayPal for authorisation:
JavaScript
// Initiate OAuth
const { redirectUrl } = await $fetch('https://taxmtd.uk/api/banking/paypal/auth', {
method: 'POST',
body: { env: 'live', label: 'PayPal Main' }
})
// Redirect user to redirectUrl
navigateTo(redirectUrl, { external: true })
// Callback handled at /api/banking/paypal/callback
Python
res = requests.post(
"https://taxmtd.uk/api/banking/paypal/auth",
json={"env": "live", "label": "PayPal Main"},
cookies=session_cookies,
)
redirect_url = res.json()["data"]["redirectUrl"]
# Redirect user to redirect_url
PHP
$response = Http::withCookies($session)->post(
'https://taxmtd.uk/api/banking/paypal/auth',
['env' => 'live', 'label' => 'PayPal Main']
);
$redirectUrl = $response->json()['data']['redirectUrl'];
// Redirect user to $redirectUrl
Rust
#[derive(Deserialize)]
struct AuthData { #[serde(rename = "redirectUrl")] redirect_url: String }
#[derive(Deserialize)]
struct AuthResponse { data: AuthData }
let res: AuthResponse = client
.post("https://taxmtd.uk/api/banking/paypal/auth")
.json(&serde_json::json!({
"env": "live",
"label": "PayPal Main"
}))
.send().await?
.json().await?;
// Redirect user to res.data.redirect_url
cURL
curl -X POST https://taxmtd.uk/api/banking/paypal/auth \
-H "Content-Type: application/json" \
-b cookies.txt \
-d '{"env":"live","label":"PayPal Main"}'
Import PayPal Transactions
JavaScript
const result = await $fetch('https://taxmtd.uk/api/banking/paypal/import', {
method: 'POST',
body: {
accountId: 1,
periodId: 1,
startDate: '2026-01-30',
endDate: '2026-02-27'
}
})
console.log(`Imported ${result.imported} transactions`)
Python
res = requests.post(
"https://taxmtd.uk/api/banking/paypal/import",
json={
"accountId": 1,
"periodId": 1,
"startDate": "2026-01-30",
"endDate": "2026-02-27",
},
cookies=session_cookies,
)
data = res.json()["data"]
print(f"Imported {data['imported']} transactions")
PHP
$response = Http::withCookies($session)->post(
'https://taxmtd.uk/api/banking/paypal/import',
[
'accountId' => 1,
'periodId' => 1,
'startDate' => '2026-01-30',
'endDate' => '2026-02-27',
]
);
$data = $response->json()['data'];
echo "Imported {$data['imported']} transactions";
Rust
#[derive(Deserialize)]
struct ImportData { imported: i64 }
#[derive(Deserialize)]
struct ImportResponse { data: ImportData }
let res: ImportResponse = client
.post("https://taxmtd.uk/api/banking/paypal/import")
.json(&serde_json::json!({
"accountId": 1,
"periodId": 1,
"startDate": "2026-01-30",
"endDate": "2026-02-27"
}))
.send().await?
.json().await?;
println!("Imported {} transactions", res.data.imported);
cURL
curl -X POST https://taxmtd.uk/api/banking/paypal/import \
-H "Content-Type: application/json" \
-d '{"accountId":1,"periodId":1,"startDate":"2026-01-30","endDate":"2026-02-27"}'
Disconnect Account
JavaScript
await $fetch('https://taxmtd.uk/api/banking/accounts', {
method: 'DELETE',
body: { id: 1 }
})
Python
requests.delete(
"https://taxmtd.uk/api/banking/accounts",
json={"id": 1},
cookies=session_cookies,
)
PHP
Http::withCookies($session)->delete(
'https://taxmtd.uk/api/banking/accounts',
['id' => 1]
);
Rust
client.delete("https://taxmtd.uk/api/banking/accounts")
.json(&serde_json::json!({ "id": 1 }))
.send().await?;
cURL
curl -X DELETE https://taxmtd.uk/api/banking/accounts \
-H "Content-Type: application/json" \
-d '{"id": 1}'
Disconnecting removes all stored tokens and credentials. Transaction history is preserved.