curl --request PUT \
--url https://api.everhour.com/invoices/{invoice_id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"publicId": "1020",
"issueDate": "2019-03-20",
"dueDate": "2019-03-20",
"reference": "contract",
"publicNotes": "<string>",
"tax": {
"id": 123,
"rate": 11
},
"discount": 25,
"showRowNumbers": true,
"invoiceItems": [
{
"id": 52,
"name": "Software Development",
"billedTime": 415860,
"listAmount": 288793,
"taxable": false,
"position": 1
}
]
}
'import requests
url = "https://api.everhour.com/invoices/{invoice_id}"
payload = {
"publicId": "1020",
"issueDate": "2019-03-20",
"dueDate": "2019-03-20",
"reference": "contract",
"publicNotes": "<string>",
"tax": {
"id": 123,
"rate": 11
},
"discount": 25,
"showRowNumbers": True,
"invoiceItems": [
{
"id": 52,
"name": "Software Development",
"billedTime": 415860,
"listAmount": 288793,
"taxable": False,
"position": 1
}
]
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
publicId: '1020',
issueDate: '2019-03-20',
dueDate: '2019-03-20',
reference: 'contract',
publicNotes: '<string>',
tax: {id: 123, rate: 11},
discount: 25,
showRowNumbers: true,
invoiceItems: [
{
id: 52,
name: 'Software Development',
billedTime: 415860,
listAmount: 288793,
taxable: false,
position: 1
}
]
})
};
fetch('https://api.everhour.com/invoices/{invoice_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.everhour.com/invoices/{invoice_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'publicId' => '1020',
'issueDate' => '2019-03-20',
'dueDate' => '2019-03-20',
'reference' => 'contract',
'publicNotes' => '<string>',
'tax' => [
'id' => 123,
'rate' => 11
],
'discount' => 25,
'showRowNumbers' => true,
'invoiceItems' => [
[
'id' => 52,
'name' => 'Software Development',
'billedTime' => 415860,
'listAmount' => 288793,
'taxable' => false,
'position' => 1
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.everhour.com/invoices/{invoice_id}"
payload := strings.NewReader("{\n \"publicId\": \"1020\",\n \"issueDate\": \"2019-03-20\",\n \"dueDate\": \"2019-03-20\",\n \"reference\": \"contract\",\n \"publicNotes\": \"<string>\",\n \"tax\": {\n \"id\": 123,\n \"rate\": 11\n },\n \"discount\": 25,\n \"showRowNumbers\": true,\n \"invoiceItems\": [\n {\n \"id\": 52,\n \"name\": \"Software Development\",\n \"billedTime\": 415860,\n \"listAmount\": 288793,\n \"taxable\": false,\n \"position\": 1\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.everhour.com/invoices/{invoice_id}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"publicId\": \"1020\",\n \"issueDate\": \"2019-03-20\",\n \"dueDate\": \"2019-03-20\",\n \"reference\": \"contract\",\n \"publicNotes\": \"<string>\",\n \"tax\": {\n \"id\": 123,\n \"rate\": 11\n },\n \"discount\": 25,\n \"showRowNumbers\": true,\n \"invoiceItems\": [\n {\n \"id\": 52,\n \"name\": \"Software Development\",\n \"billedTime\": 415860,\n \"listAmount\": 288793,\n \"taxable\": false,\n \"position\": 1\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.everhour.com/invoices/{invoice_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"publicId\": \"1020\",\n \"issueDate\": \"2019-03-20\",\n \"dueDate\": \"2019-03-20\",\n \"reference\": \"contract\",\n \"publicNotes\": \"<string>\",\n \"tax\": {\n \"id\": 123,\n \"rate\": 11\n },\n \"discount\": 25,\n \"showRowNumbers\": true,\n \"invoiceItems\": [\n {\n \"id\": 52,\n \"name\": \"Software Development\",\n \"billedTime\": 415860,\n \"listAmount\": 288793,\n \"taxable\": false,\n \"position\": 1\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 2660155,
"client": {
"id": 4567,
"name": "Client Name",
"projects": [
"ev:1234567890"
],
"businessDetails": "<string>",
"budget": {
"type": "money",
"budget": 100000,
"period": "general",
"appliedFrom": "<string>",
"disallowOverbudget": true,
"excludeUnbillableTime": true,
"excludeExpenses": true,
"threshold": 123,
"progress": 0
}
},
"createdAt": "2018-01-16 12:42:59",
"createdBy": {
"id": 1304,
"name": "User Name",
"role": "admin",
"status": "active",
"headline": "CEO",
"avatarUrl": "<string>",
"phone": "<string>",
"capacity": 123,
"avatarUrlLarge": "<string>"
},
"status": "draft",
"dateFrom": "<string>",
"dateTill": "<string>",
"dueDate": "<string>",
"discount": {
"amount": 4581,
"rate": 25
},
"expenseMask": "%PROJECT% :: %CATEGORY%",
"includeExpenses": true,
"includeTime": true,
"invoiceItems": [
{
"billedTime": 415860,
"createdAt": "2017-02-22 16:11:33",
"custom": false,
"id": 52,
"listAmount": 288793,
"name": "Software Development",
"netAmount": 288793,
"position": 1,
"taxable": 1,
"totalAmount": 288793
}
],
"issueDate": "2019-03-22",
"limitDateFrom": "<string>",
"limitDateTill": "<string>",
"listAmount": 18325,
"netAmount": 13744,
"projects": [
"gh:63301595"
],
"publicId": "1020",
"tax": {
"id": 123,
"rate": 11,
"amount": 1512
},
"timeMask": "%PROJECT%",
"totalAmount": 15256,
"totalTime": 43980,
"valid": true
}Update Invoice
Update invoice metadata (notes, dates, custom totals). To change the lifecycle state, set manualStatus to draft, sent, or paid.
curl --request PUT \
--url https://api.everhour.com/invoices/{invoice_id} \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <api-key>' \
--data '
{
"publicId": "1020",
"issueDate": "2019-03-20",
"dueDate": "2019-03-20",
"reference": "contract",
"publicNotes": "<string>",
"tax": {
"id": 123,
"rate": 11
},
"discount": 25,
"showRowNumbers": true,
"invoiceItems": [
{
"id": 52,
"name": "Software Development",
"billedTime": 415860,
"listAmount": 288793,
"taxable": false,
"position": 1
}
]
}
'import requests
url = "https://api.everhour.com/invoices/{invoice_id}"
payload = {
"publicId": "1020",
"issueDate": "2019-03-20",
"dueDate": "2019-03-20",
"reference": "contract",
"publicNotes": "<string>",
"tax": {
"id": 123,
"rate": 11
},
"discount": 25,
"showRowNumbers": True,
"invoiceItems": [
{
"id": 52,
"name": "Software Development",
"billedTime": 415860,
"listAmount": 288793,
"taxable": False,
"position": 1
}
]
}
headers = {
"X-Api-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-Api-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
publicId: '1020',
issueDate: '2019-03-20',
dueDate: '2019-03-20',
reference: 'contract',
publicNotes: '<string>',
tax: {id: 123, rate: 11},
discount: 25,
showRowNumbers: true,
invoiceItems: [
{
id: 52,
name: 'Software Development',
billedTime: 415860,
listAmount: 288793,
taxable: false,
position: 1
}
]
})
};
fetch('https://api.everhour.com/invoices/{invoice_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.everhour.com/invoices/{invoice_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'publicId' => '1020',
'issueDate' => '2019-03-20',
'dueDate' => '2019-03-20',
'reference' => 'contract',
'publicNotes' => '<string>',
'tax' => [
'id' => 123,
'rate' => 11
],
'discount' => 25,
'showRowNumbers' => true,
'invoiceItems' => [
[
'id' => 52,
'name' => 'Software Development',
'billedTime' => 415860,
'listAmount' => 288793,
'taxable' => false,
'position' => 1
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Api-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.everhour.com/invoices/{invoice_id}"
payload := strings.NewReader("{\n \"publicId\": \"1020\",\n \"issueDate\": \"2019-03-20\",\n \"dueDate\": \"2019-03-20\",\n \"reference\": \"contract\",\n \"publicNotes\": \"<string>\",\n \"tax\": {\n \"id\": 123,\n \"rate\": 11\n },\n \"discount\": 25,\n \"showRowNumbers\": true,\n \"invoiceItems\": [\n {\n \"id\": 52,\n \"name\": \"Software Development\",\n \"billedTime\": 415860,\n \"listAmount\": 288793,\n \"taxable\": false,\n \"position\": 1\n }\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-Api-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.everhour.com/invoices/{invoice_id}")
.header("X-Api-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"publicId\": \"1020\",\n \"issueDate\": \"2019-03-20\",\n \"dueDate\": \"2019-03-20\",\n \"reference\": \"contract\",\n \"publicNotes\": \"<string>\",\n \"tax\": {\n \"id\": 123,\n \"rate\": 11\n },\n \"discount\": 25,\n \"showRowNumbers\": true,\n \"invoiceItems\": [\n {\n \"id\": 52,\n \"name\": \"Software Development\",\n \"billedTime\": 415860,\n \"listAmount\": 288793,\n \"taxable\": false,\n \"position\": 1\n }\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.everhour.com/invoices/{invoice_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-Api-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"publicId\": \"1020\",\n \"issueDate\": \"2019-03-20\",\n \"dueDate\": \"2019-03-20\",\n \"reference\": \"contract\",\n \"publicNotes\": \"<string>\",\n \"tax\": {\n \"id\": 123,\n \"rate\": 11\n },\n \"discount\": 25,\n \"showRowNumbers\": true,\n \"invoiceItems\": [\n {\n \"id\": 52,\n \"name\": \"Software Development\",\n \"billedTime\": 415860,\n \"listAmount\": 288793,\n \"taxable\": false,\n \"position\": 1\n }\n ]\n}"
response = http.request(request)
puts response.read_body{
"id": 2660155,
"client": {
"id": 4567,
"name": "Client Name",
"projects": [
"ev:1234567890"
],
"businessDetails": "<string>",
"budget": {
"type": "money",
"budget": 100000,
"period": "general",
"appliedFrom": "<string>",
"disallowOverbudget": true,
"excludeUnbillableTime": true,
"excludeExpenses": true,
"threshold": 123,
"progress": 0
}
},
"createdAt": "2018-01-16 12:42:59",
"createdBy": {
"id": 1304,
"name": "User Name",
"role": "admin",
"status": "active",
"headline": "CEO",
"avatarUrl": "<string>",
"phone": "<string>",
"capacity": 123,
"avatarUrlLarge": "<string>"
},
"status": "draft",
"dateFrom": "<string>",
"dateTill": "<string>",
"dueDate": "<string>",
"discount": {
"amount": 4581,
"rate": 25
},
"expenseMask": "%PROJECT% :: %CATEGORY%",
"includeExpenses": true,
"includeTime": true,
"invoiceItems": [
{
"billedTime": 415860,
"createdAt": "2017-02-22 16:11:33",
"custom": false,
"id": 52,
"listAmount": 288793,
"name": "Software Development",
"netAmount": 288793,
"position": 1,
"taxable": 1,
"totalAmount": 288793
}
],
"issueDate": "2019-03-22",
"limitDateFrom": "<string>",
"limitDateTill": "<string>",
"listAmount": 18325,
"netAmount": 13744,
"projects": [
"gh:63301595"
],
"publicId": "1020",
"tax": {
"id": 123,
"rate": 11,
"amount": 1512
},
"timeMask": "%PROJECT%",
"totalAmount": 15256,
"totalTime": 43980,
"valid": true
}Authorizations
Path Parameters
Invoice ID
11903
Body
"1020"
"2019-03-20"
"2019-03-20"
"contract"
Tax to apply. Set rate (percentage), or id to reference a tax from a connected accounting integration.
Show child attributes
Show child attributes
Discount rate as a percentage (0-100)
25
Manually set the invoice status. Overrides the automatically derived status.
draft, sent, paid Show child attributes
Show child attributes
Response
OK
Invoice ID
2660155
Show child attributes
Show child attributes
"2018-01-16 12:42:59"
Show child attributes
Show child attributes
draft, sent, paid, deleted, partial "draft"
Show child attributes
Show child attributes
"%PROJECT% :: %CATEGORY%"
true
true
Show child attributes
Show child attributes
"2019-03-22"
List amount in cents (without discount and taxes)
18325
Net amount in cents (without taxes but with discount applied)
13744
["gh:63301595"]
"1020"
Show child attributes
Show child attributes
"%PROJECT%"
Total invoice amount in cents (with discount and taxes applied)
15256
Total invoice time in seconds
43980
true
