Authentication & Account
User authentication, sessions, and account management
Manage operator authentication, sessions, and platform accounts through sdk.account.
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.
These endpoints authenticate admin/platform users (store owners, team members). For storefront account login, use the CRM account flow.
Authentication (sdk.account.auth)
Request Auth Code
Request a magic link code for email authentication.
/v1/auth/code sdk.account.auth.code(params) Parameters
| Name | Type | Description |
|---|---|---|
email required | string | User email address |
const challenge = await sdk.account.auth.code({
email: 'user@example.com',
});
// Keep challenge.challenge_id for the verify call.
// The user receives the verification code by email.Verify Auth Code
Verify the code received via email. On success, tokens are automatically set.
/v1/auth/verify sdk.account.auth.verify(params) Parameters
| Name | Type | Description |
|---|---|---|
challenge_id required | string | Challenge ID returned by the code request |
code required | string | Verification code from email |
const result = await sdk.account.auth.verify({
challenge_id: challenge.challenge_id,
code: '123456',
});
// The browser SDK stores the issued session internally.
console.log('Logged in successfully');Response:
{
"id": "session_abc123",
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs...",
"access_expires_at": 1704067200,
"refresh_expires_at": 1704672000,
"created_at": 1704063600,
"is_verified": true
}
Refresh Token
Refresh an expired access token.
/v1/auth/refresh sdk.account.auth.refresh(params) Parameters
| Name | Type | Description |
|---|---|---|
refresh_token required | string | Refresh token from previous auth |
const result = await sdk.account.auth.refresh({
refresh_token: 'eyJhbGciOiJIUzI1NiIs...',
});
console.log('Access token refreshed successfully');Store Authentication
For multi-tenant applications, authenticate users against a specific store.
Request Store Auth Code
/v1/stores/{storeId}/auth/code sdk.account.auth.storeCode(storeId, params) Parameters
| Name | Type | Description |
|---|---|---|
storeId required | string | Store ID to authenticate against |
email required | string | User email address |
const challenge = await sdk.account.auth.storeCode('store_abc123', {
email: 'contact@example.com',
});
// Keep challenge.challenge_id for the storeVerify call.Verify Store Auth Code
/v1/stores/{storeId}/auth/verify sdk.account.auth.storeVerify(storeId, params) Parameters
| Name | Type | Description |
|---|---|---|
storeId required | string | Store ID |
challenge_id required | string | Challenge ID returned by the store code request |
code required | string | Verification code from email |
const result = await sdk.account.auth.storeVerify('store_abc123', {
challenge_id: challenge.challenge_id,
code: '123456',
});
// The browser SDK stores the issued session internally.
console.log('Operator logged in');Account Management (sdk.account)
Get Current User
Get the authenticated platform account.
/v1/accounts/me sdk.account.getMe({}) const user = await sdk.account.getMe({});
console.log('User ID:', user.id);
console.log('Email:', user.email);Response:
{
"id": "acc_abc123",
"email": "user@example.com",
"lifecycle": {
"last_login_at": 1704067200,
"onboarding_completed": true
}
}
Update Account
Update the current account. API tokens and sessions are separate resources and are not embedded in this command.
/v1/accounts sdk.account.update(params) const result = await sdk.account.update({});
console.log(result.success);Search Accounts
Search for accounts (admin function).
/v1/accounts/search sdk.account.search(params) Parameters
| Name | Type | Description |
|---|---|---|
query optional | string | Search query |
limit optional | number | Items per page |
cursor optional | string | Pagination cursor |
const result = await sdk.account.search({
query: "john",
limit: 20,
});
result.items.forEach((account) => {
console.log(account.email, account.id);
});
Delete Account
Permanently delete the current user’s account.
/v1/accounts sdk.account.delete(params) This action is irreversible. All user data will be permanently deleted.
await sdk.account.delete({});
Sessions
Each successful verify or storeVerify call creates a separate account session. Sessions are not embedded in Account.
List Sessions
/v1/accounts/me/sessions sdk.account.session.list() const page = await sdk.account.session.list();
for (const session of page.items) {
console.log(session.id, session.status, session.refresh_expires_at);
}
Revoke Session
/v1/accounts/me/sessions/{id} sdk.account.session.revoke(id) await sdk.account.session.revoke("session_abc123");
API Tokens
API tokens are separate long-lived credentials for backend automation. Send their value through the Authorization: Bearer header.
List API Tokens
/v1/accounts/me/api-tokens sdk.account.apiToken.list() Create API Token
/v1/accounts/me/api-tokens sdk.account.apiToken.create(params) const created = await sdk.account.apiToken.create({
name: "CI deployment",
expires_at: null,
});
// `value` is returned at creation time; store it securely.
const secret = created.value;
Rename or Revoke API Token
/v1/accounts/me/api-tokens/{id} sdk.account.apiToken.update(params) /v1/accounts/me/api-tokens/{id} sdk.account.apiToken.revoke(id) await sdk.account.apiToken.update({
id: "token_abc123",
name: "CI deployment",
});
await sdk.account.apiToken.revoke("token_abc123");
Use API tokens for backend automation and account sessions for interactive admin access.
Complete Auth Flow Example
import { createAdmin } from "arky-sdk/admin";
const sdk = createAdmin({
baseUrl: "https://api.arky.io",
storeId: "store_abc123",
market: "us",
});
let pendingChallengeId: string | null = null;
async function requestLoginCode(email: string) {
const challenge = await sdk.account.auth.storeCode("store_abc123", { email });
pendingChallengeId = challenge.challenge_id;
}
async function verifyLogin(code: string) {
if (!pendingChallengeId) throw new Error("Request a login code first");
await sdk.account.auth.storeVerify("store_abc123", {
challenge_id: pendingChallengeId,
code,
});
pendingChallengeId = null;
return sdk.account.getMe({});
}
await sdk.logout();