Skip to main content
Understand the fundamentals of the Intelliprint hybrid mail and UK postal mail API before diving into code. This page covers how the API works, the main objects you will use, and key concepts like authentication, test mode, and confirmation.

API Design

The Intelliprint API is designed to be:
  • RESTful - Predictable URLs and standard HTTP methods
  • Flexible - Accept JSON or multipart/form-data
  • JSON-encoded - All responses are JSON with standard HTTP status codes
  • Developer-friendly - Clear error messages and comprehensive documentation
Base URL: https://api.intelliprint.net/v1

Authentication

All API requests require authentication using an API key in the Authorization header.
1

Create an API key

Navigate to your API Keys page in the Intelliprint dashboard and create a new key.
2

Include it in requests

Pass your API key using Bearer authentication:
Authorization: Bearer your-api-key-here
Keep your API key secure! Never expose it in client-side code, commit it to version control, or share it publicly. Treat it like a password.

Authentication Example

import Intelliprint from 'intelliprint';

// Initialize with your API key
const ip = Intelliprint('your-api-key-here');

// Or set as environment variable
const ip = Intelliprint(process.env.INTELLIPRINT_API_KEY);

Core Objects

The Intelliprint API revolves around four main objects: Print jobs are the core resource - they represent a collection of letters or postcards to be sent. Each print job can contain one item or thousands at once. Object type: print Key properties:
  • id - Unique identifier (e.g., print_eg)
  • testmode - Whether this is a test (not charged, not sent)
  • confirmed - Whether submitted for printing
  • type - Either letter or postcard
  • letters - Array of individual mail items
  • cost - Pricing details

Backgrounds

Backgrounds let you apply reusable designs like letterheads and logos to your print jobs. Upload once, reuse everywhere. Object type: background Key properties:
  • id - Unique identifier (e.g., bg_eg)
  • name - User-friendly name for dashboard
  • file - Uploaded background file details

Mailing Lists

Mailing lists store groups of recipients, allowing you to send to multiple people with a single operation. Object type: mailing_list Key properties:
  • id - Unique identifier (e.g., mal_eg)
  • name - List name
  • recipients - Count of recipients
  • variables - Dynamic fields for personalisation

Mailing List Recipients

Individual contacts stored within a mailing list. Object type: mailing_list_recipient Key properties:
  • id - Unique identifier (e.g., mal_rcp_eg)
  • address - Recipient address details
  • variables - Personalisation data for this recipient

Object Relationships

Here’s how the objects relate to each other:

Test Mode

Test mode allows you to preview mailings without being charged or having them physically sent.
Always test first! Use test mode while developing and testing your integration.

How it works

Set testmode: true when creating or updating a print job:
const printJob = await ip.prints.create({
  testmode: true,  // This is a test - won't be charged or sent
  content: 'Your letter content here',
  recipients: [{ /* ... */ }]
});

Test Mode vs Live Mode

FeatureTest Mode (testmode: true)Live Mode (testmode: false)
CostFree - no chargesCharged to your account
SendingNot physically sentPrinted and mailed
API behaviourIdentical to liveIdentical to test
PDFsGenerated and accessibleGenerated and accessible
TrackingSimulatedReal tracking numbers
Test mode print jobs appear in your dashboard with a “TEST” badge so you can easily distinguish them from live mailings.

Confirmation Workflow

Print jobs use a two-stage workflow: draftconfirmed.

Draft Mode (Default)

By default, print jobs are created as unconfirmed drafts:
{
  "confirmed": false  // Default
}
Draft print jobs:
  • Can be updated freely
  • Are not sent for printing
  • Can be previewed and reviewed
  • Ideal for human-driven workflows

Confirmed Mode

Set confirmed: true to submit for printing:
{
  "confirmed": true
}
Confirmed print jobs:
  • Are submitted to our print queue
  • Cannot be updated (immutable)
  • Will be printed and mailed
  • Can be cancelled if not yet printed
