> This page is for version v2026-10-01.
> For other versions, use one of these documentation indexes:
> - v2026-04-01 (default): https://docs.givechariot.com/v2026-04-01/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.givechariot.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.givechariot.com/_mcp/server.

# Merge Donations

POST https://api.givechariot.com/v1/donations/merge
Content-Type: application/json

Merge one donation into another. The donation named by `into` is kept
and keeps its ID. The donation named by `from` is soft-deleted and points
at the `into` donation.

The response is the `into` donation after the merge. A value already set
on it is kept. A value it is missing can be filled with the value from
the `from` donation.

A merge cannot be undone. Repeating a completed merge is safe: it returns
the `into` donation again. The merge emits a `donation.updated` event for
the `into` donation and a `donation.deleted` event for the `from` one.

## Errors

- `400` when the same donation is on both sides.
- `404` when a donation does not exist.
- `409` when an input is deleted or merged. The problem `type` is
  `donation_deleted` or `donation_merged`, and a merged input carries the
  ID of the donation it was merged into. A deleted or merged donation
  still exists, so a write conflicts with its state.
- `409` when both donations are reconciled to a deposit. The problem
  `type` is `donation_merge_conflict`.

Reference: https://docs.givechariot.com/v2026-10-01/api/donations/merge-donations

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Servers

- `https://api.givechariot.com` (Production, default)
- `https://sandboxapi.givechariot.com` (Sandbox)

## Request

### Headers

- `Idempotency-Key` (string, optional) — The idempotency key for the request.

### Body (application/json)

This endpoint expects an object.

- `from` (string, required) — The donation to merge. It is soft-deleted and points at the into donation.
- `into` (string, required) — The donation that is kept. It keeps its ID.

## Response

### 200

The merge is done. The body is the into donation, with values from the from donation filled in where it had none.

