Skip to main content

Type Definitions

interface PdfOptions {
  format?: 'A4' | 'A3' | 'Letter' | 'Legal';
  orientation?: 'portrait' | 'landscape';
  margin?: { top?: number; right?: number; bottom?: number; left?: number };
  printBackground?: boolean;
}

interface GeneratePdfRequest {
  htmlContent?: string;
  templateId?: string;
  templateData?: Record<string, unknown>;
  filename?: string;
  options?: PdfOptions;
}

interface PdfData {
  fileId: string;
  url: string;
  signedUrl: string;
  filename: string;
  size: number;
  processingTimeMs: number;
}

interface FileloomResponse {
  success: true;
  requestId: string;
  data: PdfData;
  usage: { remaining: number; quotaUsed: number; quotaLimit: number };
}

Client Class

class FileloomClient {
  constructor(private apiKey: string, private baseUrl = 'https://api.fileloom.io/v1') {}

  async generatePdf(request: GeneratePdfRequest): Promise<FileloomResponse> {
    const response = await fetch(`${this.baseUrl}/pdf/generate`, {
      method: 'POST',
      headers: {
        'X-API-Key': this.apiKey,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify(request)
    });

    if (!response.ok) {
      const error = await response.json();
      throw new FileloomApiError(error.error.message, error.error.code, response.status);
    }

    return response.json();
  }
}

class FileloomApiError extends Error {
  constructor(message: string, public code: string, public status: number) {
    super(message);
  }
}

Usage

const client = new FileloomClient(process.env.FILELOOM_API_KEY!);

// HTML generation
const result = await client.generatePdf({
  htmlContent: '<h1>Hello</h1>',
  filename: 'hello.pdf'
});

// Template with typed data
interface InvoiceData {
  invoiceNumber: string;
  customer: { name: string; email: string };
  items: Array<{ description: string; quantity: number; unitPrice: number }>;
  total: number;
}

const invoice: InvoiceData = {
  invoiceNumber: 'INV-001',
  customer: { name: 'Acme', email: 'billing@acme.com' },
  items: [{ description: 'Web Dev', quantity: 10, unitPrice: 150 }],
  total: 1500
};

const result = await client.generatePdf({
  templateId: 'tpl_invoice_v2',
  templateData: invoice,
  filename: 'invoice.pdf'
});

Error Handling

try {
  await client.generatePdf({ templateId: 'invalid' });
} catch (error) {
  if (error instanceof FileloomApiError) {
    switch (error.code) {
      case 'TEMPLATE_NOT_FOUND': console.error('Template missing'); break;
      case 'NO_CREDITS_AVAILABLE': console.error('Out of credits'); break;
      default: console.error(`Error [${error.code}]: ${error.message}`);
    }
  }
}