API reference

Invoices and payments

GST and Singapore GST invoices, payments, credit and debit notes. Amounts are in paise or cents.

List invoices (status, clientId, kind)

GET /invoices Invoices and payments: read

Example

curl https://app.msmepulse.com/api/v1/invoices \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN"

Response 200

FieldTypeNotes
invoicesarray of object
invoices[].idstring
invoices[].numberstring or null
invoices[].status"draft" | "issued" | "partially_paid" | "paid" | "cancelled"
invoices[].kind"invoice" | "credit_note" | "debit_note"
invoices[].clientIdstring
invoices[].clientNamestring
invoices[].issueDatestring or nullYYYY-MM-DD
invoices[].dueDatestring or nullYYYY-MM-DD
invoices[].currencystring
invoices[].totalintegerTotal, in minor units (paise or cents)
invoices[].balanceintegerStill to pay, in minor units (paise or cents)
invoices[].overdueboolean
invoices[].sentAtstring or null
invoices[].sampleboolean
summaryobject
summary.currencystring
summary.outstandingintegerOwed to you, in minor units (paise or cents)
summary.overdueintegerOverdue, in minor units (paise or cents)
summary.otherCurrenciesnumberOpen invoices in other currencies, not in the totals

Create a draft invoice

POST /invoices Invoices and payments: read and write

Request body

FieldTypeRequiredNotes
clientIdstringYesat least 1 characters
projectIdstring or null
issueDatestringYesformat ^\d{4}-\d{2}-\d{2}$
dueDatestring or nullformat ^\d{4}-\d{2}-\d{2}$
currency"INR" | "SGD" | "USD" | "EUR" | "GBP" | "AED" | "AUD" | "MYR" | "CAD" | "CHF" | "HKD" | "NZD"Yes
exchangeRatenumber or null
poNumberstringup to 40 characters
notesstringup to 2000 characters
exportUnderLutbooleandefault false
reverseChargebooleandefault false
linesarray of objectYesat most 200 items
lines[].descriptionstringYes1–1000 characters
lines[].quantitynumberYes0.001 to 1000000
lines[].unitstringup to 20 characters
lines[].unitPriceintegerYes0 to …
lines[].discountinteger0 to … · default 0
lines[].hsnSacstringup to 8 characters
lines[].rateBpsinteger0 to … · default 0
lines[].treatment"taxable" | "exempt" | "nil" | "non_gst"default "taxable"
lines[].sgTaxCode"SR" | "ZR" | "ES" | "OS"default "SR"
lines[].catalogueItemIdstring or null
lines[].sourceobjectdefault {"kind":"manual","timeLogIds":[]}
lines[].source.kind"time" | "milestone" | "item" | "manual" | "expense"Yes
lines[].source.timeLogIdsarray of string
lines[].source.milestoneIdstring or null
lines[].source.expenseIdstring or null

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"clientId":"65f0c2a1b4e8d9f0a1b2c3d4","issueDate":"2026-10-26","currency":"INR","lines":[{"description":"Rollout support","quantity":1,"unitPrice":100000}]}'

Response 201

FieldTypeNotes
idstringThe new record's id

Unbilled approved time and completed milestones for a client

GET /invoices/billable Invoices and payments: read and write

Example

curl https://app.msmepulse.com/api/v1/invoices/billable \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN"

Answers 200 with the same data the MSMEPulse web app shows for it.

Work out an invoice's tax and totals without saving it

POST /invoices/preview Invoices and payments: read and write

Request body

FieldTypeRequiredNotes
clientIdstringYesat least 1 characters
projectIdstring or null
issueDatestringYesformat ^\d{4}-\d{2}-\d{2}$
dueDatestring or nullformat ^\d{4}-\d{2}-\d{2}$
currency"INR" | "SGD" | "USD" | "EUR" | "GBP" | "AED" | "AUD" | "MYR" | "CAD" | "CHF" | "HKD" | "NZD"Yes
exchangeRatenumber or null
poNumberstringup to 40 characters
notesstringup to 2000 characters
exportUnderLutbooleandefault false
reverseChargebooleandefault false
linesarray of objectYesat most 200 items
lines[].descriptionstringYes1–1000 characters
lines[].quantitynumberYes0.001 to 1000000
lines[].unitstringup to 20 characters
lines[].unitPriceintegerYes0 to …
lines[].discountinteger0 to … · default 0
lines[].hsnSacstringup to 8 characters
lines[].rateBpsinteger0 to … · default 0
lines[].treatment"taxable" | "exempt" | "nil" | "non_gst"default "taxable"
lines[].sgTaxCode"SR" | "ZR" | "ES" | "OS"default "SR"
lines[].catalogueItemIdstring or null
lines[].sourceobjectdefault {"kind":"manual","timeLogIds":[]}
lines[].source.kind"time" | "milestone" | "item" | "manual" | "expense"Yes
lines[].source.timeLogIdsarray of string
lines[].source.milestoneIdstring or null
lines[].source.expenseIdstring or null

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/preview \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"clientId":"65f0c2a1b4e8d9f0a1b2c3d4","issueDate":"2026-10-26","currency":"INR","lines":[{"description":"Rollout support","quantity":1,"unitPrice":100000}]}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Get an invoice, with its lines, tax and payments

