Skip to main content

API Reference

The Lightning Enable API is a RESTful web service for integrating Bitcoin Lightning payments into your platform.

Base URL

https://api.lightningenable.com

Authentication

All API requests require authentication via the X-API-Key header:

curl -X GET https://api.lightningenable.com/api/merchant/me \
-H "X-API-Key: YOUR_API_KEY"

See Authentication for details.

API Endpoints

Payments

MethodEndpointDescription
POST/api/paymentsCreate payment invoice
GET/api/payments/{invoiceId}/statusPublic payment status (no API key — safe for browser polling)
GET/api/payments/{invoiceId}Get payment by ID
GET/api/payments/order/{orderId}Get payment by order ID
POST/api/payments/{invoiceId}/syncSync status from your payment provider

Refunds

MethodEndpointDescription
POST/api/refundsCreate refund
GET/api/refunds/{refundId}Get refund status
GET/api/refundsList all refunds
GET/api/refunds/invoice/{invoiceId}Get refunds for invoice
POST/api/refunds/{refundId}/syncSync refund status from your payment provider

L402 Protocol

MethodEndpointDescription
POST/api/l402/challengesCreate an L402 challenge (producer API)
POST/api/l402/challenges/verifyVerify an L402 token (producer API)
GET/api/l402/pricingGet L402 endpoint pricing
GET/api/l402/statusCheck L402 auth status
*/l402/proxy/{proxyId}/*L402-protected proxy

See the Producer API Reference for the challenge/verify contract.

Webhooks

MethodEndpointDescription
POST/api/webhooks/opennodeOpenNode webhook receiver
POST/api/webhooks/strikeStrike webhook receiver

These receive events from your payment provider — your own notifications arrive at the callback URL you configure. See Webhooks.

Merchant Settings (Self-Service)

MethodEndpointDescription
GET/api/merchant/meGet account info and onboarding status
GET/api/merchant/subscriptionGet subscription details
GET/api/merchant/l402-statusGet L402 feature status
GET/api/merchant/api-key-infoAPI key metadata (created/last-rotated)
GET/api/merchant/quickstartGet onboarding guide
POST/api/merchant/regenerate-keyRegenerate your API key
PUT/api/merchant/payment-providerSwitch payment provider (Strike/OpenNode)
PUT/api/merchant/strike-keyUpdate Strike API key
PUT/api/merchant/opennode-keyUpdate OpenNode API key
PUT/api/merchant/webhook-urlUpdate webhook URL
POST/api/merchant/validate-strikeValidate Strike API key
POST/api/merchant/validate-opennodeValidate OpenNode API key

Full request/response schemas: Merchant Settings.

Health Check

MethodEndpointDescription
GET/healthStructured health check (public, no auth required)

Request Format

Headers

HeaderRequiredDescription
X-API-KeyYesYour merchant API key
Content-TypeYes (POST/PUT)application/json
X-Idempotency-KeyNoPrevents duplicate payments/refunds (UUID recommended)
X-Correlation-IdNoRequest tracing ID (auto-generated if not provided)

See Request Headers for full details on idempotency, correlation IDs, and API versioning.

Request Body

POST and PUT requests accept JSON bodies:

{
"orderId": "ORDER-12345",
"amount": 99.99,
"currency": "USD"
}

Response Format

Success Response

{
"invoiceId": "1042",
"status": "unpaid",
"amount": 99.99,
"currency": "USD"
}

Error Response

Errors carry an error field (sometimes with a message); there is no machine-readable code field — dispatch on the HTTP status:

{ "error": "Invoice already exists for OrderId ORDER-12345" }

Model-binding validation failures return the standard ASP.NET validation problem shape (400 with an errors dictionary). See Errors.

HTTP Status Codes

CodeDescription
200Success
201Created
400Bad Request - Invalid parameters
401Unauthorized - Invalid API key
402Payment Required - L402 payment needed
403Forbidden - Access denied
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limited
500Server Error

Pagination

List endpoints support pagination using skip and take parameters:

GET /api/refunds?skip=0&take=20
ParameterDefaultDescription
skip0Number of records to skip
take50Number of records to return (max 100)

Example - get second page of 20 results:

GET /api/refunds?skip=20&take=20

Rate Limiting

PolicyLimitApplied To
Global100/minAll authenticated requests (per API key)
Read200/minGET operations
Payment Create10/minPOST /api/payments, POST /api/refunds
Admin30/minInternal admin endpoints

See Rate Limiting for details.

SDKs and Libraries

Official L402 client libraries (auto-paying HTTP clients):

Official Agent SDKs (higher-level agent commerce primitives):

For MCP-server integration (Claude Desktop, Claude Code, etc.), see the Lightning Enable MCP repository.

Quick Examples

Create Payment

curl -X POST https://api.lightningenable.com/api/payments \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"orderId": "ORDER-12345",
"amount": 49.99,
"currency": "USD",
"description": "Premium Subscription"
}'

Check Payment Status

curl https://api.lightningenable.com/api/payments/1042 \
-H "X-API-Key: YOUR_API_KEY"

Create Refund

curl -X POST https://api.lightningenable.com/api/refunds \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"invoiceId": "1042",
"refundAddress": "bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh",
"reason": "Customer request"
}'

Health Check Endpoint

The /health endpoint returns structured JSON describing the status of the API and its dependencies. It is public and does not require authentication, making it suitable for external monitoring and infrastructure health probes.

Request

curl https://api.lightningenable.com/health

Response

{
"status": "Healthy",
"totalDuration": 42.15,
"checks": [
{
"name": "database",
"status": "Healthy",
"duration": 38.72,
"description": null,
"exception": null,
"tags": ["db", "sql"]
}
]
}

Response Fields

FieldTypeDescription
statusstringOverall health: Healthy, Degraded, or Unhealthy
totalDurationnumberTotal time to run all checks (milliseconds)
checksarrayIndividual health check results
checks[].namestringName of the check (e.g., database)
checks[].statusstringCheck result: Healthy, Degraded, or Unhealthy
checks[].durationnumberTime for this check (milliseconds)
checks[].descriptionstring|nullOptional description from the check
checks[].exceptionstring|nullError message if the check failed
checks[].tagsarrayTags for categorizing checks (e.g., ["db", "sql"])

HTTP Status Codes

CodeMeaning
200All checks passed (Healthy)
503One or more checks failed (Unhealthy)

Current Checks

CheckTagsWhat It Verifies
databasedb, sqlSQL Server connectivity via EF Core CanConnectAsync

Unhealthy Response Example

When the database is unreachable, the endpoint returns HTTP 503:

{
"status": "Unhealthy",
"totalDuration": 5023.41,
"checks": [
{
"name": "database",
"status": "Unhealthy",
"duration": 5001.88,
"description": null,
"exception": "A network-related or instance-specific error occurred while establishing a connection to SQL Server.",
"tags": ["db", "sql"]
}
]
}

Using with Monitoring Tools

Azure App Service Health Probes:

Configure in the Azure portal under Monitoring > Health check:

  • Path: /health
  • The probe will automatically mark the instance as unhealthy after consecutive failures.

UptimeRobot / Pingdom / External Monitors:

Point your uptime monitor at:

https://api.lightningenable.com/health
  • Alert on HTTP status code other than 200
  • Recommended check interval: 1 minute
  • Parse the JSON response to alert on specific check failures (e.g., checks[0].status != "Healthy")

curl Quick Check:

# Check overall status
curl -s https://api.lightningenable.com/health | jq '.status'

# Check database specifically
curl -s https://api.lightningenable.com/health | jq '.checks[] | select(.name == "database") | .status'

Next Steps