Invoice Fly data API: bills, estimates, clients
Invoice Fly (Play title Invoice Maker - Invoice Fly) is Labhouse Mobile SL's invoicing app for freelancers, trades and small studios that need to bill from a phone. After email or Google sign-in, the home tabs cover invoices and estimates with templates, line-item tax and discounts, a client list pulled from contacts, a jobs week view, expense capture, reports, and Pay with Stripe or PayPal plus optional tips. Recurring series cover retainers, an AI estimate builder turns a job description into line items, multi-user invites share a business, and the same account syncs across devices and the web client. Labhouse is a Barcelona company (Carrer de Pomaret); the Android listing is rated 4.7 from about 135,000 reviews with 1 million-plus downloads and sits in Play's top-grossing business chart. It competes with Invoice Simple, FreshBooks, Zoho Invoice and Wave as a mobile-first bill-and-estimate tool rather than a full desktop ledger.
Each sent bill carries invoiceNumber, dueDate, balanceDue, billType and billStatus, with line items as quantity, price, taxRate and taxAmount. Clients key on clientId, clientName, customerEmail and phoneNumber; the shop profile is businessId, businessName, logoUrl and canReceivePayments. The session is an idToken with uid / userId after email or Google sign-in.
Jobs schedule under jobName, scheduledDateTime and jobSiteAddress and attach to a bill as linkedJobId. Scanned spend returns expenseId, merchant, totalAmount and duplicatedExpense. Card and PayPal captures append paymentRecords with paidDate, tipAmount and alreadyPaidUrl; retainers pause as recurringInvoiceId / recurringType.
Finance ops chase unpaid EUR rows before the due date, payment desks match Stripe and PayPal captures, bookkeepers drop receipt OCR next to billed AR, and field teams turn a scheduled job into an invoice — and openData Studio turns that ledger into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Exchange sign-in token
POST
/v1/invoicefly/loginosintExchanges the Firebase idToken from email or Google sign-in for the session idToken, uid and userId that gate later bill, client and business calls.
Auth: Unauthenticated bootstrap. Body is the Firebase idToken from email or Google sign-in plus the user email. The returned idToken is sent as Authorization: Bearer on later calls.
- idToken
- uid
- userId
- token
POST /v1/invoicefly/login HTTP/1.1 Content-Type: application/json { "email": "[email protected]", "idToken": "eyJhbGciOi...", "uid": "usr_8f21a4c2" }{ "idToken": "eyJhbGciOi...", "uid": "usr_8f21a4c2", "userId": "usr_8f21a4c2", "email": "[email protected]", "token": "st-9c11ab" }List invoices and estimates
GET
/v1/invoicefly/invoicesopenfinancePages the signed-in business's bills — invoiceNumber, dueDate, balanceDue, billType and billStatus — that fill the Invoices and Estimates tabs.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login. Query billType filters invoice versus estimate.
- billId
- billName
- invoiceNumber
- billType
- billStatus
- clientId
- clientName
- dueDate
- balanceDue
- totalDue
- totalPaid
- taxAmount
- taxRate
- currency
- overdue
- paidDate
- invoiceLink
- billLink
- poNumber
- linkedJobId
- createdAt
- updatedAt
GET /v1/invoicefly/invoices?billType=invoice&limit=50 HTTP/1.1 Authorization: Bearer eyJhbGciOi... Accept: application/json{ "bills": [ { "billId": "bill_7c11ab", "billName": "INV-1042", "invoiceNumber": "INV-1042", "billType": "invoice", "billStatus": "unpaid", "clientId": "cli_9aa01", "clientName": "Harbor Studio LLC", "dueDate": "2026-10-15", "balanceDue": 2613.0, "totalDue": 2613.0, "totalPaid": 0, "taxAmount": 213.0, "taxRate": 8.875, "currency": "EUR", "overdue": false, "paidDate": null, "invoiceLink": "https://files.example.com/i/bill_7c11ab", "billLink": "https://files.example.com/i/bill_7c11ab", "poNumber": "PO-88", "linkedJobId": "job_22", "createdAt": "2026-09-15T16:02:11.000Z", "updatedAt": "2026-09-15T16:04:02.000Z" } ] }Create an invoice
POST
/v1/invoicefly/invoicesopenfinanceCreates a bill of billType invoice (or estimate) with line-item quantity, price, taxRate and discount, returning billId, invoiceNumber and balanceDue.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- billType
- clientId
- clientName
- dueDate
- currency
- poNumber
- linkedJobId
- items
- quantity
- price
- taxable
- discount
- taxRate
- paymentInstructions
- billId
- billName
- invoiceNumber
- billStatus
- balanceDue
- totalDue
- taxAmount
- createdAt
POST /v1/invoicefly/invoices HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "billType": "invoice", "clientId": "cli_9aa01", "clientName": "Harbor Studio LLC", "dueDate": "2026-10-15", "currency": "EUR", "poNumber": "PO-88", "linkedJobId": "job_22", "items": [ { "quantity": 1, "price": 2400.0, "taxable": true, "discount": 0, "taxRate": 8.875 } ], "paymentInstructions": "SEPA or card" }{ "billId": "bill_7c11ab", "billName": "INV-1042", "invoiceNumber": "INV-1042", "billType": "invoice", "billStatus": "unpaid", "balanceDue": 2613.0, "totalDue": 2613.0, "taxAmount": 213.0, "createdAt": "2026-09-15T16:02:11.000Z" }Email an invoice
POST
/v1/invoicefly/invoices/sendopendataSends the bill PDF to toEmail (with optional ccEmail and bccEmail) and returns invoiceLink / billLink for the client-facing copy.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login. Body identifies the bill and the recipient addresses.
- billId
- toEmail
- ccEmail
- bccEmail
- customerEmail
- billStatus
- invoiceLink
- billLink
- status
POST /v1/invoicefly/invoices/send HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "billId": "bill_7c11ab", "toEmail": "[email protected]", "ccEmail": "[email protected]", "bccEmail": "[email protected]", "customerEmail": "[email protected]" }{ "billId": "bill_7c11ab", "billStatus": "unpaid", "toEmail": "[email protected]", "invoiceLink": "https://files.example.com/i/bill_7c11ab", "billLink": "https://files.example.com/i/bill_7c11ab", "status": "sent" }Allocate next invoice number
GET
/v1/invoicefly/invoice-numberopendataReturns the next invoiceNumber / billName for the signed-in business so New Invoice can stamp a unique number before save.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login. Query billType selects invoice versus estimate numbering.
- billType
- invoiceNumber
- billName
GET /v1/invoicefly/invoice-number?billType=invoice HTTP/1.1 Authorization: Bearer eyJhbGciOi...{ "billType": "invoice", "invoiceNumber": "INV-1043", "billName": "INV-1043" }List clients
GET
/v1/invoicefly/clientsosintReturns the client directory used on New Invoice and the Clients tab — clientName, customerEmail, phoneNumber and address keyed by clientId.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- clientId
- clientName
- customerEmail
- phoneNumber
- address
- createdAt
- updatedAt
GET /v1/invoicefly/clients?limit=50 HTTP/1.1 Authorization: Bearer eyJhbGciOi...{ "clients": [ { "clientId": "cli_9aa01", "clientName": "Harbor Studio LLC", "customerEmail": "[email protected]", "phoneNumber": "+34-93-555-0142", "address": "Carrer de Mallorca 12, Barcelona", "createdAt": "2024-01-09T12:00:00.000Z", "updatedAt": "2026-09-01T09:14:22.000Z" } ] }List estimates
GET
/v1/invoicefly/estimatesopendataLists estimate bills (billType estimate, totals, accepted/declined status) shown on the Estimates tab before convert-to-invoice.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- billId
- billName
- billType
- billStatus
- clientName
- balanceDue
- taxAmount
- currency
- createdAt
- totalEstimates
GET /v1/invoicefly/estimates?limit=50 HTTP/1.1 Authorization: Bearer eyJhbGciOi...{ "estimates": [ { "billId": "est_22b", "billName": "EST-210", "billType": "estimate", "billStatus": "accepted", "clientName": "Harbor Studio LLC", "balanceDue": 1959.75, "taxAmount": 159.75, "currency": "EUR", "createdAt": "2026-09-02T10:00:00.000Z" } ], "totalEstimates": 1 }Draft an estimate with AI
POST
/v1/invoicefly/estimates/aiopendataBuilds an estimate from a jobDescription and estimateBullets, returning drafted line items with quantity, price and taxAmount.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- clientId
- jobDescription
- estimateBullets
- billId
- billType
- items
- quantity
- price
- taxable
- balanceDue
- taxAmount
POST /v1/invoicefly/estimates/ai HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "clientId": "cli_9aa01", "jobDescription": "Kitchen remodel, 12 m2", "estimateBullets": ["Demolition", "Tile", "Plumbing"] }{ "billId": "est_22c", "billType": "estimate", "estimateBullets": ["Demolition", "Tile", "Plumbing"], "items": [ {"quantity": 1, "price": 1800.0, "taxable": true} ], "balanceDue": 1959.75, "taxAmount": 159.75 }Load signed-in business
GET
/v1/invoicefly/businessopendataReturns the signed-in business profile used on Settings — businessName, logoUrl, currency, address and whether canReceivePayments is on.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- businessId
- businessName
- businessEmail
- businessPhone
- businessAddress
- businessWebsite
- businessCountryCode
- logoUrl
- currency
- canReceivePayments
GET /v1/invoicefly/business HTTP/1.1 Authorization: Bearer eyJhbGciOi...{ "businessId": "biz_k2mL", "businessName": "Alex Design Co", "businessEmail": "[email protected]", "businessPhone": "+34-93-555-0100", "businessAddress": "Carrer de Pomaret 56, Barcelona", "businessWebsite": "https://studio.example", "businessCountryCode": "ES", "logoUrl": "https://files.example.com/biz_k2mL/logo.png", "currency": "EUR", "canReceivePayments": true }Scan an expense receipt
POST
/v1/invoicefly/expenses/scanopendataRuns receipt OCR and returns an Expense with merchant, category, totalAmount and taxAmount, flagging duplicatedExpense when the same ticket was already saved.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login. Body is the receipt image for OCR.
- photoUrl
- businessId
- expenseId
- merchant
- category
- totalAmount
- taxAmount
- currency
- duplicatedExpense
POST /v1/invoicefly/expenses/scan HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "photoUrl": "<receipt-image>", "businessId": "biz_k2mL" }{ "expenseId": "exp_44", "merchant": "Ferreteria Central", "category": "materials", "totalAmount": 186.4, "taxAmount": 15.2, "currency": "EUR", "duplicatedExpense": false }List jobs
GET
/v1/invoicefly/jobsopendataLists scheduled jobs (jobName, jobSiteAddress, scheduledDateTime) that the Jobs week view shows and that New Invoice can attach via linkedJobId.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- jobId
- jobName
- jobTitle
- jobDescription
- jobSite
- jobSiteAddress
- scheduledDate
- scheduledDateTime
- clientId
- linkedJobId
- hasActiveJobs
GET /v1/invoicefly/jobs?from=2026-09-01&to=2026-10-01 HTTP/1.1 Authorization: Bearer eyJhbGciOi...{ "jobs": [ { "jobId": "job_22", "jobName": "Harbor kitchen", "jobTitle": "Kitchen remodel", "jobDescription": "12 m2 tile and plumbing", "jobSite": "Carrer de Mallorca 12", "jobSiteAddress": "Carrer de Mallorca 12, Barcelona", "scheduledDate": "2026-09-18", "scheduledDateTime": "2026-09-18T09:00:00.000Z", "clientId": "cli_9aa01", "linkedJobId": "job_22", "hasActiveJobs": true } ] }Collect Stripe payment on a bill
POST
/v1/invoicefly/payments/stripeopenbankingCharges a connected Stripe account against a bill and appends a paymentRecords row (amount, paidDate) so balanceDue and totalPaid update.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login. Used after the business connected a Stripe account.
- billId
- totalDue
- currency
- tipAmount
- billStatus
- paymentRecords
- amount
- paidDate
- status
- totalPaid
- balanceDue
POST /v1/invoicefly/payments/stripe HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "billId": "bill_7c11ab", "totalDue": 2613.0, "currency": "EUR", "tipAmount": 0 }{ "billId": "bill_7c11ab", "billStatus": "unpaid", "paymentRecords": [ { "amount": 2613.0, "currency": "EUR", "paidDate": "2026-09-20T18:11:00.000Z", "status": "succeeded" } ], "totalPaid": 2613.0, "balanceDue": 0, "tipAmount": 0 }Pause all active recurring invoices
POST
/v1/invoicefly/recurring/pauseopenfinancePauses every active recurring series for the business so retainers stop minting invoices until resumed.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login.
- businessId
- recurringInvoices
- recurringInvoiceId
- billName
- isRecurring
- recurringType
- recurringDurationUnit
- recurringDurationValue
- status
POST /v1/invoicefly/recurring/pause HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "businessId": "biz_k2mL" }{ "businessId": "biz_k2mL", "recurringInvoices": [ { "recurringInvoiceId": "rec_44", "billName": "INV-R-12", "isRecurring": true, "recurringType": "monthly", "recurringDurationUnit": "month", "recurringDurationValue": 1, "status": "paused" } ] }Collect PayPal payment on a bill
POST
/v1/invoicefly/payments/paypalopenbankingStarts PayPal checkout for a bill (optional tipAmount) and records the capture on paymentRecords with alreadyPaidUrl for the paid stamp.
Auth: Authorization: Bearer idToken from POST /v1/invoicefly/login. Used when PayPal is enabled on the business.
- billId
- totalDue
- currency
- tipAmount
- alreadyPaidUrl
- paymentRecords
- amount
- paidDate
- status
- totalPaid
- balanceDue
POST /v1/invoicefly/payments/paypal HTTP/1.1 Authorization: Bearer eyJhbGciOi... Content-Type: application/json { "billId": "bill_7c11ab", "totalDue": 2613.0, "currency": "EUR", "tipAmount": 50.0 }{ "billId": "bill_7c11ab", "alreadyPaidUrl": "https://files.example.com/paid/bill_7c11ab", "paymentRecords": [ { "amount": 2663.0, "currency": "EUR", "paidDate": "2026-09-21T11:02:00.000Z", "status": "succeeded" } ], "totalPaid": 2663.0, "balanceDue": 0, "tipAmount": 50.0 }
Data categories
- invoices
- estimates
- clients
- expenses
- jobs
- payments
- businesses
- auth-sessions
Where teams use this data
AR and due-date reconciliation
Nightly jobs pull GET /v1/invoicefly/invoices for invoiceNumber, dueDate, balanceDue, billStatus and overdue, then match GET /v1/invoicefly/clients (clientName, customerEmail) so finance can chase unpaid EUR bills before the due date.
Stripe and PayPal capture matching
Payment ops POST /v1/invoicefly/payments/stripe or POST /v1/invoicefly/payments/paypal and read paymentRecords, paidDate, tipAmount, totalPaid and alreadyPaidUrl against the bill's balanceDue.
Receipt OCR into the books
Bookkeepers POST /v1/invoicefly/expenses/scan to land merchant, category, totalAmount, taxAmount and duplicatedExpense next to GET /v1/invoicefly/business currency so spend sits beside billed AR.
Job schedule to invoice
Field desks read GET /v1/invoicefly/jobs (jobName, scheduledDateTime, jobSiteAddress) and POST /v1/invoicefly/invoices with linkedJobId, or POST /v1/invoicefly/estimates/ai from a jobDescription when the quote is still a sketch.
Frequently asked questions
How does Invoice Fly authenticate API calls?
POST /v1/invoicefly/login exchanges the Firebase idToken from email or Google sign-in (plus email and uid) for the session idToken, uid and userId. Later calls send Authorization: Bearer with that idToken.
Which endpoints expose invoices, estimates and clients?
GET /v1/invoicefly/invoices returns billId, invoiceNumber, dueDate, balanceDue, billType and billStatus. GET /v1/invoicefly/invoice-number allocates the next invoiceNumber. POST /v1/invoicefly/invoices creates a bill; POST /v1/invoicefly/invoices/send emails it to toEmail. GET /v1/invoicefly/estimates lists quotes; POST /v1/invoicefly/estimates/ai drafts one from estimateBullets. GET /v1/invoicefly/clients returns clientId, clientName, customerEmail and phoneNumber.
How are Stripe and PayPal captures recorded?
POST /v1/invoicefly/payments/stripe charges a connected Stripe account against a billId and appends paymentRecords (amount, paidDate, tipAmount) so totalPaid and balanceDue update. POST /v1/invoicefly/payments/paypal does the same via PayPal and returns alreadyPaidUrl for the paid stamp.
Can the API see jobs, expenses and the business profile?
Yes. GET /v1/invoicefly/jobs returns jobName, scheduledDateTime, jobSiteAddress and linkedJobId. POST /v1/invoicefly/expenses/scan OCRs a receipt into expenseId, merchant, totalAmount and duplicatedExpense. GET /v1/invoicefly/business returns businessName, logoUrl, currency and canReceivePayments. POST /v1/invoicefly/recurring/pause stops active series by recurringInvoiceId.
Apps similar to Invoice Fly
- Invoice Simple: Invoice Maker — Invoice Simple is a mobile invoicing app for freelancers and trades: invoices, estimates, clients, Stripe/PayPal collection and receipt OCR.
- Vyapar Invoice GST Billing App — Vyapar is an Indian GST/VAT billing and inventory app used by SMEs to raise tax invoices and track stock.
- FreshBooks — FreshBooks is a cloud accounting product for small businesses: invoices, expenses, time tracking and client retainers.
- Zoho Invoice — Zoho Invoice is Zoho's standalone invoicing app for estimates, recurring bills and online payment collection.
- Wave Invoicing — Wave is a free invoicing and accounting suite for solopreneurs, with invoices, estimates and payment links.
- QuickBooks — QuickBooks is Intuit's small-business accounting suite, with invoicing, expenses and bank feeds beyond a phone-first bill maker.
- HoneyBook — HoneyBook is a client-flow tool for creatives: proposals, invoices, contracts and payments in one pipeline.
Topics
- invoice fly api
- invoice fly data api
- invoiceNumber dueDate balanceDue
- labhouse invoice api
- invoice fly stripe paypal
- invoice fly estimates jobs
- barcelona invoicing api
- invoice fly clients expenses
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use