All API requests require authentication via the x-api-key header.
Get your API key: API Key Documentation
All API responses include rate limit headers (x-ratelimit-limit, x-ratelimit-used, x-ratelimit-remaining). See Rate Limiting for details.
| Endpoint | Description | Documentation |
|---|---|---|
POST /html2pdf | Convert HTML to PDF with optional Nunjucks templating | HTML to PDF |
POST /markdown2pdf | Convert Markdown to PDF | Markdown to PDF |
POST /screenshot | Capture website screenshots with automation | Screenshot API |
POST /scraper | Scrape HTML content from websites | HTML Scraper |
POST /__js1- | Execute custom JavaScript code | JavaScript Execution |
POST /pages/page/upsert-html | Host and deploy HTML pages | HTML Pages API |
/html2pdfhttps://e.customjs.io/html2pdf
Converts HTML to PDF with optional template rendering using Nunjucks.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
Content-Type | string | ✓ | Must be application/json |
{
"input": {
"html": "<h1>Hello {{ name }}</h1>",
"data": {
"name": "World"
},
"config": {
"pdfWidthMm": 210,
"pdfHeightMm": 297
}
}
}
| Name | Type | Required | Description |
|---|---|---|---|
html | string | ✓ | HTML content to convert to PDF |
data | object | ✗ | Template data - when provided, HTML is automatically rendered using Nunjucks template engine |
config | object | ✗ | Optional configuration object |
config.pdfWidthMm | number | ✗ | PDF page width in millimeters. Defaults to A4 (210) when omitted |
config.pdfHeightMm | number | ✗ | PDF page height in millimeters. Defaults to A4 (297) when omitted |
Simple HTML:
curl -X POST 'https://e.customjs.io/html2pdf' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"html": "<h1>Hello World</h1>"
}
}' \
> output.pdf
With Template Data:
curl -X POST 'https://e.customjs.io/html2pdf' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"html": "<h1>Hello {{ name }}</h1><p>Total: {{ total }}</p>",
"data": {
"name": "John",
"total": 100
},
"config": {
"pdfWidthMm": 150,
"pdfHeightMm": 150
}
}
}' \
> output.pdf
Content-Type: application/pdf
Returns binary PDF data.
/markdown2pdfhttps://e.customjs.io/markdown2pdf
Converts Markdown to PDF.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
Content-Type | string | ✓ | Must be application/json |
{
"input": {
"markdown": "# Hello World\n\nThis is **bold** text."
}
}
| Name | Type | Required | Description |
|---|---|---|---|
markdown | string | ✓ | Markdown content to convert to PDF |
curl -X POST 'https://e.customjs.io/markdown2pdf' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"markdown": "# Hello World\n\nThis is **bold** text."
}
}' \
> output.pdf
Content-Type: application/pdf
Returns binary PDF data.
/screenshothttps://e.customjs.io/screenshot
Captures a screenshot of a web page with optional automation commands and custom viewport.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
Content-Type | string | ✓ | Must be application/json |
{
"input": {
"url": "https://example.com",
"commands": [],
"box": {
"x": 0,
"y": 0,
"width": 1200,
"height": 800
}
}
}
| Name | Type | Required | Description |
|---|---|---|---|
url | string | ✓ | The URL of the page to screenshot |
commands | array | ✗ | Array of automation commands to execute before taking the screenshot (e.g., click, scroll, wait, type) |
box | object | ✗ | Bounding box coordinates for partial screenshots (only applied if width > 0 and height > 0) |
box.x | number | ✗ | X-coordinate of the top-left corner |
box.y | number | ✗ | Y-coordinate of the top-left corner |
box.width | number | ✗ | Width of the screenshot area |
box.height | number | ✗ | Height of the screenshot area |
Full Page Screenshot:
curl -X POST 'https://e.customjs.io/screenshot' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"url": "https://example.com",
"commands": []
}
}' \
> output.png
With Automation Commands:
curl -X POST 'https://e.customjs.io/screenshot' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"url": "https://example.com",
"commands": [
{"action": "click", "selector": "#accept-cookies"},
{"action": "wait", "value": 1000},
{"action": "scroll", "value": 500}
]
}
}' \
> output.png
Custom Viewport Screenshot:
curl -X POST 'https://e.customjs.io/screenshot' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"url": "https://example.com",
"commands": [],
"box": {
"x": 0,
"y": 0,
"width": 1200,
"height": 800
}
}
}' \
> output.png
Content-Type: image/png
Returns binary PNG image data.
/scraperhttps://e.customjs.io/scraper
Scrapes HTML content from a web page with optional automation commands.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
Content-Type | string | ✓ | Must be application/json |
{
"input": {
"url": "https://example.com",
"commands": []
}
}
| Name | Type | Required | Description |
|---|---|---|---|
url | string | ✓ | The URL of the page to scrape |
commands | array | ✗ | Array of automation commands to execute before scraping (e.g., click, scroll, wait, type) |
Simple Scraping:
curl -X POST 'https://e.customjs.io/scraper' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"url": "https://example.com",
"commands": []
}
}' \
> output.html
With Automation Commands:
curl -X POST 'https://e.customjs.io/scraper' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": {
"url": "https://example.com",
"commands": [
{"action": "click", "selector": "button.load-more"},
{"action": "wait", "value": 2000},
{"action": "type", "selector": "input#search", "value": "CustomJS"}
]
}
}' \
> output.html
Content-Type: text/html
Returns HTML content as text.
The commands parameter accepts an array of automation actions that are executed before taking a screenshot or scraping HTML. Each command is an object with the following structure:
| Action | Parameters | Description | Example |
|---|---|---|---|
click | selector | Click on an element | {"action": "click", "selector": "#button"} |
type | selector, value | Type text into an input field | {"action": "type", "selector": "#search", "value": "text"} |
scroll | value | Scroll down by pixels | {"action": "scroll", "value": 500} |
wait | value | Wait for milliseconds | {"action": "wait", "value": 1000} |
waitForSelector | selector | Wait for element to appear | {"action": "waitForSelector", "selector": ".content"} |
hover | selector | Hover over an element | {"action": "hover", "selector": ".menu-item"} |
{
"commands": [
{"action": "waitForSelector", "selector": "#content"},
{"action": "click", "selector": "#accept-cookies"},
{"action": "wait", "value": 1000},
{"action": "type", "selector": "input#search", "value": "CustomJS"},
{"action": "click", "selector": "button[type='submit']"},
{"action": "wait", "value": 2000},
{"action": "scroll", "value": 500}
]
}
/__js1-https://e.customjs.io/__js1-
Execute custom JavaScript code with input data and access to available NPM modules.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
Content-Type | string | ✓ | Must be application/json |
{
"input": "{\"name\":\"Jon Doe\"}",
"code": "return input.name"
}
| Name | Type | Required | Description |
|---|---|---|---|
input | string | ✓ | Input data for your code. Can be a simple value (e.g., "34324") or an escaped JSON string (e.g., "{\"name\":\"Jon Doe\"}") |
code | string | ✓ | JavaScript code to execute. Use input to access the parsed input data |
curl -X POST 'https://e.customjs.io/__js1-' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"input": "{\"name\":\"Jon Doe\"}",
"code": "return input.name"
}'
Returns the result of the executed JavaScript code.
The following NPM modules are available for use in CustomJS. Contact us if you would like to use another NPM module.
const cheerio = require('cheerio');
const { v4: uuidv4 } = require('uuid');
const axios = require('axios').default;
const AWS = require('@aws-sdk/client-s3'); // Typically you import specific AWS services
const jsrsasign = require('jsrsasign');
const forge = require('node-forge'); // Package is typically called 'node-forge'
const { piexif } = require('piexifjs');
const jsrsasignUtil = require('jsrsasign-util');
const jsonwebtoken = require('jsonwebtoken');
const crypto = require('crypto');
const { Configuration, OpenAIApi } = require('openai');
const JavaScriptObfuscator = require('javascript-obfuscator');
const { AuthRocket } = require('@authrocket/authrocket-node');
const firebaseAdmin = require('firebase-admin');
const { PDFDocument, StandardFonts, rgb } = require('pdf-lib');
const mysql2 = require('mysql2');
const cryptoJs = require('crypto-js');
const nodemailer = require('nodemailer');
const converter = require('json-2-csv');
const htmlToText = require('html-to-text');
const moment = require('moment');
const Alexa = require('ask-sdk-core');
const jose = require('jose');
const { nanoid } = require('nanoid');
const { getJson } = require('serpapi');
const { Storage } = require('@google-cloud/storage');
The HTML Pages API allows you to host, deploy, and manage HTML pages. You can create, update, retrieve, and delete HTML pages using a different base domain.
Base URL: https://api.app.customjs.io
/pages/page/upsert-htmlhttps://api.app.customjs.io/pages/page/upsert-html
Create or update an HTML page. If a page with the specified name already exists, it will be updated; otherwise, a new page will be created.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
{
"name": "my-landing-page",
"htmlContent": "<!DOCTYPE html><html><head><title>My Page</title></head><body><h1>Hello World</h1></body></html>",
"slug": "custom-url-slug"
}
| Name | Type | Required | Description |
|---|---|---|---|
name | string | ✓ | Unique identifier for the HTML page. If a page with this name already exists, it will be updated; otherwise a new page will be created |
htmlContent | string | ✓ | HTML content to host (max 10MB) |
slug | string | ✗ | Custom URL slug (lowercase letters, numbers, and hyphens only, 3-100 characters) |
curl -X POST 'https://api.app.customjs.io/pages/page/upsert-html' \
-H 'x-api-key: YOUR_API_KEY' \
-H 'Content-Type: application/json' \
-d '{
"name": "my-landing-page",
"htmlContent": "<!DOCTYPE html><html><head><title>My Page</title></head><body><h1>Hello World</h1></body></html>",
"slug": "my-custom-page"
}'
Content-Type: application/json
{
"pageId": "abc123",
"htmlFileUrl": "https://...",
"name": "my-landing-page",
"message": "Page created successfully",
"created": true
}
| Field | Type | Description |
|---|---|---|
pageId | string | Unique identifier for the page |
htmlFileUrl | string | URL where the HTML page is hosted |
name | string | Name of the page |
message | string | Success message |
created | boolean | true if a new page was created, false if an existing page was updated |
/pages/api/pagehttps://api.app.customjs.io/pages/api/page
Retrieve all HTML pages for your workspace.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
curl -X GET 'https://api.app.customjs.io/pages/api/page' \
-H 'x-api-key: YOUR_API_KEY'
Content-Type: application/json
Returns an array of page objects.
/pages/api/page/id/{pageId}https://api.app.customjs.io/pages/api/page/id/{pageId}
Retrieve a specific HTML page by its ID.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string | ✓ | The unique identifier of the page |
curl -X GET 'https://api.app.customjs.io/pages/api/page/id/abc123' \
-H 'x-api-key: YOUR_API_KEY'
Content-Type: application/json
Returns the page object with full details.
/pages/api/page/id/{pageId}https://api.app.customjs.io/pages/api/page/id/{pageId}
Delete a specific HTML page by its ID.
| Name | Type | Required | Description |
|---|---|---|---|
x-api-key | string | ✓ | Your API key |
| Name | Type | Required | Description |
|---|---|---|---|
pageId | string | ✓ | The unique identifier of the page to delete |
curl -X DELETE 'https://api.app.customjs.io/pages/api/page/id/abc123' \
-H 'x-api-key: YOUR_API_KEY'
Content-Type: application/json
Returns a success message confirming the deletion.
All API endpoints include rate limit information in the response headers:
| Header | Description |
|---|---|
x-ratelimit-limit | Maximum number of requests allowed per time window (e.g., 500) |
x-ratelimit-used | Number of requests used in the current time window |
x-ratelimit-remaining | Number of requests remaining in the current time window |
Example Response Headers:
x-ratelimit-used: 294
x-ratelimit-remaining: 206
x-ratelimit-limit: 500
All APIs return standard HTTP status codes:
| Status Code | Description |
|---|---|
200 | ✓ Success |
400 | ✗ Bad Request - Invalid parameters |
401 | ✗ Unauthorized - Invalid API key |
500 | ✗ Internal Server Error |