#JavaScript SDK

The Pixault JavaScript SDK provides image URL construction, uploads, and management for Node.js and browser environments. Available as @pixault/sdk on npm.

Source on GitHub

#Installation

npm install @pixault/sdk
# or
yarn add @pixault/sdk

#Configuration

import { Pixault } from '@pixault/sdk';
const px = new Pixault({
  clientId: 'px_cl_your_client_id',
  clientSecret: 'pk_your_secret_key',
  baseUrl: 'https://img.pixault.io',  // optional, this is the default
  project: 'myapp',
});

Browser usage: Never expose your client secret in client-side code. Use the URL builder (which doesn't require secrets) in the browser, and make API calls from your server.

#URL Builder

Generate transform URLs without making network requests:

const url = px.url('img_01JKXYZ')
  .width(800)
  .height(600)
  .fit('cover')
  .quality(85)
  .format('webp')
  .build();
// → "https://img.pixault.io/myapp/img_01JKXYZ/w_800,h_600,fit_cover,q_85.webp"

#Methods

Method

Description

.width(n)

Width in pixels (1–4096)

.height(n)

Height in pixels (1–4096)

.fit(mode)

'cover', 'contain', 'fill', 'pad'

.quality(n)

Output quality (1–100)

.blur(n)

Gaussian blur radius (1–100)

.watermark(id)

Watermark overlay ID

.watermarkPosition(pos)

'tl', 'tr', 'bl', 'br', 'c', 'tile'

.watermarkOpacity(n)

Opacity (1–100)

.transform(name)

Named transform preset

.format(fmt)

'jpg', 'png', 'webp', 'avif'

.build()

Returns the URL string

#Browser-Only URL Builder

For client-side usage without credentials:

import { PixaultUrl } from '@pixault/sdk';
const builder = new PixaultUrl({
  baseUrl: 'https://img.pixault.io',
  project: 'myapp',
});
const url = builder.image('img_01JKXYZ')
  .width(400).format('webp').build();

#Upload

// Node.js (with fs)
import fs from 'fs';
const image = await px.upload(fs.createReadStream('photo.jpg'), {
  filename: 'photo.jpg',
  alt: 'Team photo from retreat',
  tags: ['team', 'retreat'],
});
console.log(image.id);  // "img_01JKXYZ123"
console.log(image.url);  // "https://img.pixault.io/myapp/img_01JKXYZ123/original.jpg"
// Browser (with File object)
const fileInput = document.querySelector('input[type="file"]');
const file = fileInput.files[0];
const image = await px.upload(file, {
  alt: 'User avatar',
  tags: ['avatar'],
});

#Image Management

// List images
const { images, cursor, hasMore } = await px.listImages({
  limit: 20,
  tag: 'nature',
});
// Get metadata
const metadata = await px.getImage('img_01JKXYZ');
// Update metadata
await px.updateImage('img_01JKXYZ', {
  alt: 'Updated description',
  tags: ['updated', 'tags'],
});
// Delete
await px.deleteImage('img_01JKXYZ');

#List & Search Images

// List all images
const result = await pixault.listImages('my-project');
// Search by text
const matches = await pixault.listImages('my-project', { search: 'hero' });
// Filter by category
const tattoos = await pixault.listImages('my-project', { category: 'tattoo-flash' });
// Filter by keyword
const portraits = await pixault.listImages('my-project', { keyword: 'portrait' });
// Paginate
const page2 = await pixault.listImages('my-project', {}, 50, result.nextCursor);

#Folder Management

// List folders
const folders = await client.listFolders();
// Create a folder
await client.createFolder('portfolio/landscapes');
// Delete a folder
await client.deleteFolder('portfolio/landscapes');
// List images in a specific folder
const result = await client.listImages({ folder: 'portfolio/landscapes' });

#Named Transforms

// Create
await px.createTransform('thumbnail', {
  parameters: { w: 200, h: 200, fit: 'cover', q: 80 },
  locked: ['w', 'h', 'fit'],
});
// List
const transforms = await px.listTransforms();
// Use in URL builder
const url = px.url('img_01JKXYZ').transform('thumbnail').format('webp').build();

#TypeScript Support

The SDK is written in TypeScript and exports full type definitions:

import type { PixaultConfig, ImageMetadata, UploadOptions } from '@pixault/sdk';
const config: PixaultConfig = {
  clientId: 'px_cl_abc123',
  clientSecret: 'pk_secret456',
  project: 'myapp',
};

#Error Handling

try {
  await px.upload(file, { alt: 'Photo' });
} catch (err) {
  if (err.status === 413) {
    console.error('Storage quota exceeded');
  } else if (err.status === 429) {
    console.error(`Rate limited. Retry after ${err.retryAfter}s`);
  }
}

#React Integration

See the React Integration Guide for component examples and hooks.