BlissNeat API
The BlissNeat API lets you integrate expense management into your existing IT infrastructure. Use it to sync employees from your HR system, export approved expenses to your accounting software, or build custom approval workflows.
All API endpoints return JSON and require authentication. The base URL for all requests is https://blissneat.com/api/.
💡 New to APIs? Start with the Authentication section, then try the Sync from HRIS use case guide.
Authentication
BlissNeat uses JWT (JSON Web Token) authentication. Every API request must include an Authorization header with a valid access token.
Step 1 — Get your tokens
POST your manager email and password to get an access token (valid 60 minutes) and a refresh token (valid 7 days).
curl -X POST https://blissneat.com/api/token/ \
-H "Content-Type: application/json" \
-d '{
"email": "you@yourcompany.com",
"password": "yourpassword"
}'
Step 2 — Use the token
Include the access token in the Authorization header of every request:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Step 3 — Refresh when expired
curl -X POST https://blissneat.com/api/token/refresh/ \
-H "Content-Type: application/json" \
-d '{"refresh": "your_refresh_token"}'
Base URL & Errors
All endpoints are relative to: https://blissneat.com/api/
| Status Code | Meaning |
|---|---|
| 200 | Success |
| 201 | Created |
| 400 | Bad request — check your request body |
| 401 | Unauthorized — token missing or expired |
| 403 | Forbidden — your account doesn't have permission |
| 404 | Not found |
| 429 | Rate limited — slow down requests |
Employees
Manage the employees in your company. Use this to sync your HR system with BlissNeat — add new hires, deactivate leavers, update departments.
Returns all employees in your company.
curl https://blissneat.com/api/employees/ \
-H "Authorization: Bearer {token}"Response
[
{
"id": 42,
"email": "sarah@acme.com",
"first_name": "Sarah",
"last_name": "Chen",
"role": "employee",
"department": "Marketing",
"is_active": true
}
]Creates a new employee account. BlissNeat will send them a welcome email with login credentials automatically.
| Field | Type | Required | Description |
|---|---|---|---|
| string | required | Employee's work email | |
| first_name | string | required | First name |
| last_name | string | Last name | |
| department | string | Department name | |
| role | string | employee, manager, or bookkeeper |
curl -X POST https://blissneat.com/api/employees/ \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"email": "newstaff@acme.com",
"first_name": "James",
"last_name": "Park",
"department": "Sales",
"role": "employee"
}'Upload a CSV or JSON array to add multiple employees in one request. Useful when onboarding a new company or syncing from an HRIS.
curl -X POST https://blissneat.com/api/employees/bulk-import/ \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '[
{"email": "alice@acme.com", "first_name": "Alice", "department": "Finance"},
{"email": "bob@acme.com", "first_name": "Bob", "department": "Engineering"}
]'Receipts
Query and manage expense receipts submitted by employees.
Returns all receipts for your company. Filter by status to get only pending approvals.
| Query param | Values | Description |
|---|---|---|
| status | pending, approved, rejected, flagged | Filter by approval status |
| employee | employee ID | Filter by employee |
curl "https://blissneat.com/api/receipts/?status=approved" \
-H "Authorization: Bearer {token}"[
{
"id": 101,
"merchant_name": "Delta Airlines",
"total_price": "342.00",
"currency": "USD",
"status": "approved",
"employee_name": "Sarah Chen",
"submitted_at": "2026-02-15T09:23:00Z",
"approved_at": "2026-02-15T11:00:00Z"
}
]Download all approved receipts as a CSV file. Use this to import into QuickBooks, Xero, or any spreadsheet.
curl "https://blissneat.com/api/receipts/export/csv/?status=approved" \
-H "Authorization: Bearer {token}" \
-o expenses_export.csvApprovals
Approve or reject receipts programmatically. Useful for building auto-approval rules in your own systems.
Approves a pending receipt. The employee will be notified by email automatically.
curl -X POST https://blissneat.com/api/receipts/101/approve/ \
-H "Authorization: Bearer {token}"| Field | Type | Description |
|---|---|---|
| reason | string | Reason shown to the employee |
curl -X POST https://blissneat.com/api/receipts/101/reject/ \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"reason": "Missing business justification"}'Expense Policies
Read and update your company's expense policies. Use this to sync policy changes from your HR system.
curl https://blissneat.com/api/workflow-policies/ \
-H "Authorization: Bearer {token}"Departments
Manage company departments. Keep these in sync with your HR system so expense reporting stays organized.
curl https://blissneat.com/api/departments/ \
-H "Authorization: Bearer {token}"curl -X POST https://blissneat.com/api/departments/ \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{"name": "Customer Success", "budget": 5000}'Exports
Export data in bulk for your accounting or ERP system.
curl "https://blissneat.com/api/receipts/export/pdf/" \
-H "Authorization: Bearer {token}" \
-o expense_report.pdfUse Case: Sync Employees from your HRIS
When you onboard a new employee in your HR system (BambooHR, Workday, etc.), you can automatically add them to BlissNeat so they can start submitting expenses immediately.
Python example — nightly sync script
import requests
BLISSNEAT_API = "https://blissneat.com/api"
def get_token():
r = requests.post(f"{BLISSNEAT_API}/token/", json={
"email": "admin@yourcompany.com",
"password": "yourpassword"
})
return r.json()["access"]
def sync_employee(token, employee):
headers = {"Authorization": f"Bearer {token}"}
# Check if employee already exists
existing = requests.get(
f"{BLISSNEAT_API}/employees/",
headers=headers,
params={"email": employee["email"]}
).json()
if not existing:
# Create new employee
requests.post(f"{BLISSNEAT_API}/employees/", headers=headers, json={
"email": employee["email"],
"first_name": employee["first_name"],
"last_name": employee["last_name"],
"department": employee["department"],
"role": "employee"
})
print(f"Added {employee['email']}")
else:
print(f"Already exists: {employee['email']}")
# Run nightly
token = get_token()
new_hires = [ # Pull this from your HRIS API
{"email": "newperson@acme.com", "first_name": "New", "last_name": "Person", "department": "Sales"}
]
for emp in new_hires:
sync_employee(token, emp)Use Case: Export Approved Expenses to Accounting
At the end of each month, pull all approved expenses and import them into QuickBooks, Xero, or your ERP system.
import requests, csv, io
from datetime import datetime, timedelta
BLISSNEAT_API = "https://blissneat.com/api"
def export_monthly_expenses(token, month_start):
headers = {"Authorization": f"Bearer {token}"}
# Get CSV export
r = requests.get(
f"{BLISSNEAT_API}/receipts/export/csv/",
headers=headers,
params={"status": "approved"}
)
# Save to file
filename = f"expenses_{month_start.strftime('%Y_%m')}.csv"
with open(filename, 'wb') as f:
f.write(r.content)
print(f"Exported to {filename}")
return filename
token = get_token()
month_start = datetime.now().replace(day=1)
export_monthly_expenses(token, month_start)Use Case: Automate Approvals by Amount
Automatically approve receipts under a threshold amount to reduce manager workload.
import requests
BLISSNEAT_API = "https://blissneat.com/api"
AUTO_APPROVE_UNDER = 50 # Auto-approve anything under $50
def auto_approve_small_receipts(token):
headers = {"Authorization": f"Bearer {token}"}
# Get all pending receipts
receipts = requests.get(
f"{BLISSNEAT_API}/receipts/",
headers=headers,
params={"status": "pending"}
).json()
approved = 0
for receipt in receipts:
amount = float(receipt.get("total_price") or 0)
if amount < AUTO_APPROVE_UNDER:
requests.post(
f"{BLISSNEAT_API}/receipts/{receipt['id']}/approve/",
headers=headers
)
approved += 1
print(f"Auto-approved: {receipt['merchant_name']} ${amount}")
print(f"Done. Auto-approved {approved} receipts.")
token = get_token()
auto_approve_small_receipts(token)Interactive API Explorer
Try every endpoint directly in your browser with our interactive Swagger UI. You can authenticate and make real API calls without writing any code.
Open Swagger UI → Open ReDoc →