Update a manual recognition credit
Updates the organization-owned credit on this donation. soft_credit_donor_id takes precedence over donor_id; omitted/empty donor IDs retain the current donor. Amount must be positive and no greater than the donation. A donor can have only one active credit per gift. Automatic DAF/QCD recognition is read-only here. Relationship attribution changes only when an override or reason is supplied. Requires permission: one of donations, reports_view, reports_manage.
curl --request PUT \
--url https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": 25,
"soft_credit_type_id": 2,
"donor_id": 21,
"soft_credit_donor_id": 21,
"notes": "Introduced the organization to this donor.",
"relationship_role_override": "recognition_only",
"relationship_role_reason": "Recognize influence without attributing financial giving."
}
'import requests
url = "https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}"
payload = {
"amount": 25,
"soft_credit_type_id": 2,
"donor_id": 21,
"soft_credit_donor_id": 21,
"notes": "Introduced the organization to this donor.",
"relationship_role_override": "recognition_only",
"relationship_role_reason": "Recognize influence without attributing financial giving."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: 25,
soft_credit_type_id: 2,
donor_id: 21,
soft_credit_donor_id: 21,
notes: 'Introduced the organization to this donor.',
relationship_role_override: 'recognition_only',
relationship_role_reason: 'Recognize influence without attributing financial giving.'
})
};
fetch('https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{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.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{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([
'amount' => 25,
'soft_credit_type_id' => 2,
'donor_id' => 21,
'soft_credit_donor_id' => 21,
'notes' => 'Introduced the organization to this donor.',
'relationship_role_override' => 'recognition_only',
'relationship_role_reason' => 'Recognize influence without attributing financial giving.'
]),
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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}"
payload := strings.NewReader("{\n \"amount\": 25,\n \"soft_credit_type_id\": 2,\n \"donor_id\": 21,\n \"soft_credit_donor_id\": 21,\n \"notes\": \"Introduced the organization to this donor.\",\n \"relationship_role_override\": \"recognition_only\",\n \"relationship_role_reason\": \"Recognize influence without attributing financial giving.\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 25,\n \"soft_credit_type_id\": 2,\n \"donor_id\": 21,\n \"soft_credit_donor_id\": 21,\n \"notes\": \"Introduced the organization to this donor.\",\n \"relationship_role_override\": \"recognition_only\",\n \"relationship_role_reason\": \"Recognize influence without attributing financial giving.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}")
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 \"amount\": 25,\n \"soft_credit_type_id\": 2,\n \"donor_id\": 21,\n \"soft_credit_donor_id\": 21,\n \"notes\": \"Introduced the organization to this donor.\",\n \"relationship_role_override\": \"recognition_only\",\n \"relationship_role_reason\": \"Recognize influence without attributing financial giving.\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Soft credit updated successfully.",
"status": "success",
"soft_credit": {
"id": 42,
"client_id": 12,
"donation_id": 84,
"donor_id": 21,
"amount": 25,
"soft_credit_type_id": 2,
"notes": "Recognized for the community introduction.",
"relationship_role_override": "recognition_only",
"relationship_role_context": {},
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"deleted_at": "2023-11-07T05:31:56Z",
"donor": {
"id": 12345,
"client_id": 207,
"hysform_id": 42,
"donorprogram_id": 11,
"household_id": 88,
"type": "INDIVIDUAL",
"username": "janedoe",
"email": "jane@example.com",
"organization_name": "Acme Foundation",
"first_name": "Jane",
"last_name": "Doe",
"preferred_contact_method": "email",
"phone": "(555) 123-4567",
"phone_e164": "+15551234567",
"can_receive_sms": true,
"street": "123 Main St",
"address_line2": "Apt 4B",
"city": "Springfield",
"state": "IL",
"zip": "62704",
"country": "United States",
"country_code": "US",
"subdivision_code": "US-IL",
"json_fields": "<string>",
"year_to_date": {},
"has_artifacts": false,
"batch_id": null,
"created_at": "2025-03-15T19:42:00Z",
"updated_at": "2026-01-02T08:11:00Z",
"deleted_at": null
},
"soft_credit_type": {
"id": 2,
"key": "in_honor_of",
"name": "In Honor Of",
"description": "Recognition for a gift.",
"active": true
},
"donation": {
"id": 983221,
"client_id": 207,
"donor_id": 12345,
"amount": 51.5,
"currency": "USD",
"designation": 4711,
"type": 1,
"method": 3,
"frequency": 5,
"one_time": true,
"duration": "2027-01-15",
"processing_fee": 2,
"platform_fee": 0.5,
"amount_excluding_fee": 49.5,
"processor_net_amount": 49.5,
"processor_fee_currency": "USD",
"donor_covered_fee": 1.5,
"processing_fee_known": true,
"actual_charged_amount": 103,
"in_kind_category": "goods",
"result": "successful",
"transaction_id": "ch_3OqXXXXX",
"transaction_status": "succeeded",
"refunded": false,
"refunded_amount": 0,
"refundable": true,
"is_tax_deductible": true,
"tags": [
"matching-gift",
"year-end"
],
"notes": "Memo: in honor of John Doe",
"quickbooks_receipt_id": "qbo_5512",
"receipt_sent_at": "2026-01-02T08:30:00Z",
"acknowledged_at": "2026-01-03T10:15:00Z",
"acknowledged_by_user_id": 42,
"acknowledgement_source": "manual",
"acknowledgement_context_json": {},
"json_fields": "<string>",
"batch_id": null,
"is_csv_import": false,
"created_at": "2026-01-02T08:25:00Z",
"updated_at": "2026-01-02T08:30:00Z",
"deleted_at": null
},
"designation": {},
"donor_name": {
"id": 21,
"hysform_id": 1,
"name": "Jane Donor",
"email": "jane@example.org"
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}Authorizations
Passport bearer token authentication for legacy admin sessions.
Path Parameters
Donation id in the current organization.
Id in the current organization.
Body
Validated request fields for this operation.
Required for a single credit; positive and no greater than its donation amount.
x >= 0.0125
Active manual recognition type; automatic DAF/QCD types are rejected.
2
Recognition donor in the current organization; soft_credit_donor_id can supply this value on create.
21
Create alias that must match donor_id when both are supplied; update chooses this before donor_id.
21
"Introduced the organization to this donor."
relationship_giving, influence_only, recognition_only, excluded, null "recognition_only"
Required when a relationship-role override is supplied.
1000"Recognize influence without attributing financial giving."
curl --request PUT \
--url https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"amount": 25,
"soft_credit_type_id": 2,
"donor_id": 21,
"soft_credit_donor_id": 21,
"notes": "Introduced the organization to this donor.",
"relationship_role_override": "recognition_only",
"relationship_role_reason": "Recognize influence without attributing financial giving."
}
'import requests
url = "https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}"
payload = {
"amount": 25,
"soft_credit_type_id": 2,
"donor_id": 21,
"soft_credit_donor_id": 21,
"notes": "Introduced the organization to this donor.",
"relationship_role_override": "recognition_only",
"relationship_role_reason": "Recognize influence without attributing financial giving."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
amount: 25,
soft_credit_type_id: 2,
donor_id: 21,
soft_credit_donor_id: 21,
notes: 'Introduced the organization to this donor.',
relationship_role_override: 'recognition_only',
relationship_role_reason: 'Recognize influence without attributing financial giving.'
})
};
fetch('https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{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.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{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([
'amount' => 25,
'soft_credit_type_id' => 2,
'donor_id' => 21,
'soft_credit_donor_id' => 21,
'notes' => 'Introduced the organization to this donor.',
'relationship_role_override' => 'recognition_only',
'relationship_role_reason' => 'Recognize influence without attributing financial giving.'
]),
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;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}"
payload := strings.NewReader("{\n \"amount\": 25,\n \"soft_credit_type_id\": 2,\n \"donor_id\": 21,\n \"soft_credit_donor_id\": 21,\n \"notes\": \"Introduced the organization to this donor.\",\n \"relationship_role_override\": \"recognition_only\",\n \"relationship_role_reason\": \"Recognize influence without attributing financial giving.\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"amount\": 25,\n \"soft_credit_type_id\": 2,\n \"donor_id\": 21,\n \"soft_credit_donor_id\": 21,\n \"notes\": \"Introduced the organization to this donor.\",\n \"relationship_role_override\": \"recognition_only\",\n \"relationship_role_reason\": \"Recognize influence without attributing financial giving.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.gratona.com/v1/admin/donations/{donation_id}/soft-credits/{id}")
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 \"amount\": 25,\n \"soft_credit_type_id\": 2,\n \"donor_id\": 21,\n \"soft_credit_donor_id\": 21,\n \"notes\": \"Introduced the organization to this donor.\",\n \"relationship_role_override\": \"recognition_only\",\n \"relationship_role_reason\": \"Recognize influence without attributing financial giving.\"\n}"
response = http.request(request)
puts response.read_body{
"message": "Soft credit updated successfully.",
"status": "success",
"soft_credit": {
"id": 42,
"client_id": 12,
"donation_id": 84,
"donor_id": 21,
"amount": 25,
"soft_credit_type_id": 2,
"notes": "Recognized for the community introduction.",
"relationship_role_override": "recognition_only",
"relationship_role_context": {},
"created_at": "2026-10-20T12:00:00Z",
"updated_at": "2026-10-20T12:00:00Z",
"deleted_at": "2023-11-07T05:31:56Z",
"donor": {
"id": 12345,
"client_id": 207,
"hysform_id": 42,
"donorprogram_id": 11,
"household_id": 88,
"type": "INDIVIDUAL",
"username": "janedoe",
"email": "jane@example.com",
"organization_name": "Acme Foundation",
"first_name": "Jane",
"last_name": "Doe",
"preferred_contact_method": "email",
"phone": "(555) 123-4567",
"phone_e164": "+15551234567",
"can_receive_sms": true,
"street": "123 Main St",
"address_line2": "Apt 4B",
"city": "Springfield",
"state": "IL",
"zip": "62704",
"country": "United States",
"country_code": "US",
"subdivision_code": "US-IL",
"json_fields": "<string>",
"year_to_date": {},
"has_artifacts": false,
"batch_id": null,
"created_at": "2025-03-15T19:42:00Z",
"updated_at": "2026-01-02T08:11:00Z",
"deleted_at": null
},
"soft_credit_type": {
"id": 2,
"key": "in_honor_of",
"name": "In Honor Of",
"description": "Recognition for a gift.",
"active": true
},
"donation": {
"id": 983221,
"client_id": 207,
"donor_id": 12345,
"amount": 51.5,
"currency": "USD",
"designation": 4711,
"type": 1,
"method": 3,
"frequency": 5,
"one_time": true,
"duration": "2027-01-15",
"processing_fee": 2,
"platform_fee": 0.5,
"amount_excluding_fee": 49.5,
"processor_net_amount": 49.5,
"processor_fee_currency": "USD",
"donor_covered_fee": 1.5,
"processing_fee_known": true,
"actual_charged_amount": 103,
"in_kind_category": "goods",
"result": "successful",
"transaction_id": "ch_3OqXXXXX",
"transaction_status": "succeeded",
"refunded": false,
"refunded_amount": 0,
"refundable": true,
"is_tax_deductible": true,
"tags": [
"matching-gift",
"year-end"
],
"notes": "Memo: in honor of John Doe",
"quickbooks_receipt_id": "qbo_5512",
"receipt_sent_at": "2026-01-02T08:30:00Z",
"acknowledged_at": "2026-01-03T10:15:00Z",
"acknowledged_by_user_id": 42,
"acknowledgement_source": "manual",
"acknowledgement_context_json": {},
"json_fields": "<string>",
"batch_id": null,
"is_csv_import": false,
"created_at": "2026-01-02T08:25:00Z",
"updated_at": "2026-01-02T08:30:00Z",
"deleted_at": null
},
"designation": {},
"donor_name": {
"id": 21,
"hysform_id": 1,
"name": "Jane Donor",
"email": "jane@example.org"
}
}
}{
"message": "Unauthorized",
"status": "error"
}{
"message": "Not Found",
"status": "error"
}{
"errors": {},
"status": "error",
"message": "The given data was invalid."
}