Typescript SDK
Official Typescript SDK for Apploi’s Partner API can be found at https://www.npmjs.com/package/@apploi/apploi-client
What is @apploitech/apploi-client?
The official TypeScript client for Apploi’s Partner API. It wraps the generated Fern SDK with a developer-friendly layer that adds native TypeScript types, input validation, and a consistent error model. This means faster integration, fewer runtime surprises, and a cleaner DX from local development to production.
Features
✅ Native TypeScript Types - Use number, Date, and enums instead of strings
✅ Input Validation - Catch errors before making API calls
✅ Strongly-Typed Responses - Full TypeScript interfaces with IDE autocomplete
✅ Better Error Handling - Custom exception hierarchy with detailed error information
✅ Bundled SDK - Includes the Fern-generated SDK, no additional dependencies needed
✅ Developer-Friendly - Intuitive API that follows TypeScript best practices
Installation
npm install @apploitech/apploi-clientor with yarn:
yarn add @apploitech/apploi-clientQuick Start
import { ApploiClient } from '@apploitech/apploi-client';
// Initialize the client
const client = new ApploiClient({
apiKey: 'your-api-key-here',
baseUrl: 'https://partners.apploi.com' // Optional, this is the default
});
// Get job applications with native types
const applications = await client.getJobApplications({
jobId: 12345, // number, not string!
limit: 50, // number, not string!
updatedAfter: new Date('2024-01-01') // Date object, not string!
});
// Strongly-typed response
console.log(applications.applicants[0].name); // Full TypeScript support
console.log(applications.pagination.total); // IDE autocomplete works
console.log(applications.pagination.hasMore); // Know exactly what fields exist💡 See
examples.tsfor comprehensive usage examples including pagination, error handling, and advanced features.
API Reference
Client Initialization
import { ApploiClient, ApploiClientConfig } from '@apploitech/apploi-client';
const config: ApploiClientConfig = {
apiKey: 'your-api-key', // Required - API key for authentication
authorization: 'your-auth-token', // Optional - not required by the API
baseUrl: 'https://api.example.com', // Optional - uses default if not provided
timeout: 30000, // Optional - timeout in milliseconds
customHeaders: { // Optional - additional headers
'X-Custom-Header': 'value'
}
};
const client = new ApploiClient(config);
// Or use minimal configuration (recommended):
const client = new ApploiClient({
apiKey: 'your-api-key'
});Getting Job Applications
import { GetJobApplicationsParams, ApplicationStatus } from '@apploitech/apploi-client';
const params: GetJobApplicationsParams = {
// All parameters are optional and strongly-typed
jobId: 12345, // number or string
teamId: 67890, // number or string
status: ApplicationStatus.SCREENING, // Enum value
updatedAfter: new Date('2024-01-01'), // Date object
updatedBefore: new Date('2024-12-31'), // Date object
limit: 50, // number (1-1000)
offset: 0, // number (>= 0)
includeArchived: false // boolean
};
try {
const result = await client.getJobApplications(params);
// Access strongly-typed response
for (const applicant of result.applicants) {
console.log(`${applicant.name} - ${applicant.status}`);
console.log(`Applied: ${applicant.createdAt}`);
console.log(`Email: ${applicant.email}`);
}
// Pagination information
console.log(`Total: ${result.pagination.total}`);
console.log(`Has more: ${result.pagination.hasMore}`);
} catch (error) {
// Handle errors (see Error Handling section)
}Working with Application Status
import { ApplicationStatus } from '@apploitech/apploi-client';
// Use the enum for type safety
const status = ApplicationStatus.HIRED;
// Available statuses:
// - ApplicationStatus.APPLIED
// - ApplicationStatus.SCREENING
// - ApplicationStatus.INTERVIEWING
// - ApplicationStatus.REFERENCE_CHECK
// - ApplicationStatus.OFFER_EXTENDED
// - ApplicationStatus.HIRED
// - ApplicationStatus.REJECTED
// - ApplicationStatus.WITHDRAWN
// - ApplicationStatus.ON_HOLD
// - ApplicationStatus.UNKNOWN (fallback for unrecognized values)Error Handling
The adapter provides a custom exception hierarchy for better error handling:
import {
ApploiValidationError,
ApploiAuthenticationError,
ApploiAPIError,
ApploiResponseParseError
} from '@apploitech/apploi-client';
try {
const result = await client.getJobApplications({ limit: 2000 }); // Invalid!
} catch (error) {
if (error instanceof ApploiValidationError) {
// Parameter validation failed
console.error(`Field ${error.field} is invalid:`, error.message);
console.error('Provided value:', error.value);
} else if (error instanceof ApploiAuthenticationError) {
// 401 or 403 status code
console.error('Auth failed:', error.statusCode, error.message);
} else if (error instanceof ApploiAPIError) {
// Other API errors
console.error('API error:', error.statusCode, error.message);
console.error('Response:', error.response);
} else if (error instanceof ApploiResponseParseError) {
// Failed to parse API response
console.error('Parse error:', error.message);
console.error('Raw response:', error.rawResponse);
}
}Type Definitions
JobApplication
interface JobApplication {
id: string;
jobId: string;
teamId?: string;
status?: ApplicationStatus;
firstName?: string;
lastName?: string;
name: string;
email?: string;
phone?: string;
createdAt?: Date;
updatedAt?: Date;
source?: string;
address?: Address;
resume?: Attachment;
coverLetter?: Attachment;
attachments?: Attachment[];
notes?: string;
tags?: string[];
score?: number;
isPriority?: boolean;
// ... and more fields
}ApplicantsList
interface ApplicantsList {
applicants: JobApplication[];
pagination: {
total: number;
limit: number;
offset: number;
hasMore: boolean;
};
}Validation Rules
The adapter validates all inputs before making API calls:
- limit: Must be between 1 and 1000
- offset: Must be >= 0
- IDs: Can be numbers or strings, automatically converted
- Dates: Accept Date objects or ISO strings, converted to YYYY-MM-DD format
- Status: Must be a valid ApplicationStatus enum value
Advanced Usage
Access the Underlying SDK
If you need to access the raw Fern SDK for any reason:
const sdkClient = client.getSdkClient();
// Use raw SDK methods if neededCustom Validators
You can also use the validators directly:
import { validateLimit, validateId, validateAndConvertDate } from '@apploitech/apploi-client';
// Validate parameters before use
const limit = validateLimit(50); // Returns "50"
const id = validateId(12345, 'jobId'); // Returns "12345"
const date = validateAndConvertDate(new Date(), 'startDate'); // Returns "YYYY-MM-DD"Building the Project
# Install dependencies
npm install
# Build TypeScript
npm run build
# Run linter
npm run lint
# Format code
npm run formatUpdated 6 days ago
