API Reference
Complete REST API documentation for Booloopay.
Generate an API key in the dashboard to authenticate your requests. Generate API key →
Authentication
Every request must include your API key as a Bearer token in the Authorization header.
Example request
Authorization: Bearer bpay_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Responses: All responses are JSON. Successful responses wrap data in a
data
field. Errors include an
error
field.
Base URL:
https://test.booloopay.com/api/v1
Customers
Manage your customers via the API. Customers can be linked to payment and signature requests.
/api/v1/customers
List all customers
Returns a list of all customers in your organization.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Filter by name, company, or email. |
Example request
curl https://test.booloopay.com/api/v1/customers \ -H "Authorization: Bearer bpay_xxxx"
Example response
{
"data": [
{
"id": 1,
"first_name": "Alice",
"last_name": "Martin",
"email": "alice@example.com",
"company": "Acme Corp",
"phone": "+33 6 00 00 00 00",
"address": "12 rue de la Paix, Paris",
"inserted_at": "2026-06-01T10:00:00Z"
}
]
}
/api/v1/customers
Create a customer
Creates a new customer.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| first_name | string | Required | First name. |
| last_name | string | Required | Last name. |
| string | Required | Email address. | |
| phone | string | Optional | Phone number. |
| company | string | Optional | Company name. |
| address | string | Optional | Full address. |
Example request
curl -X POST https://test.booloopay.com/api/v1/customers \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"first_name":"Alice","last_name":"Martin","email":"alice@example.com"}'
Example response
HTTP 201 Created
{
"data": {
"id": 1,
"first_name": "Alice",
"last_name": "Martin",
"email": "alice@example.com",
"company": null,
"phone": null,
"address": null,
"inserted_at": "2026-06-18T14:00:00Z"
}
}
/api/v1/customers/:id
Retrieve a customer
Retrieves a specific customer by ID.
Example request
curl https://test.booloopay.com/api/v1/customers/1 \ -H "Authorization: Bearer bpay_xxxx"
/api/v1/customers/:id
Update a customer
Updates one or more fields of a customer.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| first_name | string | Optional | First name. |
| last_name | string | Optional | Last name. |
| string | Optional | Email address. | |
| phone | string | Optional | Phone number. |
| company | string | Optional | Company name. |
| address | string | Optional | Full address. |
Example request
curl -X PUT https://test.booloopay.com/api/v1/customers/1 \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"company":"Acme Corp"}'
/api/v1/customers/:id
Delete a customer
Permanently deletes a customer. Returns 204 with no body.
Example request
curl -X DELETE https://test.booloopay.com/api/v1/customers/1 \ -H "Authorization: Bearer bpay_xxxx"
Payment Requests
Create and manage payment requests. Each request generates a unique payment link.
/api/v1/payment_requests
List all payment requests
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Filter by description. |
| status | string | Optional | pending · paid · expired · cancelled |
Example request
curl "https://test.booloopay.com/api/v1/payment_requests?status=pending" \ -H "Authorization: Bearer bpay_xxxx"
Example response
{
"data": [
{
"id": 42,
"public_id": "pr_abc123",
"description": "Invoice #2026-01",
"amount_cents": 15000,
"currency": "EUR",
"status": "pending",
"due_date": "2026-07-01",
"customer_id": 1,
"pay_url": "https://yourapp.com/pay/pr_abc123",
"inserted_at": "2026-06-18T10:00:00Z",
"updated_at": "2026-06-18T10:00:00Z"
}
]
}
/api/v1/payment_requests
Create a payment request
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| description | string | Required | A short description of the payment. |
| amount_cents | integer | Required | Amount in the smallest currency unit (e.g. 1500 = 15.00 EUR). |
| currency | string | Optional | ISO 4217 currency code. Defaults to your organization currency. |
| due_date | string | Optional | Expiry date in YYYY-MM-DD format. |
| customer_id | integer | Optional | ID of an existing customer to link. |
Example request
curl -X POST https://test.booloopay.com/api/v1/payment_requests \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"description":"Invoice #2026-01","amount_cents":15000,"currency":"EUR","due_date":"2026-07-01"}'
Example response
HTTP 201 Created
{
"data": {
"id": 42,
"public_id": "pr_abc123",
"description": "Invoice #2026-01",
"amount_cents": 15000,
"currency": "EUR",
"status": "pending",
"due_date": "2026-07-01",
"customer_id": null,
"pay_url": "https://yourapp.com/pay/pr_abc123",
"inserted_at": "2026-06-18T10:00:00Z",
"updated_at": "2026-06-18T10:00:00Z"
}
}
/api/v1/payment_requests/:id
Retrieve a payment request
Retrieves a specific payment request by ID.
Example request
curl https://test.booloopay.com/api/v1/payment_requests/42 \ -H "Authorization: Bearer bpay_xxxx"
/api/v1/payment_requests/:id
Update a payment request
Updates one or more fields of a payment request.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| description | string | Optional | A short description of the payment. |
| amount_cents | integer | Optional | Amount in the smallest currency unit. |
| due_date | string | Optional | Expiry date in YYYY-MM-DD format. |
| customer_id | integer | Optional | ID of a customer to link. |
Example request
curl -X PUT https://test.booloopay.com/api/v1/payment_requests/42 \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"amount_cents":20000}'
/api/v1/payment_requests/:id
Cancel a payment request
Cancels a payment request. Returns 204 with no body.
Example request
curl -X DELETE https://test.booloopay.com/api/v1/payment_requests/42 \ -H "Authorization: Bearer bpay_xxxx"
Signature Requests
Send documents for e-signature and track their signing status.
/api/v1/signature_requests
List all signature requests
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| search | string | Optional | Filter by title or signer name. |
| status | string | Optional | pending · signed · declined |
Example request
curl "https://test.booloopay.com/api/v1/signature_requests?status=pending" \ -H "Authorization: Bearer bpay_xxxx"
Example response
{
"data": [
{
"id": 7,
"public_id": "sig_xyz789",
"title": "NDA — Acme Corp",
"signer_name": "Bob Smith",
"signer_email": "bob@example.com",
"status": "pending",
"message": "Please review and sign.",
"expires_at": "2026-07-18T00:00:00Z",
"signed_at": null,
"sign_url": "https://yourapp.com/sign/sig_xyz789",
"customer_id": 1,
"document_id": 3,
"inserted_at": "2026-06-18T10:00:00Z"
}
]
}
/api/v1/signature_requests
Create a signature request
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| title | string | Required | Title of the document to sign. |
| signer_name | string | Required | Full name of the signer. |
| signer_email | string | Required | Email address of the signer. |
| message | string | Optional | A message shown to the signer. |
| expires_in_days | integer | Optional | Number of days before the signing link expires. |
| customer_id | integer | Optional | ID of an existing customer to link. |
| document_id | integer | Optional | ID of an uploaded document to reference. |
Example request
curl -X POST https://test.booloopay.com/api/v1/signature_requests \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"title":"NDA — Acme Corp","signer_name":"Bob Smith","signer_email":"bob@example.com","expires_in_days":30}'
Example response
HTTP 201 Created
{
"data": {
"id": 7,
"public_id": "sig_xyz789",
"title": "NDA — Acme Corp",
"signer_name": "Bob Smith",
"signer_email": "bob@example.com",
"status": "pending",
"message": null,
"expires_at": "2026-07-18T00:00:00Z",
"signed_at": null,
"sign_url": "https://yourapp.com/sign/sig_xyz789",
"customer_id": null,
"document_id": null,
"inserted_at": "2026-06-18T10:00:00Z"
}
}
/api/v1/signature_requests/:id
Retrieve a signature request
Retrieves a specific signature request by ID.
Example request
curl https://test.booloopay.com/api/v1/signature_requests/7 \ -H "Authorization: Bearer bpay_xxxx"
/api/v1/signature_requests/:id
Delete a signature request
Deletes a signature request. Returns 204 with no body.
Example request
curl -X DELETE https://test.booloopay.com/api/v1/signature_requests/7 \ -H "Authorization: Bearer bpay_xxxx"
Guarantees
Create and manage security deposits (cautions). A guarantee authorizes a hold on the customer's card via Stripe; you can later capture or release it.
/api/v1/guarantees
List all guarantees
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | Optional | all · draft · pending · authorized · captured · released · cancelled |
| search | string | Optional | Filter by customer name, email or reason. |
Example request
curl "https://test.booloopay.com/api/v1/guarantees?status=authorized" \ -H "Authorization: Bearer bpay_xxxx"
Example response
{
"data": [
{
"id": 1,
"public_id": "g_abc123",
"status": "authorized",
"guarantee_type": "deposit",
"customer_name": "Alice Martin",
"customer_email": "alice@example.com",
"customer_phone": "+33 6 00 00 00 00",
"reason": "Caution location appartement",
"reference": "REF-2026-001",
"amount_cents": 150000,
"currency": "EUR",
"captured_amount_cents": null,
"expiration_date": "2027-06-01",
"stripe_payment_intent_id": "pi_xxx",
"renewal_count": 0,
"guarantee_url": "https://yourapp.com/guarantee/g_abc123",
"inserted_at": "2026-06-01T10:00:00Z",
"updated_at": "2026-06-01T10:00:00Z"
}
]
}
/api/v1/guarantees/stats
Get statistics
Returns aggregate counts and total authorized amount for the organization.
Example request
curl https://test.booloopay.com/api/v1/guarantees/stats \ -H "Authorization: Bearer bpay_xxxx"
Example response
{
"data": {
"total": 12,
"authorized": 8,
"draft": 2,
"captured": 1,
"released": 1,
"total_authorized_cents": 1200000
}
}
/api/v1/guarantees
Create a guarantee
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| guarantee_type | string | Required | deposit · rental · other |
| customer_name | string | Required | Full name of the customer. |
| customer_email | string | Required | Email address of the customer. |
| customer_phone | string | Optional | Phone number of the customer. |
| reason | string | Required | Purpose of the guarantee (e.g. "Caution location"). |
| reference | string | Optional | Your internal reference number. |
| amount_cents | integer | Required | Amount to hold, in the smallest currency unit (e.g. 150000 = €1 500). |
| currency | string | Optional | ISO 4217 code. Defaults to EUR. |
| expiration_date | string | Required | ISO 8601 date when the guarantee expires (e.g. "2027-06-01"). |
| channels | array | Optional | Notification channels. Defaults to ["email"]. |
| customer_id | integer | Optional | ID of an existing customer to link. |
Example request
curl -X POST https://test.booloopay.com/api/v1/guarantees \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"guarantee_type":"deposit","customer_name":"Alice Martin","customer_email":"alice@example.com","reason":"Caution location","amount_cents":150000,"expiration_date":"2027-06-01"}'
Example response
HTTP 201 Created
{
"data": {
"id": 1,
"public_id": "g_abc123",
"status": "draft",
"guarantee_type": "deposit",
"customer_name": "Alice Martin",
"customer_email": "alice@example.com",
"customer_phone": null,
"reason": "Caution location appartement",
"reference": null,
"amount_cents": 150000,
"currency": "EUR",
"captured_amount_cents": null,
"expiration_date": "2027-06-01",
"stripe_payment_intent_id": null,
"renewal_count": 0,
"guarantee_url": "https://yourapp.com/guarantee/g_abc123",
"inserted_at": "2026-06-18T14:00:00Z",
"updated_at": "2026-06-18T14:00:00Z"
}
}
/api/v1/guarantees/:id
Retrieve a guarantee
Retrieves a specific guarantee by ID.
Example request
curl https://test.booloopay.com/api/v1/guarantees/1 \ -H "Authorization: Bearer bpay_xxxx"
/api/v1/guarantees/:id/send
Send a guarantee
Sends the guarantee link to the customer by email. The guarantee must be in draft status.
Example request
curl -X POST https://test.booloopay.com/api/v1/guarantees/1/send \ -H "Authorization: Bearer bpay_xxxx"
/api/v1/guarantees/:id/renew
Renew a guarantee
Extends an authorized guarantee with a new expiration date and notifies the customer.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| expiration_date | string | Required | New expiration date in ISO 8601 format. |
Example request
curl -X POST https://test.booloopay.com/api/v1/guarantees/1/renew \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"expiration_date":"2028-06-01"}'
/api/v1/guarantees/:id/release
Release a guarantee
Cancels the Stripe authorization and releases the hold on the customer's card. The guarantee must be authorized.
Example request
curl -X POST https://test.booloopay.com/api/v1/guarantees/1/release \ -H "Authorization: Bearer bpay_xxxx"
/api/v1/guarantees/:id/capture
Capture a guarantee
Captures (charges) the held amount from the customer's card. You can capture a partial amount by passing the amount field. The guarantee must be authorized.
Request body
| Name | Type | Required | Description |
|---|---|---|---|
| amount | number | Optional | Amount to capture in the account currency (e.g. 800.00 for €800). Defaults to the full guaranteed amount. |
Example request
curl -X POST https://test.booloopay.com/api/v1/guarantees/1/capture \
-H "Authorization: Bearer bpay_xxxx" \
-H "Content-Type: application/json" \
-d '{"amount": 800.00}'
/api/v1/guarantees/:id/proof
Get proof of guarantee
Returns the guarantee object along with the full audit trail of events (creation, send, authorization, capture, release).
Example request
curl https://test.booloopay.com/api/v1/guarantees/1/proof \ -H "Authorization: Bearer bpay_xxxx"
Error codes
The API uses standard HTTP status codes.
| Code | Status | Meaning |
|---|---|---|
200
|
OK | Request succeeded. |
201
|
Created | Resource created successfully. |
204
|
No Content | Resource deleted. No body returned. |
401
|
Unauthorized | Missing or invalid API key. |
403
|
Forbidden | The resource exists but belongs to another organization. |
404
|
Not Found | The resource does not exist. |
422
|
Unprocessable | Validation failed. Check the errors field in the response. |
500
|
Server Error | Something went wrong on our end. |
Validation error example
HTTP 422 Unprocessable Entity
{
"error": "Validation failed",
"errors": {
"first_name": ["can't be blank"],
"email": ["has invalid format"]
}
}
Authentication error example
HTTP 401 Unauthorized
{
"error": "Invalid or missing API key"
}