curl --request POST \
--url https://{your-subdomain}.neetoinvoice.com/api/external/v2/clients/{client_id}/invoices \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"email": "john@example.com",
"number": "INV-EXT-001",
"time_entry_ids": [
"128c1dfc-b29f-4fda-9a05-8a90e197b81b"
],
"total": 500,
"issue_date": "2026-10-15",
"due_date": "2026-10-30",
"due_date_period": 30,
"interval": "monthly",
"notes": "Payment terms: Net 30 days",
"include_hours_by_person": true,
"include_hours_by_task": false,
"include_time_entries": true,
"send_automated_reminder_email": true,
"include_payment_link": true,
"payment_provider": "undefined",
"display_task_name": true,
"display_person_name": true,
"display_date": true,
"display_note": true,
"display_project_name": false,
"project_id": [
"89d1b47d9f36af3c9ecf",
"24e6a2fe31bb686c541a"
],
"send_email": true,
"invoice_details": {
"subject": "Invoice INV-EXT-001 from Your Company",
"message": "Please find attached your invoice for the services rendered.",
"attach_pdf_invoice": "true",
"send_me_a_copy": "false",
"recipient_ids": [
"128c1dfc-b29f-4fda-9a05-8a90e197b81b",
"6be815a8-9a10-455c-95d9-b0b548664420"
]
},
"tax_details": [
{
"name": "GST",
"percentage": 10,
"notes": "Goods and Services Tax",
"selected": true
}
],
"invoice_expenses": [
{
"notes": "Flight to client site",
"unit_amount": 320,
"recorded_on": "2026-10-12",
"quantity": 1,
"category": "Travel",
"vendor": "Airline Co",
"project_id": "f627c399-379d-4d07-a6f6-90b7c9470ac0"
}
]
}
'const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'john@example.com',
number: 'INV-EXT-001',
time_entry_ids: ['128c1dfc-b29f-4fda-9a05-8a90e197b81b'],
total: 500,
issue_date: '2026-10-15',
due_date: '2026-10-30',
due_date_period: 30,
interval: 'monthly',
notes: 'Payment terms: Net 30 days',
include_hours_by_person: true,
include_hours_by_task: false,
include_time_entries: true,
send_automated_reminder_email: true,
include_payment_link: true,
payment_provider: 'undefined',
display_task_name: true,
display_person_name: true,
display_date: true,
display_note: true,
display_project_name: false,
project_id: ['89d1b47d9f36af3c9ecf', '24e6a2fe31bb686c541a'],
send_email: true,
invoice_details: {
subject: 'Invoice INV-EXT-001 from Your Company',
message: 'Please find attached your invoice for the services rendered.',
attach_pdf_invoice: 'true',
send_me_a_copy: 'false',
recipient_ids: ['128c1dfc-b29f-4fda-9a05-8a90e197b81b', '6be815a8-9a10-455c-95d9-b0b548664420']
},
tax_details: [{name: 'GST', percentage: 10, notes: 'Goods and Services Tax', selected: true}],
invoice_expenses: [
{
notes: 'Flight to client site',
unit_amount: 320,
recorded_on: '2026-10-12',
quantity: 1,
category: 'Travel',
vendor: 'Airline Co',
project_id: 'f627c399-379d-4d07-a6f6-90b7c9470ac0'
}
]
})
};
fetch('https://{your-subdomain}.neetoinvoice.com/api/external/v2/clients/{client_id}/invoices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetoinvoice.com/api/external/v2/clients/{client_id}/invoices"
payload = {
"email": "john@example.com",
"number": "INV-EXT-001",
"time_entry_ids": ["128c1dfc-b29f-4fda-9a05-8a90e197b81b"],
"total": 500,
"issue_date": "2026-10-15",
"due_date": "2026-10-30",
"due_date_period": 30,
"interval": "monthly",
"notes": "Payment terms: Net 30 days",
"include_hours_by_person": True,
"include_hours_by_task": False,
"include_time_entries": True,
"send_automated_reminder_email": True,
"include_payment_link": True,
"payment_provider": "undefined",
"display_task_name": True,
"display_person_name": True,
"display_date": True,
"display_note": True,
"display_project_name": False,
"project_id": ["89d1b47d9f36af3c9ecf", "24e6a2fe31bb686c541a"],
"send_email": True,
"invoice_details": {
"subject": "Invoice INV-EXT-001 from Your Company",
"message": "Please find attached your invoice for the services rendered.",
"attach_pdf_invoice": "true",
"send_me_a_copy": "false",
"recipient_ids": ["128c1dfc-b29f-4fda-9a05-8a90e197b81b", "6be815a8-9a10-455c-95d9-b0b548664420"]
},
"tax_details": [
{
"name": "GST",
"percentage": 10,
"notes": "Goods and Services Tax",
"selected": True
}
],
"invoice_expenses": [
{
"notes": "Flight to client site",
"unit_amount": 320,
"recorded_on": "2026-10-12",
"quantity": 1,
"category": "Travel",
"vendor": "Airline Co",
"project_id": "f627c399-379d-4d07-a6f6-90b7c9470ac0"
}
]
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"invoice": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"number": "<string>",
"total": 123,
"status": "<string>",
"issue_date": "2023-12-25",
"due_date": "2023-12-25",
"notes": "<string>",
"client_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}Generate invoice
Generate an invoice for a client from unbilled time entries, services, expenses or fixed price projects, with optional taxes. The invoice is generated in the background, so its status is generating when the request returns.
curl --request POST \
--url https://{your-subdomain}.neetoinvoice.com/api/external/v2/clients/{client_id}/invoices \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"email": "john@example.com",
"number": "INV-EXT-001",
"time_entry_ids": [
"128c1dfc-b29f-4fda-9a05-8a90e197b81b"
],
"total": 500,
"issue_date": "2026-10-15",
"due_date": "2026-10-30",
"due_date_period": 30,
"interval": "monthly",
"notes": "Payment terms: Net 30 days",
"include_hours_by_person": true,
"include_hours_by_task": false,
"include_time_entries": true,
"send_automated_reminder_email": true,
"include_payment_link": true,
"payment_provider": "undefined",
"display_task_name": true,
"display_person_name": true,
"display_date": true,
"display_note": true,
"display_project_name": false,
"project_id": [
"89d1b47d9f36af3c9ecf",
"24e6a2fe31bb686c541a"
],
"send_email": true,
"invoice_details": {
"subject": "Invoice INV-EXT-001 from Your Company",
"message": "Please find attached your invoice for the services rendered.",
"attach_pdf_invoice": "true",
"send_me_a_copy": "false",
"recipient_ids": [
"128c1dfc-b29f-4fda-9a05-8a90e197b81b",
"6be815a8-9a10-455c-95d9-b0b548664420"
]
},
"tax_details": [
{
"name": "GST",
"percentage": 10,
"notes": "Goods and Services Tax",
"selected": true
}
],
"invoice_expenses": [
{
"notes": "Flight to client site",
"unit_amount": 320,
"recorded_on": "2026-10-12",
"quantity": 1,
"category": "Travel",
"vendor": "Airline Co",
"project_id": "f627c399-379d-4d07-a6f6-90b7c9470ac0"
}
]
}
'const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
email: 'john@example.com',
number: 'INV-EXT-001',
time_entry_ids: ['128c1dfc-b29f-4fda-9a05-8a90e197b81b'],
total: 500,
issue_date: '2026-10-15',
due_date: '2026-10-30',
due_date_period: 30,
interval: 'monthly',
notes: 'Payment terms: Net 30 days',
include_hours_by_person: true,
include_hours_by_task: false,
include_time_entries: true,
send_automated_reminder_email: true,
include_payment_link: true,
payment_provider: 'undefined',
display_task_name: true,
display_person_name: true,
display_date: true,
display_note: true,
display_project_name: false,
project_id: ['89d1b47d9f36af3c9ecf', '24e6a2fe31bb686c541a'],
send_email: true,
invoice_details: {
subject: 'Invoice INV-EXT-001 from Your Company',
message: 'Please find attached your invoice for the services rendered.',
attach_pdf_invoice: 'true',
send_me_a_copy: 'false',
recipient_ids: ['128c1dfc-b29f-4fda-9a05-8a90e197b81b', '6be815a8-9a10-455c-95d9-b0b548664420']
},
tax_details: [{name: 'GST', percentage: 10, notes: 'Goods and Services Tax', selected: true}],
invoice_expenses: [
{
notes: 'Flight to client site',
unit_amount: 320,
recorded_on: '2026-10-12',
quantity: 1,
category: 'Travel',
vendor: 'Airline Co',
project_id: 'f627c399-379d-4d07-a6f6-90b7c9470ac0'
}
]
})
};
fetch('https://{your-subdomain}.neetoinvoice.com/api/external/v2/clients/{client_id}/invoices', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetoinvoice.com/api/external/v2/clients/{client_id}/invoices"
payload = {
"email": "john@example.com",
"number": "INV-EXT-001",
"time_entry_ids": ["128c1dfc-b29f-4fda-9a05-8a90e197b81b"],
"total": 500,
"issue_date": "2026-10-15",
"due_date": "2026-10-30",
"due_date_period": 30,
"interval": "monthly",
"notes": "Payment terms: Net 30 days",
"include_hours_by_person": True,
"include_hours_by_task": False,
"include_time_entries": True,
"send_automated_reminder_email": True,
"include_payment_link": True,
"payment_provider": "undefined",
"display_task_name": True,
"display_person_name": True,
"display_date": True,
"display_note": True,
"display_project_name": False,
"project_id": ["89d1b47d9f36af3c9ecf", "24e6a2fe31bb686c541a"],
"send_email": True,
"invoice_details": {
"subject": "Invoice INV-EXT-001 from Your Company",
"message": "Please find attached your invoice for the services rendered.",
"attach_pdf_invoice": "true",
"send_me_a_copy": "false",
"recipient_ids": ["128c1dfc-b29f-4fda-9a05-8a90e197b81b", "6be815a8-9a10-455c-95d9-b0b548664420"]
},
"tax_details": [
{
"name": "GST",
"percentage": 10,
"notes": "Goods and Services Tax",
"selected": True
}
],
"invoice_expenses": [
{
"notes": "Flight to client site",
"unit_amount": 320,
"recorded_on": "2026-10-12",
"quantity": 1,
"category": "Travel",
"vendor": "Airline Co",
"project_id": "f627c399-379d-4d07-a6f6-90b7c9470ac0"
}
]
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"invoice": {
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"number": "<string>",
"total": 123,
"status": "<string>",
"issue_date": "2023-12-25",
"due_date": "2023-12-25",
"notes": "<string>",
"client_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"organization_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z"
}
}{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
Use the X-Api-Key header to provide your workspace API key. Refer to Authentication for more information.
Path Parameters
Unique ID of the client for which you want to retrieve or update details. Refer to Getting the Client ID section for detailed instructions.
Body
- Time Entry IDs
- Expenses
- Fixed Price Projects
- Time Entries
- Services
Email of the person creating the invoice.
"john@example.com"
Invoice identifier.
"INV-EXT-001"
IDs of unbilled time entries to bill. Refer to Getting the Time Entry ID section for detailed instructions. An unknown or already billed ID is rejected with a field error on time_entry_ids.
["128c1dfc-b29f-4fda-9a05-8a90e197b81b"]
Total amount of the invoice. Optional; the total is computed from the line items.
500
Issue date of the invoice in YYYY-MM-DD format. MM/DD/YYYY is still accepted.
"2026-10-15"
Due date of the invoice in YYYY-MM-DD format. MM/DD/YYYY is still accepted. Sending due_date alone sets a custom due date; you do not need to send due_date_period.
"2026-10-30"
Due date period for the invoice in days.
30
Billing interval for the invoice.
"monthly"
Additional notes for the invoice.
"Payment terms: Net 30 days"
Whether to include hours breakdown by person.
true
Whether to include hours breakdown by task.
false
Whether to include detailed time entries.
true
Whether to send automated reminder emails.
true
Whether to include payment link in the invoice.
true
Payment provider for the invoice.
stripe, undefined "undefined"
Whether to display task names in the invoice.
true
Whether to display person names in the invoice.
true
Whether to display dates in the invoice.
true
Whether to display notes in the invoice.
true
Whether to display project names in the invoice.
false
Fixed price projects to bill. When the request has no invoice_services, each project is billed for its remaining flat amount. Refer to Getting the Project ID section for detailed instructions.
[ "89d1b47d9f36af3c9ecf", "24e6a2fe31bb686c541a" ]
Whether to email the invoice once it is generated. The invoice goes to every current recipient of the client unless invoice_details.recipient_ids narrows it. If the client has no current recipients, the request is rejected and no invoice is created.
true
Email details for sending the invoice. Optional; used only when send_email is true.
Hide child attributes
Hide child attributes
Email subject for the invoice.
"Invoice INV-EXT-001 from Your Company"
Email message for the invoice.
"Please find attached your invoice for the services rendered."
Whether to attach PDF invoice.
true, false "true"
Whether to send a copy to the sender.
true, false "false"
Array of recipient IDs for email delivery. Defaults to every current recipient of the client. Refer to Getting the Recipient ID section for detailed instructions.
[ "128c1dfc-b29f-4fda-9a05-8a90e197b81b", "6be815a8-9a10-455c-95d9-b0b548664420" ]
Array of tax details for the invoice.
Expenses to bill. An invoice may contain only expenses.
Hide child attributes
Hide child attributes
Expense description.
"Flight to client site"
Amount per unit.
320
Date of the expense in YYYY-MM-DD format.
"2026-10-12"
Quantity. Defaults to 1.
1
Name of an expense category set up in the workspace, for example Travel. The match is case-insensitive. An unknown name is rejected and the error lists the categories in the workspace.
"Travel"
Vendor name.
"Airline Co"
Project the expense belongs to.
"f627c399-379d-4d07-a6f6-90b7c9470ac0"
Response
Created - Invoice created successfully
Hide child attributes
Hide child attributes