GET /invoices/{id} Invoices and payments: read

id

Example

curl https://app.msmepulse.com/api/v1/invoices/{id} \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN"

Response 200

FieldTypeNotes
invoiceobject
invoice.idstring
invoice.numberstring or null
invoice.kindstring
invoice.statusstring
invoice.clientIdstring
invoice.clientNamestring
invoice.projectIdstring or null
invoice.issueDatestring or nullYYYY-MM-DD
invoice.dueDatestring or nullYYYY-MM-DD
invoice.currencystring
invoice.exchangeRatenumber or null
invoice.linesarray of object
invoice.lines[].descriptionstring
invoice.lines[].quantitynumber
invoice.lines[].unitPriceintegerPrice, in minor units (paise or cents)
invoice.lines[].hsnSacstring or null
invoice.lines[].rateBpsnumber or null
invoice.lines[].taxableintegerTaxable value, in minor units (paise or cents)
invoice.placeOfSupplystring or null
invoice.taxableintegerTaxable value, in minor units (paise or cents)
invoice.cgstintegerCGST, in minor units (paise or cents)
invoice.sgstintegerSGST, in minor units (paise or cents)
invoice.utgstintegerUTGST, in minor units (paise or cents)
invoice.igstintegerIGST, in minor units (paise or cents)
invoice.gstintegerAll GST, in minor units (paise or cents)
invoice.totalintegerTotal, in minor units (paise or cents)
invoice.balanceintegerStill to pay, in minor units (paise or cents)
invoice.overdueboolean
invoice.daysOverduenumber
invoice.paymentsarray of object
invoice.payments[].idstring
invoice.payments[].datestringYYYY-MM-DD
invoice.payments[].amountintegerReceived, in minor units (paise or cents)
invoice.payments[].tdsAmountintegerTDS deducted by the client, in minor units (paise or cents)
invoice.payments[].methodstring
invoice.payments[].referencestring

Replace a draft invoice

PUT /invoices/{id} Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
clientIdstringYesat least 1 characters
projectIdstring or null
issueDatestringYesformat ^\d{4}-\d{2}-\d{2}$
dueDatestring or nullformat ^\d{4}-\d{2}-\d{2}$
currency"INR" | "SGD" | "USD" | "EUR" | "GBP" | "AED" | "AUD" | "MYR" | "CAD" | "CHF" | "HKD" | "NZD"Yes
exchangeRatenumber or null
poNumberstringup to 40 characters
notesstringup to 2000 characters
exportUnderLutbooleandefault false
reverseChargebooleandefault false
linesarray of objectYesat most 200 items
lines[].descriptionstringYes1–1000 characters
lines[].quantitynumberYes0.001 to 1000000
lines[].unitstringup to 20 characters
lines[].unitPriceintegerYes0 to …
lines[].discountinteger0 to … · default 0
lines[].hsnSacstringup to 8 characters
lines[].rateBpsinteger0 to … · default 0
lines[].treatment"taxable" | "exempt" | "nil" | "non_gst"default "taxable"
lines[].sgTaxCode"SR" | "ZR" | "ES" | "OS"default "SR"
lines[].catalogueItemIdstring or null
lines[].sourceobjectdefault {"kind":"manual","timeLogIds":[]}
lines[].source.kind"time" | "milestone" | "item" | "manual" | "expense"Yes
lines[].source.timeLogIdsarray of string
lines[].source.milestoneIdstring or null
lines[].source.expenseIdstring or null

Example

curl -X PUT https://app.msmepulse.com/api/v1/invoices/{id} \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"clientId":"65f0c2a1b4e8d9f0a1b2c3d4","issueDate":"2026-10-26","currency":"INR","lines":[{"description":"Rollout support","quantity":1,"unitPrice":100000}]}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Delete a draft invoice

