Update Project Balance
curl --request PUT \
--url https://api.virtuoussoftware.com/api/Project/{projectId}/Balance \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"beginningBalance": "<double>",
"currentBalance": "<double>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({beginningBalance: '<double>', currentBalance: '<double>'})
};
fetch('https://api.virtuoussoftware.com/api/Project/{projectId}/Balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.virtuoussoftware.com/api/Project/{projectId}/Balance"
payload = {
"beginningBalance": "<double>",
"currentBalance": "<double>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)using RestSharp;
var options = new RestClientOptions("https://api.virtuoussoftware.com/api/Project/{projectId}/Balance");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"beginningBalance\": \"<double>\",\n \"currentBalance\": \"<double>\"\n}", false);
var response = await client.PutAsync(request);
Console.WriteLine("{0}", response.Content);
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.virtuoussoftware.com/api/Project/{projectId}/Balance",
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([
'beginningBalance' => '<double>',
'currentBalance' => '<double>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.put("https://api.virtuoussoftware.com/api/Project/{projectId}/Balance")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"beginningBalance\": \"<double>\",\n \"currentBalance\": \"<double>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.virtuoussoftware.com/api/Project/{projectId}/Balance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"beginningBalance\": \"<double>\",\n \"currentBalance\": \"<double>\"\n}"
response = http.request(request)
puts response.read_bodyconst url = 'https://api.virtuoussoftware.com/api/Project/{projectId}/Balance';
const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({beginningBalance: '<double>', currentBalance: '<double>'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));{
"id": 1501,
"enableSync": false,
"name": "Holiday Meals 2025",
"projectCode": "HM-2025",
"externalAccountingCode": "4100",
"onlineDisplayName": "Holiday Meals 2025",
"description": "Holiday food distribution to 500 families across the metro region.",
"photoUrl": "https://cdn.virtuoussoftware.com/projects/1501-cover.jpg",
"parentId": null,
"parentName": null,
"isSubProject": false,
"inventoryStatus": "None",
"type": "Program",
"location": "Springfield, OR",
"isRestrictedToGiftSpecifications": false,
"isLimitedToFinancialNeed": false,
"isPublic": true,
"isActive": true,
"isAvailableOnline": true,
"isTaxDeductible": true,
"treatAsAccountsPayable": false,
"beginningBalance": 0,
"currentBalance": 18420,
"financialNeedType": "Fixed",
"financialNeedFrequency": "OneTime",
"financialNeedAmount": 50000,
"startDate": "2025-09-01T00:00:00Z",
"endDate": "2025-12-31T00:00:00Z",
"durationType": "Fixed",
"lifeToDateGiving": 18420,
"lifeToDateGiftCount": 142,
"lifeToDateGiversCount": 128,
"lifeToDateExpenseTotal": 6200,
"calendarYearToDateGiving": 18420,
"calendarYearToDateGiftCount": 142,
"calendarYearToDateGiversCount": 128,
"calendarYearToDateExpenseTotal": 6200,
"createDateTimeUtc": "2025-09-01T08:00:00Z",
"createdByUser": "Development Team",
"modifiedDateTimeUtc": "2025-11-15T18:00:00Z",
"modifiedByUser": "Partner Integration",
"giftSpecifications": [
{
"amount": 50,
"frequency": "OneTime"
},
{
"amount": 100,
"frequency": "OneTime"
}
],
"customFields": {}
}{
"message": "Authorization has been denied for this request."
}{
"message": "You do not have permission to perform this action."
}{
"message": "Rate limit exceeded. Try again later."
}How to Create and Update Projects
Update Project Balance
PUT
/
api
/
Project
/
{projectId}
/
Balance
Update Project Balance
curl --request PUT \
--url https://api.virtuoussoftware.com/api/Project/{projectId}/Balance \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"beginningBalance": "<double>",
"currentBalance": "<double>"
}
'const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({beginningBalance: '<double>', currentBalance: '<double>'})
};
fetch('https://api.virtuoussoftware.com/api/Project/{projectId}/Balance', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.virtuoussoftware.com/api/Project/{projectId}/Balance"
payload = {
"beginningBalance": "<double>",
"currentBalance": "<double>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)using RestSharp;
var options = new RestClientOptions("https://api.virtuoussoftware.com/api/Project/{projectId}/Balance");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"beginningBalance\": \"<double>\",\n \"currentBalance\": \"<double>\"\n}", false);
var response = await client.PutAsync(request);
Console.WriteLine("{0}", response.Content);
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.virtuoussoftware.com/api/Project/{projectId}/Balance",
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([
'beginningBalance' => '<double>',
'currentBalance' => '<double>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}HttpResponse<String> response = Unirest.put("https://api.virtuoussoftware.com/api/Project/{projectId}/Balance")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"beginningBalance\": \"<double>\",\n \"currentBalance\": \"<double>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.virtuoussoftware.com/api/Project/{projectId}/Balance")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"beginningBalance\": \"<double>\",\n \"currentBalance\": \"<double>\"\n}"
response = http.request(request)
puts response.read_bodyconst url = 'https://api.virtuoussoftware.com/api/Project/{projectId}/Balance';
const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({beginningBalance: '<double>', currentBalance: '<double>'})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));{
"id": 1501,
"enableSync": false,
"name": "Holiday Meals 2025",
"projectCode": "HM-2025",
"externalAccountingCode": "4100",
"onlineDisplayName": "Holiday Meals 2025",
"description": "Holiday food distribution to 500 families across the metro region.",
"photoUrl": "https://cdn.virtuoussoftware.com/projects/1501-cover.jpg",
"parentId": null,
"parentName": null,
"isSubProject": false,
"inventoryStatus": "None",
"type": "Program",
"location": "Springfield, OR",
"isRestrictedToGiftSpecifications": false,
"isLimitedToFinancialNeed": false,
"isPublic": true,
"isActive": true,
"isAvailableOnline": true,
"isTaxDeductible": true,
"treatAsAccountsPayable": false,
"beginningBalance": 0,
"currentBalance": 18420,
"financialNeedType": "Fixed",
"financialNeedFrequency": "OneTime",
"financialNeedAmount": 50000,
"startDate": "2025-09-01T00:00:00Z",
"endDate": "2025-12-31T00:00:00Z",
"durationType": "Fixed",
"lifeToDateGiving": 18420,
"lifeToDateGiftCount": 142,
"lifeToDateGiversCount": 128,
"lifeToDateExpenseTotal": 6200,
"calendarYearToDateGiving": 18420,
"calendarYearToDateGiftCount": 142,
"calendarYearToDateGiversCount": 128,
"calendarYearToDateExpenseTotal": 6200,
"createDateTimeUtc": "2025-09-01T08:00:00Z",
"createdByUser": "Development Team",
"modifiedDateTimeUtc": "2025-11-15T18:00:00Z",
"modifiedByUser": "Partner Integration",
"giftSpecifications": [
{
"amount": 50,
"frequency": "OneTime"
},
{
"amount": 100,
"frequency": "OneTime"
}
],
"customFields": {}
}{
"message": "Authorization has been denied for this request."
}{
"message": "You do not have permission to perform this action."
}{
"message": "Rate limit exceeded. Try again later."
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
(Required) The project identifier.
Body
application/json
Response
OK
Whether the project is enabled for synchronization.
The unique identifier of the record in Virtuous.
The display name of the record.
The free-text description stored on the record.
The total amount the contact has given since the first gift.
The UTC date and time the record was created.
The name of the user who created the record.
The UTC date and time the record was last modified.
The name of the user who last modified the record.
Show child attributes
Show child attributes
The custom field values stored on the record.
Last modified on April 23, 2026
Was this page helpful?