- `id` (string, required) — The unique identifier for the donation in Chariot's system.
- `amount_gross` (long, required) — The total amount of the donation in minor units of the currency. For dollars, for example, this is cents.
- `amount_net` (long, required) — The amount of the donation that the nonprofit will receive after processing fees are deducted in minor units of the currency. For dollars, for example, this is cents.
- `amount_fee` (long, required) — The amount of the fee that was deducted from the donation in minor units of the currency. For dollars, for example, this is cents.
- `currency` (string, required) — The [ISO 4217 code](https://en.wikipedia.org/wiki/ISO_4217) for every amount on the donation. Defaults to USD unless the source reports another currency.
- `created_at` (datetime, required) — The date and time the donation record was created in Chariot.
- `external_id` (string, optional) — Identifier provided by the source or granting organization, when present.
- `source_id` (string, optional) — The identifier of the [Source](/api-reference/sources) that sent this donation.
- `individual_gift_amount` (long, optional, nullable) — The portion of the gross amount contributed directly by the donor.
- `exchange_rate` (ExchangeRate, optional, nullable) — The exchange rate used to convert the donation into `target_currency`. Null when `currency` is already the target currency, or when no rate was reported.
- `donation_type` (enum, optional) — The kind of gift. - `individual`: a gift from an individual donor. - `match`: a company's match of an employee's gift. - `daf`: a grant from a donor-advised fund. - `other`: any other kind of gift. - `unknown`: the source did not report the kind of gift.
  - Allowed values: `individual`, `match`, `daf`, `other`, `unknown`
- `frequency` (enum, optional) — Whether the donor set the gift to repeat. - `one_time`: the donor gave once. - `recurring`: the donor set the gift to repeat. - `unknown`: the source did not report whether the gift repeats.
  - Allowed values: `one_time`, `recurring`, `unknown`
- `effective_date` (datetime, optional) — The date of the donation, as reported by the source. Expressed in RFC 3339 format.
- `grantor` (Grantor, optional) — The entity responsible for issuing a grant or payment to a recipient.
- `created_by` (DonationCreator, optional) — Who created the donation.
- `external_distribution_id` (string, optional) — The platform's identifier for the payout that carried this donation. Platforms such as Benevity batch many donations into one payout, so several donations can share the same value.
- `recipient` (DonationRecipient, optional) — The nonprofit the donation was made out to, as named by the source.
- `purpose` (string, optional) — A description of the donor's intent for the donation. This is useful to understand how the donor intended the donation to be used. For example, "Where needed most" or "General Operating Support" or "Specific Campaign".
- `note` (string, optional) — An informational note from the donor to the nonprofit about the donation. This may contain a message or other useful information that the donor wants to share with the nonprofit.
- `attribution` (DonationAttribution, optional) — How the donation is attributed to a donor.
- `initiation` (DonationInitiation, optional) — How and where the donor initiated the gift.
- `settlement` (DonationSettlement, optional) — How the funds are moving from the donor to the recipient.
- `donor_advised_fund_grant` (DafGrant, optional) — Details specific to Donor Advised Fund donations. Empty when the donation did not come from a DAF provider.
- `metadata` (map from string to any, optional) — Arbitrary key-value pairs recorded against the donation. Use this for reconciliation data, campaign identifiers, or other integration data.
- `corporate_match` (CorporateMatch, optional) — Details specific to matched donations. Empty when no corporate sponsor matched the donation.
- `properties` (list of PropertyAssignment, optional) — A list of custom properties for the donation.
- `artifacts` (list of Artifact, optional) — A list of source artifacts that were used to create the donation. These can include the raw source files (PDFs, CSVs, etc.) that were received from upstream platforms or systems.
- `updated_at` (datetime, optional) — The date and time when the donation was last updated.
- `canceled_at` (datetime, optional, nullable) — When the donation was canceled. If set, the donor's payment did not complete and the recipient did not receive the gift. Expressed in RFC 3339 format.
- `deleted_at` (datetime, optional, nullable) — When the donation was deleted or merged. Null for a live donation. `GET /v1/donations/{id}` still returns a deleted or merged donation, but `GET /v1/donations` (list) excludes it. Expressed in RFC 3339 format.
- `merged_into_donation_id` (string, optional, nullable) — The donation this one was merged into. Set only for a merged donation, as a donation ID. Null for a live or plain-deleted donation. Follow it to the donation that now holds the gift.
- `payment_status` (enum, optional) — The payment status of the donation. Indicates the current state of the payment lifecycle.
  - Allowed values: `INCOMING_TO_CHARIOT`, `INCOMING_OUTSIDE_CHARIOT`, `RECEIVED_IN_CHARIOT`, `RECEIVED_OUTSIDE_CHARIOT`, `CANCELED`
- `payment_source_id` (string, optional, deprecated) — Deprecated. Use `source_id`.
- `platform` (DonationPlatform, optional, deprecated) — Deprecated. Information about the platform that facilitated the donation. Empty when no platform facilitated the donation.

## Errors

### 400 Bad Request Error

The request is invalid or contains invalid parameters

- `type` (string, required) — A URI reference identifying the problem type.
- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code for this error.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.

### 401 Unauthorized Error

Unauthorized. The request is missing the security (OAuth2 Bearer token) requirements and the server is unable to verify the identify of the caller.

- `type` (string, required) — A URI reference identifying the problem type.
- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code for this error.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.

### 403 Forbidden Error

Access denied

- `type` (string, required) — A URI reference identifying the problem type.
- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code for this error.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.

### 404 Not Found Error

Resource Not Found

- `type` (string, required) — A URI reference identifying the problem type.
- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code for this error.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.

### 409 Conflict Error

The merge conflicts with the state of a donation. The problem `type` identifies the case.

- `type` (string, required) — A URI reference identifying the problem type.
- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code for this error.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.
- `resource_id` (string, optional) — The donation the merged input points at. Present when the problem type is `donation_merged`.

### 500 Internal Server Error

Internal Server Error

- `type` (string, required) — A URI reference identifying the problem type.
- `title` (string, required) — A short, human-readable summary of the problem type.
- `status` (integer, required) — The HTTP status code for this error.
- `detail` (string, required) — A human-readable explanation specific to this occurrence.

## Types

### ExchangeRate

An exchange rate from a donation's currency to a target currency.

- `target_currency` (string, required) — The [ISO 4217 code](https://en.wikipedia.org/wiki/ISO_4217) of the currency the rate converts into, usually USD.
- `value` (string, required) — The number of units of `target_currency` equal to one unit of the donation's `currency`, as a decimal string.

### Grantor

The entity responsible for issuing a grant or payment to a recipient.

- `organization_name` (string, optional) — The legal organization responsible for issuing the grant or payment.
- `program_name` (string, optional) — A specific program, initiative, or branded offering associated with the grantor organization through which the grant or payment is made.

### DonationCreator

Who created a donation.

- `name` (string, optional) — The name of the person, integration, or application that created the donation.

### DonationRecipient

The nonprofit a donation was made out to.

- `primary_name` (string, optional) — The name of the nonprofit recipient, usually its legal name.
- `secondary_name` (string, optional) — Another name for the recipient, such as the name it does business as.
- `address` (string, optional) — The recipient's address, as a single line.

### DonationAttribution

How the donation is attributed to a donor.

- `primary_donor` (Donor, optional) — The primary donor.
- `joint_donor` (JointDonor, optional) — A second donor jointly credited with the gift.

### DonationInitiation

A subhash describing where and how the donation was initiated by the donor before it reached Chariot.

- `initiated_at` (datetime, optional) — Time when the donation was initiated. Expressed in RFC 3339 format.
- `amount_initiated` (long, optional, nullable) — The amount the donor intended to give when they initiated the gift, in minor units of `currency`. This can differ from `amount_gross` if the gift changed before it settled.
- `channel` (enum, optional) — The DAFpay integration channel used to initiate the donation. - `INTEGRATED` - The donation was initiated through an integrated DAFpay instance where the DAF sponsor processes the grant electronically via the DAFpay network. - `UNINTEGRATED` - The donation was initiated through an unintegrated DAFpay flow where the donor completes the grant manually on the DAF sponsor's website (e.g., Luminate Online, standalone embeds). - `UNKNOWN` - It wasn't specified how the donation was initiated.
  - Allowed values: `INTEGRATED`, `UNINTEGRATED`, `UNKNOWN`
- `web_location_url` (string, optional) — The URL of the web location where the donation was initiated.
- `dafpay_tracking_id` (string, optional) — The tracking ID for the donation as generated by DAFpay.
- `form` (string, optional) — The form where the donor initiated the donation.
- `identifier` (string, optional) — The initiating platform's own identifier for the donation. Use it to reconcile the donation against records in the platform's system.
- `metadata` (map from string to string, optional) — Additional key-value pairs the platform captured when the donation was initiated.
- `frequency` (enum, optional, deprecated) — Deprecated. Use the donation's top-level `frequency`.
  - Allowed values: `ONE_TIME`, `MONTHLY`
- `fundraising_platform_name` (string, optional, deprecated) — Deprecated. Use `initiation.form`.
- `dafpay_form` (string, optional, deprecated) — Deprecated. Use `initiation.form`.
- `dafpay_metadata` (map from string to string, optional, deprecated) — Deprecated. Use `initiation.metadata`.

### DonationSettlement

How the funds moved from the donor to the recipient.

- `type` (enum, required) — Where the funds settled. - `chariot` — the funds arrived through a Chariot deposit. `deposit_id` and `settled_at` apply. - `external` — the funds arrived outside Chariot's rails, straight to the recipient.
  - Allowed values: `chariot`, `external`
- `received_at` (datetime, required) — When the funds were received by the recipient. Expressed in RFC 3339 format.
- `settled_at` (datetime, optional) — When the funds became available in the recipient's Chariot account. Only set when `type` is `chariot`. Expressed in RFC 3339 format.
- `deposit_id` (string, optional) — The identifier of the deposit that carried the funds. Only set when `type` is `chariot`.

### DafGrant

Grant details from a Donor-Advised Fund sponsor. The sponsor's name is on `grantor.organization_name`.

- `donor_fund_name` (string, optional) — The name of the donor's fund at the Donor Advised Fund sponsor, such as the Doe Family Fund.
- `sponsor_grant_id` (string, optional, deprecated) — Deprecated. Use `initiation.identifier`.
- `organization_name` (string, optional, deprecated) — Deprecated. Use `grantor.organization_name`.
- `program_name` (string, optional, deprecated) — Deprecated. Use `grantor.program_name`.

### CorporateMatch

Corporate match details for the donation.

- `match_amount` (long, optional) — The amount of the corporate match for the donation in minor units of the donation currency.
- `company_name` (string, optional) — The name of the company that matched the donation.
- `source` (string, optional) — The source of the corporate match.
- `program_name` (string, optional, deprecated) — Deprecated.

### PropertyAssignment

A property assignment is a key-value pair that is associated with a donation.

- `property_id` (string, optional) — The unique identifier for the property.
- `value` (PropertyValue, optional)

### Artifact

An artifact is a source file that was used to create the donation.

- `name` (string, optional) — The name of the artifact.
- `file_id` (string, optional) — The unique identifier for the file that the artifact is associated with.
- `created_at` (datetime, optional) — The date and time when the artifact was created.
- `id` (string, optional, deprecated) — Deprecated. The unique identifier for the artifact.

### DonationPlatform

Deprecated. Information about the platform that facilitated the donation. Empty when no platform facilitated the donation.

- `name` (string, optional) — The name of the platform.
- `platform_grant_id` (string, optional) — The identifier for the grant within the platform's system.
- `metadata` (map from string to string, optional) — Additional key value pairs that were passed to the platform during the donation initiation.
- `acceptance` (PlatformAcceptance, optional) — Information about the acceptance of the grant from the platform. This is only present if the platform requires grant acceptance before disbursing funds.

### Donor

The donor information for the transaction

- `full_name` (string, optional) — The full name of the donor. Maximum length: 255 characters.
- `first_name` (string, optional) — The first name of the donor. Maximum length: 255 characters.
- `last_name` (string, optional) — The last name of the donor. Maximum length: 255 characters.
- `email` (string, optional) — The email address of the donor. Maximum length: 255 characters.
- `phone` (string, optional) — The phone number of the donor. Maximum length: 20 characters.
- `address` (Address, optional)

### JointDonor

The name of a second donor jointly credited with a gift.

- `full_name` (string, optional) — The full name of the donor. Maximum length: 255 characters.
- `first_name` (string, optional) — The first name of the donor. Maximum length: 255 characters.
- `last_name` (string, optional) — The last name of the donor. Maximum length: 255 characters.

### PropertyValue

- `type` (enum, required) — The data type of a property.
  - Allowed values: `text`, `enum`, `user`, `boolean`, `date`
- `text_value` (string, optional) — The text value of the property.
- `enum_value_id` (string, optional) — The unique identifier for the enum value.
- `user_value_id` (string, optional) — The unique identifier for the user.
- `boolean_value` (boolean, optional) — The boolean value of the property.
- `date_value` (datetime, optional) — The date value of the property.
- `empty` (boolean, optional) — Whether the property value is empty. Can use this to unset property values when assigning a property.

### PlatformAcceptance

Information about the acceptance of the grant from the platform.

- `accepted` (boolean, optional) — Whether the grant was accepted from the platform.
- `expires_at` (datetime, optional) — The date and time when the acceptance of the grant will expire.

### Address

- `city` (string, required) — City, district, suburb, town, or village. Maximum length: 255 characters.
- `country` (string, required) — Two-letter country code (https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2)
- `line1` (string, required) — Address line 1 (e.g. street, PO Box, or company name). Maximum length: 255 characters.
- `postal_code` (string, required) — ZIP or postal code. Maximum length: 40 characters.
- `state` (string, required) — State, county, province, or region
- `line2` (string, optional) — Address line 2 (e.g. apartment, suite, unit, or building). Maximum length: 255 characters.

## Examples

**Request**

```json
{
  "from": "donation_01j8rs605a4gctmbm58d87mvsj",
  "into": "donation_01j8rs605a4gctmbm58d87mvsj"
}
```

**Response**

```json
{
  "id": "donation_01j8rs605a4gctmbm58d87mvsj",
  "amount_gross": 25000,
  "amount_net": 25000,
  "amount_fee": 0,
  "currency": "USD",
  "created_at": "2026-09-25T14:00:00Z",
  "external_id": "INV-12345",
  "source_id": "source_01m12tn300eh20gdqscje7s5jw",
  "individual_gift_amount": 25000,
  "donation_type": "daf",
  "frequency": "one_time",
  "effective_date": "2026-09-24T00:00:00Z",
  "grantor": {
    "organization_name": "Fidelity Charitable"
  },
  "created_by": {
    "name": "Chariot Data Sync"
  },
  "purpose": "Where needed most",
  "note": "Please dedicate in memory of grandma",
  "attribution": {
    "primary_donor": {
      "full_name": "Jane Rivera",
      "first_name": "Jane",
      "last_name": "Rivera",
      "email": "jrivera@example.com",
      "phone": "415-555-1212",
      "address": {
        "city": "New York",
        "country": "US",
        "line1": "123 Main St.",
        "postal_code": "10001",
        "state": "NY"
      }
    }
  },
  "initiation": {
    "initiated_at": "2026-09-20T15:04:05Z",
    "amount_initiated": 25000,
    "channel": "INTEGRATED",
    "web_location_url": "https://givebutter.com/example-nonprofit",
    "dafpay_tracking_id": "L9E182VBGP",
    "form": "Givebutter",
    "identifier": "L9E182VBGP",
    "metadata": {
      "campaign_id": "spring-appeal"
    }
  },
  "settlement": {
    "type": "chariot",
    "received_at": "2026-09-25T14:00:00Z",
    "settled_at": "2026-09-25T18:00:00Z",
    "deposit_id": "deposit_01j8rs605a4gctmbm58d87mvsj"
  },
  "donor_advised_fund_grant": {
    "donor_fund_name": "The Rivera Family Fund"
  },
  "metadata": {
    "crm_id": "0035e00000ABCDE"
  },
  "properties": [
    {
      "property_id": "prop_01j8rs605a4gctmbm58d87mvsj",
      "value": {
        "type": "text",
        "text_value": "Fall Gala"
      }
    }
  ],
  "artifacts": [
    {
      "name": "grant_letter.pdf",
      "file_id": "file_01j8rs605a4gctmbm58d87mvsj",
      "created_at": "2026-09-25T14:00:00Z"
    }
  ],
  "updated_at": "2026-09-25T18:00:00Z",
  "canceled_at": null,
  "deleted_at": null,
  "merged_into_donation_id": null,
  "payment_status": "RECEIVED_IN_CHARIOT",
  "payment_source_id": "payment_source_01m12tn300eh20gdqscje7s5jw"
}
```