Neon One Custom Fields API

Standard custom fields attached to accounts, donations, and events, plus the full Custom Objects framework (objects, fields, form/list layouts, relations, validators, and records) shipped to API v2.10 in April 2025 for modeling data that does not fit Neon CRM's built-in schema.

OpenAPI Specification

neonone-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Neon CRM API v2
  description: >-
    Neon CRM API v2 is a RESTful, JSON-based rebuild of Neon One's legacy API
    v1, first launched in 2019. It exposes constituent accounts, households,
    donations, pledges, recurring donations, campaigns, memberships, events,
    custom fields and custom objects, orders and the online store, volunteers,
    and webhook subscriptions. All requests use HTTP Basic Authentication with
    the organization's Org ID as the username and an API key as the password.
    Neon CRM API v1 and its legacy webhook structure are scheduled to be
    retired on July 11, 2026; this document covers API v2 only. This is a
    representative subset of the full v2 surface, grounded in Neon's public
    developer documentation and version release notes (v2.0 - v2.11), not an
    exhaustive mirror of every documented endpoint.
  version: '2.11'
  contact:
    name: Neon One Developer Center
    url: https://developer.neoncrm.com/
  license:
    name: Proprietary
    url: https://neonone.com/
servers:
  - url: https://api.neoncrm.com/v2
    description: Production and Sandbox
  - url: https://trial.z2systems.com/v2
    description: Trial instances
security:
  - basicAuth: []
tags:
  - name: Accounts
    description: Individual and organization constituent records, contacts, and addresses.
  - name: Households
    description: Grouping of individual accounts into households with relation types.
  - name: Donations
    description: Donations, pledges, pledge payments, recurring donations, and soft credits.
  - name: Campaigns
    description: Fundraising campaigns that transactions are attributed to.
  - name: Memberships
    description: Membership levels and terms held by an account.
  - name: Events
    description: Events, tickets, and event registrations.
  - name: Custom Fields
    description: Standard custom fields and the Custom Objects framework.
  - name: Orders
    description: Orders grouping donations, memberships, and store purchases.
  - name: Store
    description: Online store products, catalogs, and categories.
  - name: Volunteers
    description: Volunteers, groups, opportunities, roles, shifts, and time sheets.
  - name: Webhooks
    description: Outbound webhook subscriptions.
  - name: Properties
    description: Reference and lookup data used across other resources.
