@praxicraft/assess. Source: praxicraft-node. Requires Node.js 18+ (native fetch).
Install
npm install @praxicraft/assess
Authentication
export PRAXICRAFT_API_KEY="ct_live_xxxxxxxxxxxxxxxx"
import { Client } from "@praxicraft/assess";
const client = new Client(); // reads PRAXICRAFT_API_KEY
// or new Client({ apiKey: "ct_live_…", baseUrl: "https://assess.praxicraft.com" })
Quickstart
import { Client } from "@praxicraft/assess";
const client = new Client();
const page = (await client.assessments.list()) as {
results: Array<{ slug: string; status: string }>;
};
for (const assessment of page.results) {
console.log(assessment.slug, assessment.status);
}
const invite = (await client.invites.create("senior-backend-screen", {
email: "[email protected]",
name: "Jane Doe",
send_email: true,
})) as { invite_token: string; invite_url?: string };
console.log(invite.invite_token, invite.invite_url);
const result = await client.results.retrieve(invite.invite_token);
console.log(result);
{ data: … } wrapper).
Resources
| Resource | Common methods |
|---|---|
client.org | retrieve(), stats() |
client.assessments | list(), retrieve(), create(), update(), activate(), listCases(), attachCases(), replaceCases(), removeCase() |
client.invites | create(), bulkCreate(), list(), retrieve(), remind(), cancel() |
client.results | list(), retrieve(), iterAll() |
client.webhooks | list(), create(), retrieve(), update(), delete(), test(), deliveries() |
client.pipelines | list(), retrieve(), enroll(), bulkEnroll(), listEnrollments(), getEnrollment() |
verifySignature | Webhook HMAC helper |
Examples
Invite quota
const org = (await client.org.retrieve()) as { invites_remaining?: number };
if ((org.invites_remaining ?? 0) < candidates.length) {
throw new Error("Not enough invites remaining this month");
}
Webhook register + test
const hook = (await client.webhooks.create({
url: "https://example.com/hooks/praxicraft",
events: ["assessment.completed", "candidate.passed"],
})) as { id: string; secret_key: string };
// Store hook.secret_key (whsec_…) — shown once
await client.webhooks.test(hook.id);
await client.webhooks.update(hook.id, { is_active: true });
Paginate results
for await (const row of client.results.iterAll("senior-backend-screen", {
page_size: 50,
})) {
console.log(row);
}
Errors
import {
AuthenticationError,
InsufficientScopeError,
RateLimitError,
ValidationError,
} from "@praxicraft/assess";
try {
await client.invites.create("demo", { email: "[email protected]" });
} catch (err) {
if (err instanceof ValidationError) {
console.log(err.code, err.details);
} else if (err instanceof InsufficientScopeError) {
console.log(err.code, err.requiredPlan);
} else if (err instanceof AuthenticationError) {
console.log(err.code);
} else if (err instanceof RateLimitError) {
console.log(err.retryAfter);
} else {
throw err;
}
}
403 IP_NOT_ALLOWED means this key’s CIDR allowlist rejected the client IP — branch on err.code. Catalogue: Errors.