Same-day handover to Royal Mail: If you confirm a print job before 3pm UK time, we aim to print it and hand it over to Royal Mail on the same business day.
Jobs confirmed after 3pm are processed the next business day. Delivery times quoted for postage services are measured from Royal Mail’s acceptance of the mail, not from the moment you submit the job to Intelliprint.

Workflow Examples

Programmatic workflow (single-step):
// Create and confirm in one step
const printJob = await ip.prints.create({
  content: '<h1>Hello</h1>',
  recipients: [{address: {/* ... */}}],
  confirmed: true  // Send immediately
});
Human-driven workflow (two-step):
// Step 1: Create draft
const draft = await ip.prints.create({
  content: '<h1>Hello</h1>',
  recipients: [{address: {/* ... */}}]
  // confirmed defaults to false
});

// Step 2: Review, then confirm later
const confirmed = await ip.prints.update(draft.id, {
  confirmed: true
});
Use draft mode when building user interfaces where humans need to review before sending. Use confirmed mode for fully automated workflows.

Additional Features

Beyond the core functionality, the Intelliprint API offers several additional features for specific use cases:

Metadata

Store arbitrary key-value data alongside your print jobs for your own use. Metadata is not used by Intelliprint and is purely for your application’s needs.
const printJob = await ip.prints.create({
  content: '<h1>Invoice</h1>',
  recipients: [{address: {/* ... */}}],
  
  // Store custom metadata
  metadata: {
    customer_id: '12345',
    invoice_number: 'INV-2025-001',
    department: 'Finance',
    internal_reference: 'Q1-Campaign'
  },
  
  confirmed: true
});

// Retrieve later
console.log(printJob.metadata.customer_id);  // '12345'
Use case: Link print jobs to your internal systems by storing customer IDs, order numbers, or campaign identifiers.

Confidential Print Jobs

Mark print jobs as confidential to hide them from other users in your dashboard. Useful for sensitive mailings like salary letters or legal documents.
const printJob = await ip.prints.create({
  content: '<h1>Confidential: Salary Review</h1>',
  recipients: [{address: {/* ... */}}],
  
  // Mark as confidential
  confidential: true,
  
  confirmed: true
});

// This job is now hidden from other dashboard users
Confidential print jobs can only be viewed by the user who created them, not by other users in your account.

Confirmation Emails

Receive an email notification when a print job is confirmed and submitted for printing.
const printJob = await ip.prints.create({
  content: '<h1>Important Letter</h1>',
  recipients: [{address: {/* ... */}}],
  
  // Request confirmation email
  confirmation_email: true,
  
  confirmed: true
});

// Account owner will receive an email confirmation
Useful for important mailings where you want email confirmation in addition to the API response.

Address Validation

Address validation is a value-added service that verifies recipient addresses before sending, ensuring you only pay for deliverable mail.
Contact required: Address validation must be enabled for your account. Contact [email protected] to enable this service.
How it works:
  1. Create a mailing list with address_validation.requested: true
  2. Intelliprint validates all addresses in the list
  3. Access validation results via the API
  4. Send only to addresses that passed validation
// Create mailing list with validation
const mailingList = await ip.mailing_lists.create({
  name: 'Validated Campaign List',
  recipients: [
    {address: {line: '10 Downing Street, London', postcode: 'SW1A 2AA', country: 'GB'}},
    {address: {line: 'Invalid Address', postcode: 'XX1 1XX', country: 'GB'}}
  ],
  
  // Request address validation
  address_validation: {
    requested: true
  }
});

// Check validation status
console.log('Validation completed:', mailingList.address_validation.completed);
console.log('Passed:', mailingList.address_validation.recipients.passed);
console.log('Failed:', mailingList.address_validation.recipients.failed);
Per-recipient validation status: Each recipient has an address_validation_status field:
  • passed - Address is valid and deliverable
  • failed - Address is invalid or undeliverable
  • pending - Validation in progress
  • not_requested - Validation not requested for this list
Cost savings: Avoid paying for undeliverable mail by using address validation for large campaigns.

Next Steps

Now that you understand the core concepts, choose a quickstart guide to begin sending: