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)

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.