Back to arky.io

Authentication & Account

User authentication, sessions, and account management

Manage user authentication, sessions, and account profiles using the sdk.auth and sdk.account modules.

Arky uses a magic-link email flow for admin/platform users. Request a code, verify it, and tokens are returned. Access tokens are short-lived (1 hour); refresh tokens last 7 days.

Note

These endpoints authenticate admin/platform users (business owners, team members). For customer-facing auth in a storefront, use the CRM customer auth flow.

Authentication (sdk.auth)

Request Auth Code

Request a magic link code for email authentication.

POST /v1/auth/code
SDK: sdk.auth.code(params)

Parameters

Name Type Description
email required string User email address
await sdk.auth.code({
email: 'user@example.com',
});

// User receives email with verification code

Verify Auth Code

Verify the code received via email. On success, tokens are automatically set.

POST /v1/auth/verify
SDK: sdk.auth.verify(params)

Parameters

Name Type Description
email required string User email address
code required string Verification code from email
const result = await sdk.auth.verify({
email: 'user@example.com',
code: '123456',
});

// Tokens are automatically stored via setToken callback
console.log('Logged in:', result.accessToken);

Response:

{
  "accessToken": "eyJhbGciOiJIUzI1NiIs...",
  "refreshToken": "eyJhbGciOiJIUzI1NiIs...",
  "expiresAt": 1704067200
}

Refresh Token

Refresh an expired access token.

POST /v1/auth/refresh
SDK: sdk.auth.refresh(params)

Parameters

Name Type Description
refreshToken required string Refresh token from previous auth
const result = await sdk.auth.refresh({
refreshToken: 'eyJhbGciOiJIUzI1NiIs...',
});

console.log('New access token:', result.accessToken);

Business Authentication

For multi-tenant applications, authenticate users against a specific business.

Request Business Auth Code

POST /v1/businesses/{businessId}/auth/code
SDK: sdk.auth.businessCode(businessId, params)

Parameters

Name Type Description
businessId required string Business ID to authenticate against
email required string User email address
await sdk.auth.businessCode('biz_abc123', {
email: 'customer@example.com',
});

// Customer receives email with code

Verify Business Auth Code

POST /v1/businesses/{businessId}/auth/verify
SDK: sdk.auth.businessVerify(businessId, params)

Parameters

Name Type Description
businessId required string Business ID
email required string User email address
code required string Verification code from email
const result = await sdk.auth.businessVerify('biz_abc123', {
email: 'customer@example.com',
code: '123456',
});

// Tokens are automatically stored
console.log('Customer logged in');

Account Management (sdk.account)

Get Current User

Get the authenticated user’s profile.

GET /v1/accounts/me
SDK: sdk.account.getMe(params)
const user = await sdk.account.getMe({});

console.log('User ID:', user.id);
console.log('Email:', user.email);
console.log('Memberships:', user.memberships);

Response:

{
  "id": "acc_abc123",
  "email": "user@example.com",
  "memberships": [
    {
      "businessId": "biz_123",
      "role": "Admin",
      "joinedAt": 1704067200
    }
  ],
  "apiTokens": [
    { "id": "tok_1", "name": "CI", "createdAt": 1704067200, "expiresAt": null }
  ],
  "authTokens": [
    {
      "id": "auth_1",
      "createdAt": 1704067200,
      "lastUsedAt": 1704070000,
      "accessExpiresAt": 1704070800,
      "refreshExpiresAt": 1704672000,
      "isVerified": true,
      "userAgent": "Mozilla/5.0 ..."
    }
  ]
}

Update Account

Update the current user’s account. Currently supports managing API tokens.

PUT /v1/accounts
SDK: sdk.account.updateAccount(params)

Parameters

Name Type Description
apiTokens optional object[] API tokens to create or update
const result = await sdk.account.updateAccount({
apiTokens: [
  { name: 'My API Key' }
],
});

// Returns newly created tokens
console.log(result.newlyCreatedTokens);

Search Accounts

Search for accounts (admin function).

GET /v1/accounts/search
SDK: sdk.account.searchAccounts(params)

Parameters

Name Type Description
query optional string Search query
owner optional string Filter by owner
limit optional number Items per page
cursor optional string Pagination cursor
const result = await sdk.account.searchAccounts({
  query: 'john',
  limit: 20,
});

result.items.forEach(account => {
  console.log(account.email, account.id);
});

Delete Account

Permanently delete the current user’s account.

DELETE /v1/accounts
SDK: sdk.account.deleteAccount(params)
Warning

This action is irreversible. All user data will be permanently deleted.

await sdk.account.deleteAccount({});

Sessions & API Tokens

Each successful verify / businessVerify call issues a new AuthToken stored on the account. The getMe() response includes:

  • authTokens — active session tokens (access/refresh pairs). Each may carry a userAgent string recorded when the session was created, so users can identify devices.
  • apiTokens — long-lived API tokens created via updateAccount({ apiTokens }), used for server-to-server auth via the Authorization: Bearer header.
Tip

Use apiTokens for backend integrations (CI/CD, workflows, webhooks). Use the magic-link flow (authTokens) for interactive admin sessions.


Complete Auth Flow Example

import { createSdk } from '@arky/sdk';

// Initialize SDK with token management
const sdk = createSdk({
  businessId: 'biz_abc123',
  getToken: async () => {
    const stored = localStorage.getItem('arky_tokens');
    return stored ? JSON.parse(stored) : null;
  },
  setToken: async (tokens) => {
    if (tokens) {
      localStorage.setItem('arky_tokens', JSON.stringify(tokens));
    } else {
      localStorage.removeItem('arky_tokens');
    }
  },
});

// Login flow — step 1: request code
async function login(email: string) {
  await sdk.auth.businessCode('biz_abc123', { email });
  // Show code input to user...
}

// Step 2: verify code — tokens are automatically stored via setToken
async function verifyLogin(email: string, code: string) {
  await sdk.auth.businessVerify('biz_abc123', { email, code });
  return await sdk.account.getMe({});
}

// Logout
function logout() {
  localStorage.removeItem('arky_tokens');
}