Skip to main content
Developer API

Build Powerful Integrations

Integrate Experi into your applications with our REST API. Create invoices, manage clients, and automate your invoicing workflow programmatically.

Why Use the Experi API?

Production-ready REST API built for developers who need reliable invoicing automation

Fast & Reliable

High-performance REST API with 99.9% uptime. Rate limits of 1000 requests/minute for read operations.

Secure by Default

API keys with bcrypt encryption, rate limiting, and comprehensive audit logging for all operations.

Well Documented

Clear examples, comprehensive error handling, and detailed endpoint documentation.

Getting Started

Follow these steps to start using the Experi API in your application

1

Get API Access

The Developer API is available to PRO subscribers. After upgrading, contact our support team to request API access.

Upgrade to PRO
2

Generate an API Key

Once approved, go to the Developer section in your dashboard to generate API keys. You can create keys with different permission scopes:

Read - View clients, invoices, and other data
Write - Create, update, send invoices, and record payments
3

Make Your First Request

All API requests must include your API key in the Authorization header:

curl https://experi.co.uk/api/v1/clients \
  -H "Authorization: Bearer YOUR_API_KEY"

API Reference

Complete reference for all available API endpoints

Authentication

All API requests require authentication using a Bearer token. Include your API key in the Authorization header:

Authorization: Bearer sk_live_your_api_key_here

Rate Limiting

Read operations1000 requests/minute
Write operations100 requests/minute
Send operations50 requests/minute

Rate limit exceeded responses include a Retry-After header with seconds to wait.

Endpoints

Clients

GET
/api/v1/clients

List all clients

Query Parameters:
  • page (optional)
  • limit (optional, max 100)
POST
/api/v1/clients

Create a new client

Request Body:
{
  "name": "John Doe",
  "company": "Acme Corp",
  "email": "john@acme.com",
  "phone": "+44 20 1234 5678",
  "addressLine1": "123 Business St",
  "city": "London",
  "postcode": "SW1A 1AA",
  "country": "United Kingdom"
}
GET
/api/v1/clients/:id

Get a specific client

PUT
/api/v1/clients/:id

Update a client

Invoices

GET
/api/v1/invoices

List all invoices

Query Parameters:
  • page
  • limit
  • status (DRAFT|SENT|PAID)
  • clientId
POST
/api/v1/invoices

Create a new invoice

Request Body:
{
  "clientId": "client_id_here",
  "issueDate": "2026-02-10T00:00:00Z",
  "dueDate": "2026-02-24T00:00:00Z",
  "currency": "GBP",
  "taxName": "VAT",
  "taxRate": 20,
  "lineItems": [
    {
      "description": "Web Development",
      "quantity": 10,
      "unitPrice": 75.00
    }
  ],
  "status": "DRAFT"
}
GET
/api/v1/invoices/outstanding

Get all outstanding (unpaid) invoices

POST
/api/v1/invoices/:id/send

Send an invoice via email

Request Body:
{
  "toEmail": "client@example.com",
  "subject": "Invoice #SI-001",
  "body": "Please find attached..."
}
POST
/api/v1/invoices/:id/paid

Mark an invoice as paid

Request Body:
{
  "paymentDate": "2026-02-10T00:00:00Z",
  "amount": 900.00,
  "paymentMethod": "Bank Transfer",
  "reference": "TXN-123456"
}

Recurring Invoices

GET
/api/v1/recurring-invoices

List recurring invoices

Query Parameters:
  • isActive (true|false)
POST
/api/v1/recurring-invoices

Create a recurring invoice

Request Body:
{
  "clientId": "client_id_here",
  "frequency": "MONTHLY",
  "interval": 1,
  "startDate": "2026-03-01T00:00:00Z",
  "currency": "GBP",
  "lineItems": [...],
  "autoSend": false
}

Error Handling

All errors return a consistent format with an HTTP status code and error details:

{
  "error": {
    "message": "Validation failed",
    "statusCode": 400,
    "details": {
      "name": ["Name is required"]
    }
  }
}

Ready to Get Started?

Upgrade to PRO and request API access to start building integrations today.

Get API Access