What a Gift represents
A Gift represents the donation event itself — the amount, the date, the gift type, the donor, and what the donation supports. A typical Gift looks like:- One Contact (
contactId) — the donor. - One or more GiftDesignations — the allocation of the gift’s amount to specific Projects.
- Optionally, one RecurringGift (
recurringGiftTransactionId) — if this Gift is a payment on a recurring schedule. - Optionally, one Pledge (
pledgeTransactionId) — if this Gift is a payment toward a pledge commitment. - Optionally, a transaction source pair (
transactionSource+transactionId) — the external system’s identifier for this gift, used for idempotency and reconciliation.
Gift types
ThegiftType field describes what kind of gift was made. The CRM+ spec does not enumerate the valid values, but the live API supports a documented set covering the major donation types:
| Gift type | What it represents |
|---|---|
Cash | A monetary donation (cash, check, credit card, ACH). The default for most online giving flows. |
EFT | Electronic Funds Transfer — bank transfers, ACH, wire. |
Credit | Specifically credit-card donations, where the organization tracks them separately from other cash. |
Stock | A gift of securities (publicly traded stock, bonds, mutual funds). Recorded at the fair market value on the gift date. |
NonCash | An in-kind donation of goods (auction items, food, equipment, services). |
Other | Anything that doesn’t fit the standard types. |
The exact gift type strings accepted by the live API are not enumerated in the OpenAPI spec — the field is typed as
string. The list above reflects the commonly used values. To discover the gift types valid for a specific organization, call GET /api/Gift/NonCashGiftTypes for the non-cash subset, or check with the organization’s administrator for the full enabled list.nonCashGiftType for the specific type (e.g., “Auction Item”), inKindDescription for a free-text description, and inKindValue for the assessed fair value.
GiftDesignations — where the money goes
A Gift always has at least one GiftDesignation. A designation is the allocation of part (or all) of a gift’s amount to a specific Project. If a donor gives 500. If a donor gives 500.| Field | Type | Description |
|---|---|---|
id | integer | The unique designation ID. |
projectId | integer | The Project this allocation funds. |
project | string | Display name of the Project. |
projectCode | string | Organization-defined short code for the Project. |
externalAccountingCode | string | Project’s accounting-system code (used in reconciliation). |
amountDesignated | number | The portion of the gift allocated to this Project. |
amountDesignated values on a Gift must equal the Gift’s amount. The API enforces this constraint at creation time.
For deeper coverage of the Project, Campaign, and Designation model, see Funds, Campaigns, and Designations.
Campaigns
A Campaign is a time-bound fundraising effort that groups Projects together (e.g., “Annual Giving 2024”, “Capital Campaign Phase II”). Gifts are associated with a Campaign through their Project designations — the Project belongs to a Campaign, and the Gift inherits that Campaign context. This has practical implications for partners: if your integration needs to associate gifts with a specific Campaign, the nonprofit administrator must create the Campaign in Virtuous first, then your integration references it by the Campaign’s projects.Recurring gifts and pledges
A Gift can be standalone, or it can be a payment on a longer arrangement:- RecurringGift — an ongoing schedule (monthly, quarterly, annual). Each successful payment on the schedule becomes a Gift with
recurringGiftTransactionIdset to the schedule’s ID. The Gift inherits the RecurringGift’s designations by default. - Pledge — a commitment to give a specific amount over time (e.g., “$10,000 over four years”). Each payment toward the pledge becomes a Gift with
pledgeTransactionIdset to the pledge’s ID, and the Gift’s amount is recorded against the pledge balance.
Premiums
A GiftPremium is a donor-recognition item given in exchange for a gift (a t-shirt, a book, an event ticket). Premiums are tracked on the Gift so the organization can fulfill them and so the IRS-deductible portion of the gift can be calculated correctly:GET /api/Premium returns the catalog of premiums available in the organization. Your integration assigns premiums by their premiumId when recording the Gift.
Transaction source and ID
Two fields connect a Gift back to your platform’s record of the same donation:| Field | Type | Purpose |
|---|---|---|
transactionSource | string | The name of your platform — for example, "Stripe", "Eventbrite", "YourPlatformName". |
transactionId | string | Your platform’s unique identifier for this specific donation. |
transactionSource + transactionId form an external reference that uniquely identifies the donation in your system. This pair is the foundation of two critical patterns:
- Idempotent gift creation. When you re-submit a gift with the same
transactionSource/transactionIdpair (e.g., after a retry following a network failure), the Transaction endpoint matches it as a duplicate and does not create a second Gift record. - Lookup-by-external-ID.
GET /api/Gift/{transactionSource}/{transactionId}retrieves a Virtuous Gift by your platform’s IDs — useful for syncing updates without storing the Virtuous Gift ID in your database.
Reversals and refunds
Refunding or reversing a gift uses a dedicated endpoint, not a DELETE on the Gift:POST /api/Gift/ReversingTransaction— records a reversing transaction that offsets the original gift. The original Gift remains on the record (for audit purposes); the reversing transaction is a separate, offsetting record.
DELETE /api/Gift/{giftId} for refunds; that is not how the financial audit trail works in Virtuous.
Reading gifts
The standard read patterns:| Endpoint | When to use |
|---|---|
GET /api/Gift/{giftId} | Look up one Gift by its Virtuous ID. |
GET /api/Gift/{transactionSource}/{transactionId} | Look up one Gift by your platform’s IDs. The cleanest pattern for sync workflows that don’t store the Virtuous ID. |
GET /api/Gift/ByContact/{contactId} | List all Gifts for a given Contact. |
POST /api/Gift/Query | Filtered paginated retrieval — incremental sync by modification date, bulk export, etc. See Pagination and Filtering. |
POST /api/Gift/Query/FullGift | Same as Query but returns the complete Gift payload including all designations, premiums, and pledge linkages. Slower; use only when full detail is required. |
Field typing
Where to go next
Transactions
The recommended pattern for creating Gifts from external systems with automatic matching.
Funds, Campaigns, and Designations
How GiftDesignations flow to Projects and how Projects fit into Campaigns.
Create a Donation
A working example of recording a Gift end-to-end.
Sync External Donations into Virtuous
The canonical recipe for pushing gifts from your platform into Virtuous via the Transaction endpoint.
Query Donations by Date Range
Pull gifts within a date window for reporting or reconciliation.
Stripe to Virtuous CRM
A complete integration recipe showing Stripe gift events flowing into Virtuous.