Developers

Invoice Journey API

Create invoices, email them to clients, and poll payment status from any backend with a single API key.

Overview

Base URL: https://server.invoicejourney.com

All requests and responses use JSON. Creating an invoice with send: true (default) emails the recipient immediately.

  • GET /v1/ping — test that your API key works
  • GET /v1/invoices — list invoices (paginated)
  • POST /v1/invoices — create and send
  • GET /v1/invoices/:id — status JSON
  • POST /v1/invoices/:id/send — send an existing draft

Authentication

Create keys in Settings → API Keys. Pass the key on every request:

Headers
Authorization: Bearer ij_live_...
# or
X-Api-Key: ij_live_...

Idempotency-Key: unique-string-per-create  # required on POST

Keys are shown only once at creation. Revoke compromised keys immediately from Settings.

Test connection

Call GET /v1/ping to verify your API key and connectivity. A successful response means auth is working.

cURL
curl https://server.invoicejourney.com/v1/ping \
  -H "Authorization: Bearer ij_live_YOUR_KEY"
Example response
{
  "ok": true,
  "service": "InvoiceJourney API",
  "version": "1.0.1",
  "plan": "pro",
  "business_id": "…"
}

Plan limits

The external developer API requires an active Pro subscription for the Business workspace. App and Web invoicing, customer invoice access, and payment feedback remain available on Free. Pro includes unlimited issued invoices; API request rates and key counts still have technical limits:

PlanAPI keysRate limit
Pro5200 requests / 15 min

List invoices

Retrieve invoices for your business with pagination. Defaults: page=1, limit=20 (max 100).

Optional filters: status, customer_id.

cURL
curl "https://server.invoicejourney.com/v1/invoices?page=1&limit=20" \
  -H "Authorization: Bearer ij_live_YOUR_KEY"
Example response
{
  "invoices": [ /* status objects */ ],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 42,
    "total_pages": 3,
    "has_more": true
  }
}

Create & send an invoice

Required: items and either a client object or customer_id. Optional: notes, terms, payment_link, tax_rate, tax_name, taxes, currency, dates, discount.

Each item can set tax_behavior to inherit, rate, or exempt. For compatibility, omitted values with a zero item tax rate inherit invoice taxes; positive item rates remain overrides.

The current API records full-balance invoices only. Deposit and payment-schedule fields are reserved for a future plan and are rejected when they contain non-zero terms.

Request body
{
  "client": {
    "name": "Acme Corp",
    "email": "billing@acme.com",
    "company": "Acme Corp",
    "address": "123 Main St, Austin, TX"
  },
  "items": [
    {
      "description": "Monthly bookkeeping",
      "quantity": 1,
      "rate": 450,
      "tax_behavior": "inherit",
      "tax_rate": 0
    }
  ],
  "notes": "Thank you for your business.",
  "terms": "Net 14",
  "payment_link": "https://pay.example.com/acme",
  "tax_rate": 8.25,
  "tax_name": "Sales Tax",
  "due_date": "2026-08-23",
  "send": true
}
cURL
curl -X POST https://server.invoicejourney.com/v1/invoices \
  -H "Authorization: Bearer ij_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: create-acme-2026-08-09" \
  -d @invoice.json

# invoice.json contains the request body shown above

Set send: false to create a draft only, then call POST /v1/invoices/:id/send later.

Check invoice status

Poll status after create/send. Useful statuses include draft, sent, viewed, payment_received, and overdue. partially_paid can appear on historical records; new payments must settle the complete remaining balance.

cURL
curl https://server.invoicejourney.com/v1/invoices/INVOICE_ID \
  -H "Authorization: Bearer ij_live_YOUR_KEY"
Example response
{
  "invoice": {
    "id": "a1b2c3d4-...",
    "number": "INV-0042",
    "status": "sent",
    "currency": "USD",
    "total": 487.13,
    "amount_due": 487.13,
    "amount_paid": 0,
    "recipient": {
      "name": "Acme Corp",
      "email": "billing@acme.com"
    },
    "sent_at": "2026-08-09T10:15:00.000Z",
    "viewed_at": null,
    "paid_at": null,
    "public_url": "https://www.invoicejourney.com/invoice/x7k9m2"
  }
}

Errors

Errors return JSON with error and often a code:

  • API_KEY_REQUIRED / API_KEY_INVALID — auth
  • API_PLAN_REQUIRED — the workspace no longer has developer API access
  • PLAN_LIMIT — an applicable invoice publication limit was reached
  • API_RATE_LIMITED — slow down and retry after the rate-limit window
  • IDEMPOTENCY_KEY_REQUIRED — include Idempotency-Key on POST
  • RECIPIENT_EMAIL_REQUIRED — client email needed to send