paths:
  /accounts:
    get:
      operationId: listAccounts
      tags: [Accounts]
      summary: List accounts
      description: Retrieves accounts in bulk, functioning similarly to the v1 keyword search. Added in API v2.3.
      parameters:
        - $ref: '#/components/parameters/CurrentPage'
        - $ref: '#/components/parameters/PageSize'
      responses:
        '200':
          description: A page of accounts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createAccount
      tags: [Accounts]
      summary: Create an account
      description: Creates a new individual or company account.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AccountInput'
      responses:
        '200':
          description: The created account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Account'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /accounts/{id}:
    parameters:
      - $ref: '#/components/parameters/AccountId'
    get:
      operationId: getAccount
      tags: [Accounts]
      summary: Retrieve an account
      description: Retrieves an individual or organization account by ID. Returns 222 Merged Account if the account was merged into another.
      responses:
        '200':
          description: The requested account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Account'
        '222':
          description: The account has been merged into another account.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateAccount
      tags: [Accounts]
      summary: Update an account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AccountInput'
      responses:
        '200':
          description: The updated account.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Account'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /accounts/search:
    post:
      operationId: searchAccounts
      tags: [Accounts]
      summary: Search accounts
      description: Advanced search over accounts using searchFields and outputFields. Rate-limited to 1 simultaneous request.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: Matching accounts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountListResponse'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /accounts/search/searchFields:
    get:
      operationId: listAccountSearchFields
      tags: [Accounts]
      summary: List account search fields
      responses:
        '200':
          description: Fields usable as accounts/search criteria.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
  /accounts/search/outputFields:
    get:
      operationId: listAccountOutputFields
      tags: [Accounts]
      summary: List account output fields
      responses:
        '200':
          description: Fields returnable from accounts/search.
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
  /accounts/link:
    post:
      operationId: linkAccounts
      tags: [Accounts]
      summary: Link two accounts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: Link result.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /accounts/unlink:
    post:
      operationId: unlinkAccounts
      tags: [Accounts]
      summary: Unlink two previously merged accounts
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: Unlink result.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /accounts/{id}/contacts:
    parameters:
      - $ref: '#/components/parameters/AccountId'
    get:
      operationId: listAccountContacts
      tags: [Accounts]
      summary: List contacts on an organization account
      responses:
        '200':
          description: A list of contacts.
          content:
            application/json:
              schema:
                type: object
                properties:
                  contacts:
                    type: array
                    items:
                      $ref: '#/components/schemas/Contact'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: addAccountContact
      tags: [Accounts]
      summary: Add a contact to an organization account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Contact'
      responses:
        '200':
          description: The created contact.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /accounts/{id}/contacts/{contactId}:
    parameters:
      - $ref: '#/components/parameters/AccountId'
      - name: contactId
        in: path
        required: true
        description: The ID of the contact.
        schema:
          type: string
    get:
      operationId: getAccountContact
      tags: [Accounts]
      summary: Retrieve a contact
      responses:
        '200':
          description: The requested contact.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateAccountContact
      tags: [Accounts]
      summary: Update a contact
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Contact'
      responses:
        '200':
          description: The updated contact.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: patchAccountContact
      tags: [Accounts]
      summary: Partially update a contact
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The updated contact.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Contact'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteAccountContact
      tags: [Accounts]
      summary: Remove a contact from an organization account
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /accounts/{id}/donations:
    parameters:
      - $ref: '#/components/parameters/AccountId'
    get:
      operationId: listAccountDonations
      tags: [Accounts]
      summary: List an account's donations
      responses:
        '200':
          description: A list of donations for the account.
          content:
            application/json:
              schema:
                type: object
                properties:
                  donations:
                    type: array
                    items:
                      $ref: '#/components/schemas/Donation'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /accounts/{id}/pledges:
    parameters:
      - $ref: '#/components/parameters/AccountId'
    get:
      operationId: listAccountPledges
      tags: [Accounts]
      summary: List an account's pledges
      description: Includes the pledgeStatus (open or closed) field added in API v2.11.
      responses:
        '200':
          description: A list of pledges for the account.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pledges:
                    type: array
                    items:
                      $ref: '#/components/schemas/Pledge'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /accounts/{id}/memberships:
    parameters:
      - $ref: '#/components/parameters/AccountId'
    get:
      operationId: listAccountMemberships
      tags: [Memberships]
      summary: List an account's memberships
      description: Includes isActive and primaryActiveMembership fields added in API v2.11.
      responses:
        '200':
          description: A list of memberships held by the account.
          content:
            application/json:
              schema:
                type: object
                properties:
                  memberships:
                    type: array
                    items:
                      $ref: '#/components/schemas/Membership'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /memberships/{memberId}/subMembers:
    parameters:
      - name: memberId
        in: path
        required: true
        description: The ID of the membership.
        schema:
          type: string
    get:
      operationId: listMembershipSubMembers
      tags: [Memberships]
      summary: List sub-members on a membership
      description: Includes the isCurrentEmployee query parameter added in API v2.10.
      parameters:
        - name: isCurrentEmployee
          in: query
          required: false
          schema:
            type: boolean
      responses:
        '200':
          description: A list of sub-members.
          content:
            application/json:
              schema:
                type: object
                properties:
                  subMembers:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /addresses:
    post:
      operationId: createAddress
      tags: [Accounts]
      summary: Add an address to an account
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Address'
      responses:
        '200':
          description: The created address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Address'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /addresses/{addressId}:
    parameters:
      - name: addressId
        in: path
        required: true
        description: The ID of the address.
        schema:
          type: string
    get:
      operationId: getAddress
      tags: [Accounts]
      summary: Retrieve an address
      responses:
        '200':
          description: The requested address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Address'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateAddress
      tags: [Accounts]
      summary: Update an address
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Address'
      responses:
        '200':
          description: The updated address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Address'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: patchAddress
      tags: [Accounts]
      summary: Partially update an address
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The updated address.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Address'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteAddress
      tags: [Accounts]
      summary: Remove an address
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /households:
    post:
      operationId: createHousehold
      tags: [Households]
      summary: Create a household
      description: Household endpoints shipped to API v2.10 on June 7, 2025.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/HouseholdInput'
      responses:
        '200':
          description: The created household.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Household'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /households/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: The ID of the household.
        schema:
          type: string
    put:
      operationId: updateHousehold
      tags: [Households]
      summary: Update a household
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/HouseholdInput'
      responses:
        '200':
          description: The updated household.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Household'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteHousehold
      tags: [Households]
      summary: Delete a household
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /households/listHouseholds:
    get:
      operationId: listHouseholds
      tags: [Households]
      summary: List households
      responses:
        '200':
          description: A list of households.
          content:
            application/json:
              schema:
                type: object
                properties:
                  households:
                    type: array
                    items:
                      $ref: '#/components/schemas/Household'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /households/listRelationTypes:
    get:
      operationId: listHouseholdRelationTypes
      tags: [Households]
      summary: List household relation types
      responses:
        '200':
          description: A list of relation types (e.g. spouse, child, parent).
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  additionalProperties: true
  /donations:
    post:
      operationId: createDonation
      tags: [Donations]
      summary: Create a donation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DonationInput'
      responses:
        '200':
          description: The created donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Donation'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /donations/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: The ID of the donation.
        schema:
          type: string
    get:
      operationId: getDonation
      tags: [Donations]
      summary: Retrieve a donation
      responses:
        '200':
          description: The requested donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Donation'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateDonation
      tags: [Donations]
      summary: Update a donation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DonationInput'
      responses:
        '200':
          description: The updated donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Donation'
        '404':
          $ref: '#/components/responses/NotFound'
    patch:
      operationId: patchDonation
      tags: [Donations]
      summary: Partially update a donation
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The updated donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Donation'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteDonation
      tags: [Donations]
      summary: Delete a donation
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /donations/search:
    post:
      operationId: searchDonations
      tags: [Donations]
      summary: Search donations
      description: Rate-limited to 1 simultaneous request.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SearchRequest'
      responses:
        '200':
          description: Matching donations.
          content:
            application/json:
              schema:
                type: object
                properties:
                  searchResults:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
        '429':
          $ref: '#/components/responses/TooManyRequests'
  /pledges:
    post:
      operationId: createPledge
      tags: [Donations]
      summary: Create a pledge
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PledgeInput'
      responses:
        '200':
          description: The created pledge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pledge'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /pledges/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: The ID of the pledge.
        schema:
          type: string
    get:
      operationId: getPledge
      tags: [Donations]
      summary: Retrieve a pledge
      responses:
        '200':
          description: The requested pledge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pledge'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updatePledge
      tags: [Donations]
      summary: Update a pledge
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PledgeInput'
      responses:
        '200':
          description: The updated pledge.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Pledge'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deletePledge
      tags: [Donations]
      summary: Delete a pledge
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /pledges/{id}/pledgePayments:
    parameters:
      - name: id
        in: path
        required: true
        description: The ID of the pledge.
        schema:
          type: string
    get:
      operationId: listPledgePayments
      tags: [Donations]
      summary: List payments made against a pledge
      responses:
        '200':
          description: A list of pledge payments.
          content:
            application/json:
              schema:
                type: object
                properties:
                  pledgePayments:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createPledgePayment
      tags: [Donations]
      summary: Create a payment against a pledge
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The created pledge payment.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /pledges/{id}/pledgePayments/{paymentId}:
    parameters:
      - name: id
        in: path
        required: true
        description: The ID of the pledge.
        schema:
          type: string
      - name: paymentId
        in: path
        required: true
        description: The ID of the pledge payment.
        schema:
          type: string
    get:
      operationId: getPledgePayment
      tags: [Donations]
      summary: Retrieve a pledge payment
      responses:
        '200':
          description: The requested pledge payment.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deletePledgePayment
      tags: [Donations]
      summary: Delete a pledge payment
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /pledges/{pledgeId}/installments:
    parameters:
      - name: pledgeId
        in: path
        required: true
        description: The ID of the pledge.
        schema:
          type: string
    post:
      operationId: createPledgeInstallment
      tags: [Donations]
      summary: Create a pledge installment
      description: Added in API v2.3.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The created installment.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
  /pledges/{pledgeId}/installments/{id}:
    parameters:
      - name: pledgeId
        in: path
        required: true
        description: The ID of the pledge.
        schema:
          type: string
      - name: id
        in: path
        required: true
        description: The ID of the installment.
        schema:
          type: string
    get:
      operationId: getPledgeInstallment
      tags: [Donations]
      summary: Retrieve a pledge installment
      responses:
        '200':
          description: The requested installment.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updatePledgeInstallment
      tags: [Donations]
      summary: Update a pledge installment
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The updated installment.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deletePledgeInstallment
      tags: [Donations]
      summary: Delete a pledge installment
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /recurring:
    get:
      operationId: listRecurringDonations
      tags: [Donations]
      summary: List recurring donation schedules
      responses:
        '200':
          description: A list of recurring donations.
          content:
            application/json:
              schema:
                type: object
                properties:
                  recurringDonations:
                    type: array
                    items:
                      $ref: '#/components/schemas/RecurringDonation'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createRecurringDonation
      tags: [Donations]
      summary: Create a recurring donation schedule
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecurringDonation'
      responses:
        '200':
          description: The created recurring donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecurringDonation'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /recurring/{id}:
    parameters:
      - name: id
        in: path
        required: true
        description: The ID of the recurring donation.
        schema:
          type: string
    get:
      operationId: getRecurringDonation
      tags: [Donations]
      summary: Retrieve a recurring donation schedule
      responses:
        '200':
          description: The requested recurring donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecurringDonation'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateRecurringDonation
      tags: [Donations]
      summary: Update a recurring donation schedule
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RecurringDonation'
      responses:
        '200':
          description: The updated recurring donation.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RecurringDonation'
        '404':
          $ref: '#/components/responses/NotFound'
    delete:
      operationId: deleteRecurringDonation
      tags: [Donations]
      summary: Cancel/delete a recurring donation schedule
      responses:
        '200':
          description: Deletion confirmation.
        '404':
          $ref: '#/components/responses/NotFound'
  /softCredits:
    get:
      operationId: listSoftCredits
      tags: [Donations]
      summary: List soft credits
      description: Added in API v2.3.
      responses:
        '200':
          description: A list of soft credits.
          content:
            application/json:
              schema:
                type: object
                properties:
                  softCredits:
                    type: array
                    items:
                      type: object
                      additionalProperties: true
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createSoftCredit
      tags: [Donations]
      summary: Create a soft credit
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: true
      responses:
        '200':
          description: The created soft credit.
          content:
            application/json:
              schema:
                type: object
                additionalProperties: true
        '401'

# --- truncated at 32 KB (89 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/neonone/refs/heads/main/openapi/neonone-openapi.yml