DELETE /invoices/{id} Invoices and payments: read and write

id

Example

curl -X DELETE https://app.msmepulse.com/api/v1/invoices/{id} \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN"

Answers 200 with the same data the MSMEPulse web app shows for it.

Issue a draft invoice (gives it its number)

POST /invoices/{id}/issue Invoices and payments: read and write

id

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/issue \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN"

Answers 200 with the same data the MSMEPulse web app shows for it.

Email an invoice to the client

POST /invoices/{id}/send Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
tostringYesan email address
messagestringup to 2000 characters

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/send \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"to":"someone@example.com"}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Record a payment (with TDS in India)

POST /invoices/{id}/payments Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
datestringYesformat ^\d{4}-\d{2}-\d{2}$
amountintegerYes0 to …
method"bank_transfer" | "upi" | "paynow" | "cheque" | "cash" | "card" | "other"Yes
referencestringup to 80 characters
tdsAmountinteger0 to … · default 0
tdsSectionstringup to 20 characters
notestringup to 500 characters

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/payments \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"date":"2026-10-26","amount":100000,"method":"bank_transfer"}'

Response 200

FieldTypeNotes
statusstring
balanceintegerStill to pay, in minor units (paise or cents)

Remove a recorded payment

DELETE /invoices/{id}/payments/{pid} Invoices and payments: read and write

id · pid

Example

curl -X DELETE https://app.msmepulse.com/api/v1/invoices/{id}/payments/{pid} \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN"

Answers 200 with the same data the MSMEPulse web app shows for it.

Record the client's TDS certificate for a payment

PATCH /invoices/{id}/payments/{pid}/tds-certificate Invoices and payments: read and write

id · pid

Request body

FieldTypeRequiredNotes
receivedbooleanYes

Example

curl -X PATCH https://app.msmepulse.com/api/v1/invoices/{id}/payments/{pid}/tds-certificate \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"received":false}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Cancel an issued invoice

POST /invoices/{id}/cancel Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
reasonstringYes3–500 characters

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/cancel \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"reason":"Duplicate charge"}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Raise a credit note against an invoice

POST /invoices/{id}/credit-notes Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
issueDatestringYesformat ^\d{4}-\d{2}-\d{2}$
reason"discount" | "deficiency" | "overcharge" | "return" | "other"Yes
reasonNotestringup to 500 characters
linesarray of objectYes
lines[].indexintegerYes0 to …
lines[].amountintegerYes0 to …

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/credit-notes \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"issueDate":"2026-10-26","reason":"discount","lines":[{"index":1,"amount":100000}]}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Raise a debit note against an invoice

POST /invoices/{id}/debit-notes Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
issueDatestringYesformat ^\d{4}-\d{2}-\d{2}$
dueDatestring or nullformat ^\d{4}-\d{2}-\d{2}$
reason"undercharge" | "additional" | "tax_shortfall" | "other"Yes
reasonNotestringup to 500 characters
linesarray of objectYesat most 50 items
lines[].descriptionstringYes1–1000 characters
lines[].quantitynumberYes0.001 to 1000000
lines[].unitstringup to 20 characters
lines[].unitPriceintegerYes0 to …
lines[].discountinteger0 to … · default 0
lines[].hsnSacstringup to 8 characters
lines[].rateBpsinteger0 to … · default 0
lines[].treatment"taxable" | "exempt" | "nil" | "non_gst"default "taxable"
lines[].sgTaxCode"SR" | "ZR" | "ES" | "OS"default "SR"

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/debit-notes \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"issueDate":"2026-10-26","reason":"undercharge","lines":[{"description":"Rollout support","quantity":1,"unitPrice":100000}]}'

Answers 200 with the same data the MSMEPulse web app shows for it.

Record a refund

POST /invoices/{id}/refunds Invoices and payments: read and write

id

Request body

FieldTypeRequiredNotes
datestringYesformat ^\d{4}-\d{2}-\d{2}$
amountintegerYes1 to …
method"bank_transfer" | "upi" | "paynow" | "cheque" | "cash" | "card" | "other"Yes
referencestringup to 80 characters

Example

curl -X POST https://app.msmepulse.com/api/v1/invoices/{id}/refunds \
  -H "Authorization: Bearer $MSMEPULSE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"date":"2026-10-26","amount":100000,"method":"bank_transfer"}'

Answers 200 with the same data the MSMEPulse web app shows for it.