Skip to main content

Improved: Realistic response examples across the API reference

We refreshed the success response examples on several high-value CRM+ endpoints so they show realistic, connected data instead of generic <string> placeholders. Examples now use a consistent fictional world (the Riverside Hope Foundation and its donors), so the same person and gift appear coherently across endpoints.Updated endpoints include:
  • ContactsGET /api/Contact/{contactId}, POST /api/Contact, POST /api/Contact/Search, POST /api/Contact/Query
  • GiftsGET /api/Gift/{giftId}, POST /api/Gift, POST /api/Gift/Query
  • Recurring GiftsGET /api/RecurringGift/{recurringGiftId}, POST /api/RecurringGift
  • PledgesGET /api/v2/Pledge/{pledgeId}, POST /api/v2/Pledge
  • ProjectsGET /api/Project/{projectId}
  • GrantsGET /api/Grant/{grantId}, POST /api/Grant, POST /api/Grant/Query
  • EventsGET /api/Event, POST /api/Event, GET /api/Event/{eventId}, POST /api/Event/Query, GET /api/Event/{eventId}/Attendees
  • TributesGET /api/Tribute/Search, POST /api/Tribute, PUT /api/Tribute/{tributeId}
  • NotesGET /api/ContactNote/{noteId}, POST /api/ContactNote, GET /api/ContactNote/ByContact/{contactId}, POST /api/ContactNote/Query
  • Planned GiftsGET /api/PlannedGift/{plannedGiftId}, POST /api/PlannedGift, POST /api/PlannedGift/Query
  • PremiumsGET /api/Premium/{premiumId}, POST /api/Premium, POST /api/Premium/Search
  • CommunicationsGET /api/Communication/{communicationId}, POST /api/Communication
  • SegmentsGET /api/Segment/{segmentId}, POST /api/Segment
  • Project Notes & RolesGET /api/ProjectNote/{noteId}, POST /api/ProjectNote, GET /api/ProjectRole/{projectRoleId}, POST /api/ProjectRole
  • RemindersGET /api/Reminder/Active, POST /api/Reminder, GET /api/Reminder/ByContact/{contactId}
We then extended the same realistic examples across the rest of the high-traffic surface: the update (PUT) responses for the resources above, their ByContact/list/query variants, the individual, address, contact-method, tag, organization-group, planned-gift, premium, segment, and reminder endpoints, webhooks, and the composite Query/FullContact, Query/FullGift, and {id}/Gifts responses. The majority of CRM+ read, create, update, and list endpoints now return realistic sample data.These are documentation-only changes — no schemas, fields, or behavior changed.

Improved: Endpoint-specific error documentation

Error responses across the CRM+ API reference now explain what each status code means for the endpoint you’re looking at, instead of showing a bare BadRequest or NotFound label.
  • A new Errors section in the API overview covers the shared error envelope (message plus modelState) and what 400, 401, 403, 404, 429, and 5xx mean across the API.
  • Every authenticated endpoint now documents 401, 403, and 429, including the rate limit headers to use for backoff.
  • 400 descriptions call out the likely cause for that endpoint — model validation with modelState on write endpoints, condition/operator/paging problems on query endpoints, and malformed path values elsewhere.
  • 404 descriptions name the identifier that didn’t resolve, and were added to single-record GET, PUT, and DELETE endpoints that were missing them. List endpoints were left alone, since they generally return an empty result set instead.
  • The transaction (import) endpoints now note that a success response only means the payload was queued — matching failures surface in the import review screen, not in the API response.
These are documentation-only changes — no schemas, fields, or behavior changed.

Improved: Consistent endpoint names and cleaned-up wording

Endpoint names across the CRM+ API reference now follow a consistent verb + concise object pattern, matching the Volunteer API reference.
  • Sidebar and page titles use List, Get, Create, Update, Delete, Query, and Search plus the resource — for example, “List Contact Method Types” instead of “Gets the types of contact methods”, and “Search Contacts” instead of “Find all Contacts that match, fully or partially, the given search parameters”.
  • POST /api/Contact/Transaction and POST /api/Contact/Batch are now “Create a Contact Transaction” and “Create a Contact Import”, with descriptions covering the change and duplicate checking the old names described.
  • Typos and awkward wording were fixed, including “it’s value” → “its value”, “Contact Indvidual” → “Contact Individual”, and “Communictation Query Options” → “Communication Query Options”.
  • Leftover internal code references such as {M:Virtuous.WebApi.Controllers.ProjectController.QueryOptions} now name the endpoint they point to.
URLs, paths, fields, and operations are unchanged — this only affects the names and descriptions shown in the docs.

Improved: Parameter and field descriptions

Parameters and the fields partners work with most now carry descriptions in the CRM+ API reference, so the playground and generated code samples explain what to send instead of just showing a type.
  • Paging and sortingskip, take, sortBy, and descending are described consistently everywhere they appear, including endpoints where they previously read int, Optional boolean, or nothing at all. Endpoints that cap take at 1000 still say so.
  • Path parameters — every templated identifier is described, including the ones that previously showed only (Required). GET /api/ContactIndividual/{contactIndividualId}/EmailList now declares its contactIndividualId path parameter, which it was missing.
  • Query filters — the groups/conditions filter structure used by the Query endpoints now explains how groups combine, what parameter and operator accept, and when to use value, secondaryValue, or values. The matching QueryOptions responses describe the options they return.
  • List responseslist and total are described on every paged response, including how to use total with skip and take.
  • Request and response fields — the common ones are documented across resources: identifiers, customFields and customCollections, transactionSource/transactionId and referenceSource/referenceId and their role in preventing duplicate imports, isPrivate, audit fields such as createDateTimeUtc and modifiedByUser, and the *Formatted display variants.
These are documentation-only changes — no schemas, fields, or behavior changed.

Improved: Endpoint descriptions

Every endpoint in the CRM+ API reference now has a description explaining what it does, not just a name — 228 endpoints that previously showed nothing at all, plus a handful whose copy was a placeholder or a leftover from another endpoint.
  • What each endpoint does — descriptions say what a call returns or changes, name the fields you most often need to send, and point to the related endpoint when there is a better one for the job (Create a Contact to Create a Contact Transaction, Delete a Gift to Create a Reversing Transaction, Search Contacts to Query Contacts).
  • Queries — every Query endpoint points to its QueryOptions endpoint and repeats the 1,000 record take cap, and every QueryOptions endpoint explains that its response is what you use to build a query.
  • Placeholder copy removed — the five volunteer endpoints whose description read only “Available starting 3/29/2022” now describe what they do, List Non-Cash Gift Types and List Contact Note Custom Fields no longer describe the wrong object, and the endpoints whose description was just “HMAC Auth only.” now explain what they return as well.
These are documentation-only changes — no schemas, fields, or behavior changed.

New: CRM+ API Documentation Changelog

We’ve launched the CRM+ API Documentation Changelog to make it easier to track updates to the CRM+ developer experience.This changelog will include updates such as:
  • New and updated CRM+ API endpoints
  • Request and response schema changes
  • New fields, objects, filters, and parameters
  • Authentication, permissions, and access updates
  • Deprecation notices and breaking changes
  • Improvements to examples, guides, recipes, and API reference documentation
Last modified on July 27, 2026